wacc/parser.h
SimonFJ20 96c7fc0f7d asd
2023-02-19 03:53:05 +01:00

131 lines
2.8 KiB
C

#ifndef PARSER_H
#define PARSER_H
#include "lexer.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
typedef enum {
ParsedNodeTypeError,
ParsedNodeTypeInt,
ParsedNodeTypeFloat,
ParsedNodeTypeChar,
ParsedNodeTypeString,
ParsedNodeTypeBool,
ParsedNodeTypeArray,
ParsedNodeTypeDict,
ParsedNodeTypeIf,
ParsedNodeTypeWhile,
ParsedNodeTypeLoop,
ParsedNodeTypeFor,
ParsedNodeTypeCall,
ParsedNodeTypeAccess,
ParsedNodeTypeIndex,
ParsedNodeTypeUnary,
ParsedNodeTypeBinary,
ParsedNodeTypeAssign,
ParsedNodeTypeRangeFrom,
ParsedNodeTypeRangeTo,
ParsedNodeTypeRangeFromTo,
} ParsedNodeType;
typedef enum {
ParsedBinaryTypeAdd,
ParsedBinaryTypeSubtract,
ParsedBinaryTypeMultiply,
ParsedBinaryTypeDivide,
ParsedBinaryTypeModulus,
ParsedBinaryTypeAnd,
ParsedBinaryTypeOr,
ParsedBinaryTypeContains,
ParsedBinaryTypeNotContains,
} ParsedBinaryType;
typedef enum {
ParsedUnaryTypeNot,
ParsedUnaryTypeReference,
ParsedUnaryTypeDereference,
ParsedUnaryTypeNegate,
} ParsedUnaryType;
typedef enum {
ParsedAssignTypeAssign,
ParsedAssignTypeAdd,
ParsedAssignTypeSubtract,
ParsedAssignTypeMultiply,
ParsedAssignTypeDivide,
ParsedAssignTypeModulus,
} ParsedAssignType;
typedef struct KeyValuePair KeyValuePair;
typedef struct ParsedNode ParsedNode;
struct ParsedNode {
ParsedNodeType type;
union {
int64_t int_value;
double float_value;
char char_value;
struct {
char* value;
size_t length;
} string;
bool bool_value;
struct {
ParsedNode* values;
size_t length;
} array;
struct {
KeyValuePair* pairs;
size_t length;
} dict;
struct {
ParsedNode* condition;
ParsedNode* truthy;
ParsedNode* falsy;
} if_node;
struct {
ParsedNode* condition;
ParsedNode* body;
} while_node;
struct {
ParsedNode* body;
} loop;
struct {
ParsedNode* subject;
ParsedNode* value;
ParsedNode* body;
} for_node;
struct {
ParsedNode* subject;
ParsedNode* arguments;
size_t arguments_length;
} call;
struct {
ParsedNode* subject;
ParsedNode* value;
} access;
struct {
ParsedNode* subject;
ParsedNode* value;
} index;
};
};
struct KeyValuePair {
char* key;
size_t key_length;
ParsedNode* value;
};
typedef struct {
Lexer* lexer;
Token current;
} Parser;
void parser_create(Parser* parser, Lexer* lexer);
void parser_parse_expression(Parser* parser);
#endif