Skip to content

Commit 5dcfd79

Browse files
authored
Merge pull request #1 from um-ar/wip
merge changes
2 parents 1f866ce + 3767237 commit 5dcfd79

File tree

7 files changed

+232
-7
lines changed

7 files changed

+232
-7
lines changed

include/ast.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ typedef struct jade_expression_list {
4444
jade_ast_kind kind;
4545
ast_node* parent;
4646
jade_node* first;
47-
jade_node* last;
47+
jade_node* last;
4848
} jade_expression_list;
4949

5050
typedef struct jade_program {

include/parser.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
typedef struct jade_parser {
77
jade_scanner* scanner;
88
jade_program* ast;
9+
jade_token token;
910
} jade_parser;
1011

1112
void jade_parser_init(jade_parser* parser, jade_scanner* scanner);
1213
void jade_parser_destroy(jade_parser* parser);
13-
jade_program* jade_parser_parse(jade_scanner* scanner);
14+
void jade_parser_parse(jade_parser* parser);

src/main.c

+24-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#include <stdio.h>
22
#include <stdlib.h>
33
#include "scanner.h"
4+
#include "parser.h"
45

6+
/*
57
int test_scanner(int argc, char** argv) {
68
if (argc < 2) {
79
fprintf(stderr, "USAGE: jadec file\n");
@@ -29,8 +31,29 @@ int test_scanner(int argc, char** argv) {
2931
jade_scanner_destroy(&scanner);
3032
return EXIT_SUCCESS;
3133
}
34+
*/
35+
36+
int test_parser(int argc, char** argv) {
37+
if (argc < 2) {
38+
fprintf(stderr, "USAGE: jadec file\n");
39+
exit(EXIT_FAILURE);
40+
}
41+
42+
jade_scanner scanner;
43+
jade_scanner_init(&scanner, argv[1]);
44+
//jade_scanner_destroy(&scanner);
45+
46+
jade_parser parser;
47+
jade_parser_init(&parser, &scanner);
48+
jade_parser_parse(&parser);
49+
50+
//printf("%s\n", parser.scanner->source);
51+
52+
return EXIT_SUCCESS;
53+
}
3254

3355

3456
int main(int argc, char** argv) {
35-
return test_scanner(argc, argv);
57+
//return test_scanner(argc, argv);
58+
return test_parser(argc, argv);
3659
}

src/parser.c

+191-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,23 @@
11
#include <stddef.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
24
#include "parser.h"
35
#include "visitors/deleter_visitor.h"
46

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+
521
void jade_parser_init(jade_parser* parser, jade_scanner* scanner) {
622
parser->scanner = scanner;
723
parser->ast = NULL;
@@ -11,7 +27,179 @@ void jade_parser_destroy(jade_parser* parser) {
1127
accept_deleter_visitor(parser->ast);
1228
}
1329

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);
17188
}
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+
}

test/scanner.jd

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@
1010
pi := 2, f(g(pi))
1111
),
1212
f(g(k + pi))
13-
)
13+
)

test/test.jd

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
fffffffffffffffffffffffff
2+
ffffffffffffffffffffffffff
3+
ffffffffffffffffffffffffff
4+
fffffffffffffffffffffffff
5+
asd
6+
as ! $ %$@$@ $@$ ^ 21312321

test/test_program.jd

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
(
2+
f(x,y)
3+
),
4+
5+
(
6+
7+
)

0 commit comments

Comments
 (0)