#ifndef PARSER_H #define PARSER_H #include "lexer.h" #include #include #include 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