1
1
#include <stddef.h>
2
+ #include <stdio.h>
3
+ #include <stdlib.h>
2
4
#include "parser.h"
3
5
#include "visitors/deleter_visitor.h"
4
6
7
+ static jade_token next_token (jade_parser * parser );
8
+ static void check_token (jade_parser * parser , jade_token_kind expected );
9
+ static void expect_token (jade_parser * parser , jade_token_kind expected );
10
+ static void syntax_error (jade_parser * parser , jade_token_kind expected , jade_token_kind got );
11
+
12
+ static jade_program * parse_program (jade_parser * parser , ast_node * parent );
13
+ static jade_global_definition_list * parse_global_definition_list (jade_parser * parser , ast_node * parent );
14
+ static void parse_global_definition (jade_parser * parser , jade_global_definition_list * global_definition_list , jade_identifier * target );
15
+ static jade_identifier * parse_identifier (jade_parser * parser , ast_node * parent );
16
+ static jade_function_definition * parse_function_definition (jade_parser * parser , ast_node * parent , jade_identifier * target );
17
+ static jade_variable_definition * parse_variable_definition (jade_parser * parser , ast_node * parent , jade_identifier * target );
18
+ static jade_expression_list * parse_expression_list (jade_parser * parser , ast_node * parent );
19
+ static ast_node * parse_expression (jade_parser * parser , ast_node * parent );
20
+
5
21
void jade_parser_init (jade_parser * parser , jade_scanner * scanner ) {
6
22
parser -> scanner = scanner ;
7
23
parser -> ast = NULL ;
@@ -11,7 +27,179 @@ void jade_parser_destroy(jade_parser* parser) {
11
27
accept_deleter_visitor (parser -> ast );
12
28
}
13
29
14
- jade_program * jade_parser_parse (jade_scanner * scanner ) {
15
- // TODO: implement
16
- return NULL ;
30
+ void jade_parser_parse (jade_parser * parser ) {
31
+ parser -> ast = parse_program (parser , (ast_node * )parser -> ast );
32
+ printf ("\nPARSED PROGRAM" );
33
+ }
34
+
35
+
36
+
37
+
38
+ static jade_program * parse_program (jade_parser * parser , ast_node * parent ) {
39
+ jade_program * program = malloc (sizeof (jade_program ));
40
+ program -> kind = JADE_AST_KIND_PROGRAM ;
41
+ program -> parent = parent ;
42
+
43
+ // (
44
+ expect_token (parser , JADE_TOKEN_KIND_LPAREN );
45
+
46
+ if (next_token (parser ).kind != JADE_TOKEN_KIND_RPAREN ) {
47
+ program -> definitions = parse_global_definition_list (parser , (ast_node * )program );
48
+ }
49
+
50
+ // )
51
+ expect_token (parser , JADE_TOKEN_KIND_RPAREN );
52
+
53
+ // ,(
54
+ expect_token (parser , JADE_TOKEN_KIND_DELIMITER );
55
+ expect_token (parser , JADE_TOKEN_KIND_LPAREN );
56
+
57
+ if (next_token (parser ).kind != JADE_TOKEN_KIND_RPAREN ) {
58
+ //program->expressions;
59
+ }
60
+
61
+ // )
62
+ check_token (parser , JADE_TOKEN_KIND_RPAREN );
63
+
64
+ // EOF
65
+ expect_token (parser , JADE_TOKEN_KIND_EOF );
66
+
67
+ return program ;
68
+ }
69
+
70
+ static jade_global_definition_list * parse_global_definition_list (jade_parser * parser , ast_node * parent ) {
71
+ jade_global_definition_list * global_definition_list = malloc (sizeof (jade_global_definition_list ));
72
+ global_definition_list -> kind = JADE_AST_KIND_GLOBAL_DEFINITION_LIST ;
73
+ global_definition_list -> parent = parent ;
74
+
75
+ // f
76
+ check_token (parser , JADE_TOKEN_KIND_IDENTIFIER );
77
+ jade_identifier * target = parse_identifier (parser , NULL );
78
+ parse_global_definition (parser , global_definition_list , target );
79
+
80
+
81
+ while (next_token (parser ).kind == JADE_TOKEN_KIND_DELIMITER ) {
82
+ parse_global_definition (parser , global_definition_list , target );
83
+ }
84
+
85
+ check_token (parser , JADE_TOKEN_KIND_RPAREN );
86
+
87
+
88
+ return global_definition_list ;
89
+ }
90
+
91
+ static void parse_global_definition (jade_parser * parser , jade_global_definition_list * global_definition_list , jade_identifier * target ) {
92
+ jade_token_kind kind = next_token (parser ).kind ;
93
+ if (kind == JADE_TOKEN_KIND_LPAREN ) {
94
+ if (global_definition_list -> first ) {
95
+ global_definition_list -> last = (jade_node * )parse_function_definition (parser , (ast_node * )global_definition_list , target );
96
+ global_definition_list -> first -> next = global_definition_list -> last ;
97
+ } else {
98
+ global_definition_list -> first = (jade_node * )parse_function_definition (parser , (ast_node * )global_definition_list , target );
99
+ global_definition_list -> last = global_definition_list -> first ;
100
+ }
101
+ } else if (kind == JADE_TOKEN_KIND_DEFINE ) {
102
+ //global_definition_list->first = (jade_node*)parse_variable_definition(parser, (ast_node*)global_definition_list, target);
103
+ } else {
104
+ syntax_error (parser , JADE_TOKEN_KIND_LPAREN , parser -> token .kind );
105
+ syntax_error (parser , JADE_TOKEN_KIND_DEFINE , parser -> token .kind );
106
+ }
107
+ }
108
+
109
+ static jade_function_definition * parse_function_definition (jade_parser * parser , ast_node * parent , jade_identifier * target ) {
110
+ jade_function_definition * function_definition = malloc (sizeof (jade_function_definition ));
111
+ function_definition -> kind = JADE_AST_KIND_FUNCTION_DEFINITION ;
112
+ function_definition -> parent = parent ;
113
+ function_definition -> target = target ;
114
+ target -> parent = (ast_node * )function_definition ;
115
+
116
+ function_definition -> parameters = parse_expression_list (parser , (ast_node * )function_definition );
117
+
118
+ return function_definition ;
119
+ }
120
+
121
+ static jade_expression_list * parse_expression_list (jade_parser * parser , ast_node * parent ) {
122
+ jade_expression_list * expression_list = malloc (sizeof (jade_expression_list ));
123
+ expression_list -> kind = JADE_AST_KIND_EXPRESSION_LIST ;
124
+ expression_list -> parent = parent ;
125
+
126
+ while (parser -> token .kind != JADE_TOKEN_KIND_RPAREN ) {
127
+ if (expression_list -> first ) {
128
+ expression_list -> last = (jade_node * )parse_expression (parser , (ast_node * )expression_list );
129
+ expression_list -> first -> next = expression_list -> last ;
130
+ } else {
131
+ expression_list -> first = (jade_node * )parse_expression (parser , (ast_node * )expression_list );
132
+ expression_list -> last = expression_list -> first ;
133
+ }
134
+ while (parser -> token .kind == JADE_TOKEN_KIND_DELIMITER ) {
135
+ if (expression_list -> first ) {
136
+ expression_list -> last = (jade_node * )parse_expression (parser , (ast_node * )expression_list );
137
+ expression_list -> first -> next = expression_list -> last ;
138
+ } else {
139
+ expression_list -> first = (jade_node * )parse_expression (parser , (ast_node * )expression_list );
140
+ expression_list -> last = expression_list -> first ;
141
+ }
142
+ }
143
+ }
144
+
145
+ return expression_list ;
146
+ }
147
+
148
+ static ast_node * parse_expression (jade_parser * parser , ast_node * parent ) {
149
+
150
+ while (parser -> token .kind != JADE_TOKEN_KIND_DELIMITER || parser -> token .kind != JADE_TOKEN_KIND_RPAREN ) {
151
+ next_token (parser );
152
+ if (parser -> token .kind == JADE_TOKEN_KIND_IDENTIFIER ) {
153
+
154
+ }
155
+ }
156
+ }
157
+
158
+
159
+ static jade_identifier * parse_identifier (jade_parser * parser , ast_node * parent ) {
160
+ jade_identifier * identifier = malloc (sizeof (jade_identifier ));
161
+ identifier -> kind = JADE_AST_KIND_IDENTIFIER ;
162
+ identifier -> parent = parent ;
163
+ identifier -> name = malloc (parser -> token .size + 1 );
164
+ jade_lexeme (parser -> scanner , & parser -> token , identifier -> name );
165
+
166
+ return identifier ;
167
+ }
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+ static jade_token next_token (jade_parser * parser ) {
177
+ char lexeme [64 ];
178
+ jade_lexeme (parser -> scanner , & parser -> token , lexeme );
179
+ printf ("%s" , lexeme );
180
+
181
+ parser -> token = jade_scan (parser -> scanner );
182
+ return parser -> token ;
183
+ }
184
+
185
+ static void check_token (jade_parser * parser , jade_token_kind expected ) {
186
+ if (parser -> token .kind != expected )
187
+ syntax_error (parser , expected , parser -> token .kind );
17
188
}
189
+
190
+ static void expect_token (jade_parser * parser , jade_token_kind expected ) {
191
+ next_token (parser );
192
+ check_token (parser , expected );
193
+ }
194
+
195
+ static void syntax_error (jade_parser * parser , jade_token_kind expected , jade_token_kind got ) {
196
+ fprintf (
197
+ stderr ,
198
+ "%s:%ld:%ld: expected: %s got: %s\n" ,
199
+ parser -> scanner -> path ,
200
+ parser -> scanner -> line ,
201
+ parser -> scanner -> column ,
202
+ jade_token_kind_name (expected ),
203
+ jade_token_kind_name (got )
204
+ );
205
+ }
0 commit comments