1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#pragma once
#include "compiler/lexer.h"
#include <stddef.h>
#include <stdint.h>
typedef enum ParserToken {
PARSER_TOKEN_ROOT,
PARSER_TOKEN_IDENTIFIER,
PARSER_TOKEN_VALUE_U64,
PARSER_TOKEN_TYPE_TYPE,
PARSER_TOKEN_TYPE_FUNCTION,
PARSER_TOKEN_TYPE_VOID,
PARSER_TOKEN_TYPE_U64,
PARSER_TOKEN_KEYWORD_PRINT_U64,
PARSER_TOKEN_CONSTANT,
PARSER_TOKEN_SYMBOL_EOL,
PARSER_TOKEN_SYMBOL_CURLY_BRACKET,
PARSER_TOKEN_SYMBOL_PARENTHESIS,
PARSER_TOKEN_SYMBOL_COMMA,
PARSER_TOKEN_FUNCTION_DEFINITION,
PARSER_TOKEN_FUNCTION_CALL,
PARSER_TOKEN_NONE,
} ParserToken;
extern const char *PARSER_TOKEN_STRINGS[];
typedef struct ParserOrder {
bool ltr;
size_t size;
LexerToken data[8];
} ParserOrder;
typedef struct ParserNode {
ParserToken token;
char *str_begin;
char *str_end;
void *metadata;
struct ParserNode *parent;
} ParserNode;
typedef struct ParserNodeTypeFunctionMetadata {
ParserNode *arguments;
ParserNode *returnType;
} ParserNodeTypeFunctionMetadata;
typedef struct ParserNodeVariableMetadata {
ParserNode *name;
ParserNode *type;
ParserNode *value;
} ParserNodeVariableMetadata;
typedef struct ParserNodeFunctionDefnitionMetadata {
ParserNode *arguments;
ParserNode *returnType;
ParserNode *body;
} ParserNodeFunctionDefnitionMetadata;
typedef struct ParserNodeArray {
ParserNode **data;
size_t size;
} ParserNodeArray;
typedef struct ParserNodeFunctionCall {
ParserNode *function;
ParserNodeArray *params;
} ParserNodeFunctionCall;
typedef ParserNode ParserNodeSingleChildMetadata;
typedef uint64_t ParserNodeU64Metadata;
void parserNodePrint(const ParserNode *node, int indent);
void parserNodeDelete(ParserNode *node);
ParserNode *parser(LexerNodeArray lexed);
bool parserNodeArray(LexerNode *begin, LexerNode *end, ParserNode *parent);
ParserNode *newParserNode(ParserToken token, char *str_begin, char *str_end,
void *metadata, ParserNode *parent);
ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
ParserNode *parent);
ParserNode *getUntilCommonParent(ParserNode *node, ParserNode *parent);
ParserNode *parserIdentifier(LexerNode *node, ParserNode *parent);
ParserNode *parserType(LexerNode *node, ParserNode *parent);
ParserNode *parserVoid(LexerNode *node, ParserNode *parent);
ParserNode *parserU64(LexerNode *node, ParserNode *parent);
ParserNode *parserPrintU64(LexerNode *node, LexerNode *end, ParserNode *parent);
ParserNode *parserNumber(LexerNode *node, ParserNode *parent);
ParserNode *parserEol(LexerNode *node, LexerNode *begin, ParserNode *parent);
ParserNode *parserComma(LexerNode *node, LexerNode *begin, ParserNode *parent);
ParserNode *parserParenthesis(LexerNode *closing, LexerNode *begin,
ParserNode *parent);
ParserNode *parserCurlyBrackets(LexerNode *closing, LexerNode *begin,
ParserNode *parent);
ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
ParserNode *parent);
ParserNode *parserVariable(LexerNode *node, LexerNode *begin, LexerNode *end,
ParserNode *parent);
bool isAllArguments(const ParserNodeArray *nodes);
bool isExpression(ParserNode *node);
bool isType(ParserNode *node);
bool isValue(ParserNode *node);
|