-
Notifications
You must be signed in to change notification settings - Fork 0
/
bookparser.c
67 lines (59 loc) · 1.06 KB
/
bookparser.c
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
/* parser.c */
#include "global.h"
int lookahead;
void match(int);
void factor(), term(), expr();
void parse() /* parses and translates expression list */
{
lookahead = lexan();
while (lookahead != DONE) {
expr (); match (';');
}
}
void expr()
{
int t;
term();
while(1)
switch (lookahead) {
case '+' : case '-' :
t = lookahead;
match(lookahead); term(); emit (t, NONE);
continue;
default:
return;
}
}
void term ()
{
int t;
factor ();
while(1)
switch (lookahead) {
case '*' : case '/' : case DIV: case MOD:
t= lookahead;
match(lookahead); factor(); emit (t, NONE);
continue;
default:
return;
}
}
void factor ()
{
switch(lookahead) {
case '(' :
match('('); expr(); match(')'); break;
case NUM:
emit(NUM, token_value); match(NUM); break;
case ID:
emit(ID, token_value); match(ID); break;
default:
error("syntax error in factor");
}
}
void match(int t)
{
if (lookahead == t)
lookahead = lexan();
else error ("syntax error in match");
}