diff options
Diffstat (limited to '11/main.y')
-rw-r--r-- | 11/main.y | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/11/main.y b/11/main.y new file mode 100644 index 0000000..9ed51a0 --- /dev/null +++ b/11/main.y | |||
@@ -0,0 +1,76 @@ | |||
1 | %{ | ||
2 | #include <stdio.h> | ||
3 | #include <stdlib.h> | ||
4 | #include "lex.yy.cc" | ||
5 | int yylex(); | ||
6 | int yyerror(char *); | ||
7 | int loop_count = 0; | ||
8 | %} | ||
9 | |||
10 | %token ADD SUB MUL DIV INC DEC | ||
11 | %token LT GT LTE GTE EQ NEQ ASSIGN | ||
12 | %token FOR | ||
13 | %token ENDL | ||
14 | %token NUM ID | ||
15 | |||
16 | %start statement | ||
17 | |||
18 | %% | ||
19 | primary_expr: NUM | ||
20 | | ID | ||
21 | ; | ||
22 | |||
23 | postfix_expr: postfix_expr INC | ||
24 | | postfix_expr DEC | ||
25 | | primary_expr | ||
26 | ; | ||
27 | |||
28 | unary_expr: INC unary_expr | ||
29 | | DEC unary_expr | ||
30 | | postfix_expr | ||
31 | ; | ||
32 | |||
33 | boolean_expr: unary_expr LT unary_expr | ||
34 | | unary_expr GT unary_expr | ||
35 | | unary_expr LTE unary_expr | ||
36 | | unary_expr GTE unary_expr | ||
37 | | unary_expr EQ unary_expr | ||
38 | | unary_expr NEQ unary_expr | ||
39 | ; | ||
40 | |||
41 | assignment_expr: unary_expr ASSIGN unary_expr | ||
42 | | unary_expr ASSIGN boolean_expr | ||
43 | ; | ||
44 | |||
45 | expression: unary_expr | ||
46 | | boolean_expr | ||
47 | | assignment_expr | ||
48 | ; | ||
49 | |||
50 | block: '{' statement block_cont | ||
51 | ; | ||
52 | block_cont: statement block_cont | ||
53 | | '}' | ||
54 | ; | ||
55 | |||
56 | statement: expression ENDL | ||
57 | | block | ||
58 | | for_expr {loop_count++;} | ||
59 | | ENDL | ||
60 | ; | ||
61 | |||
62 | for_expr: FOR '(' statement statement expression ')' statement | ||
63 | | FOR '(' statement statement ')' statement | ||
64 | ; | ||
65 | |||
66 | %% | ||
67 | |||
68 | int main() { | ||
69 | yyparse(); | ||
70 | printf("valid expression, nested %d", loop_count); | ||
71 | } | ||
72 | |||
73 | int yyerror(char *s) { | ||
74 | printf("error: %s", s); | ||
75 | exit(0); | ||
76 | } | ||