aboutsummaryrefslogtreecommitdiff
path: root/11/main.y
diff options
context:
space:
mode:
Diffstat (limited to '11/main.y')
-rw-r--r--11/main.y76
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"
5int yylex();
6int yyerror(char *);
7int 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%%
19primary_expr: NUM
20 | ID
21 ;
22
23postfix_expr: postfix_expr INC
24 | postfix_expr DEC
25 | primary_expr
26 ;
27
28unary_expr: INC unary_expr
29 | DEC unary_expr
30 | postfix_expr
31 ;
32
33boolean_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
41assignment_expr: unary_expr ASSIGN unary_expr
42 | unary_expr ASSIGN boolean_expr
43 ;
44
45expression: unary_expr
46 | boolean_expr
47 | assignment_expr
48 ;
49
50block: '{' statement block_cont
51 ;
52block_cont: statement block_cont
53 | '}'
54 ;
55
56statement: expression ENDL
57 | block
58 | for_expr {loop_count++;}
59 | ENDL
60 ;
61
62for_expr: FOR '(' statement statement expression ')' statement
63 | FOR '(' statement statement ')' statement
64 ;
65
66%%
67
68int main() {
69 yyparse();
70 printf("valid expression, nested %d", loop_count);
71}
72
73int yyerror(char *s) {
74 printf("error: %s", s);
75 exit(0);
76}