-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Open
Description
What I got
# make test2
cc -o parser2 -g expr2.c interp.c main.c scan.c tree.c
(./parser2 input01; \
./parser2 input02; \
./parser2 input03; \
./parser2 input04; \
./parser2 input05)
15
29
syntax error on line 1, token 1
Unrecognised character . on line 3
Unrecognised character a on line 1
And what is in Readme
Lines 392 to 414 in 14e9397
$ make test | |
(./parser input01; \ | |
./parser input02; \ | |
./parser input03; \ | |
./parser input04; \ | |
./parser input05) | |
15 # input01 result | |
29 # input02 result | |
syntax error on line 1, token 5 # input03 result | |
Unrecognised character . on line 3 # input04 result | |
Unrecognised character a on line 1 # input05 result | |
$ make test2 | |
(./parser2 input01; \ | |
./parser2 input02; \ | |
./parser2 input03; \ | |
./parser2 input04; \ | |
./parser2 input05) | |
15 # input01 result | |
29 # input02 result | |
syntax error on line 1, token 5 # input03 result | |
Unrecognised character . on line 3 # input04 result | |
Unrecognised character a on line 1 # input05 result |
The parser2's result on input03 is with a wrong token type, it should be 5, not 1. The following is the content of input03
12 34 + -56 * / - - 8 + * 2
Now the parse2 reports error on token +
whose enum value equals 1. It should reports on 34
instead, with enum value 5, because the position of which shoude be an operator.
Lines 96 to 105 in eabf90e
// Loop working on token at our level of precedence | |
while (1) { | |
// Fetch in the next integer literal | |
scan(&Token); | |
// Get the right sub-tree at a higher precedence than us | |
right = multiplicative_expr(); | |
// Join the two sub-trees with our low-precedence operator | |
left = mkastnode(arithop(tokentype), left, right, 0); |
On the preceding code, the operator is checked after parsing the right sub tree. I think the check action should be done first with this code to get a right result.
// Loop working on token at our level of precedence
while (1) {
// Check if the middle position is an operator
int precedence = arithop(tokentype);
// Fetch in the next integer literal
scan(&Token);
// Get the right sub-tree at a higher precedence than us
right = multiplicative_expr();
// Join the two sub-trees with our low-precedence operator
left = mkastnode(precedence, left, right, 0);
Metadata
Metadata
Assignees
Labels
No labels