forked from cop3402/toy1
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.c
More file actions
81 lines (65 loc) · 2.02 KB
/
parser.c
File metadata and controls
81 lines (65 loc) · 2.02 KB
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
#include "parser.h"
T_token lookahead_token;
T_token get_lookahead() {
return lookahead_token;
}
void next_token() {
lookahead_token = lex();
}
void parser_error() {
fprintf(stderr, "parser error\n");
exit(1);
}
T_statement_list parse_statement_list() {
T_statement statement = parse_statement();
if (get_lookahead()->kind == END) {
return create_statement_list(statement, NULL);
} else {
return create_statement_list(statement, parse_statement_list());
}
}
T_statement parse_statement() {
T_expression expression = parse_expression();
T_token semicolon = get_lookahead();
if (semicolon->kind != SEMICOLON) {
parser_error();
}
next_token();
return create_statement(expression);
}
T_expression parse_expression() {
T_token operand1 = get_lookahead();
if (operand1->kind != NUMBER) {
parser_error();
}
next_token();
T_token op = get_lookahead();
if (op->kind != OPERATOR) {
parser_error();
}
next_token();
T_token operand2 = get_lookahead();
if (operand2->kind != NUMBER) {
parser_error();
}
next_token();
return create_expression(operand1, op, operand2);
}
T_statement_list create_statement_list(T_statement statement, T_statement_list statement_list) {
T_statement_list new_statement_list = (T_statement_list)malloc(sizeof(*new_statement_list));
new_statement_list->statement = statement;
new_statement_list->statement_list = statement_list;
return new_statement_list;
}
T_statement create_statement(T_expression expression) {
T_statement new_statement = (T_statement)malloc(sizeof(*new_statement));
new_statement->expression = expression;
return new_statement;
}
T_expression create_expression(T_token operand1, T_token op, T_token operand2) {
T_expression new_expression = (T_expression)malloc(sizeof(*new_expression));
new_expression->operand1 = operand1;
new_expression->op = op;
new_expression->operand2 = operand2;
return new_expression;
}