aboutsummaryrefslogtreecommitdiff
path: root/12/main.y
diff options
context:
space:
mode:
Diffstat (limited to '12/main.y')
-rw-r--r--12/main.y112
1 files changed, 112 insertions, 0 deletions
diff --git a/12/main.y b/12/main.y
new file mode 100644
index 0000000..5431c55
--- /dev/null
+++ b/12/main.y
@@ -0,0 +1,112 @@
1%{
2#include <stdio.h>
3#include <stdlib.h>
4int yylex();
5int yyerror(char *);
6%}
7
8%token ADD SUB MUL DIV INC DEC
9%token LT GT LTE GTE EQ NEQ ASSIGN
10%token VOID INT DOUBLE FLOAT CHAR
11%token LONG UNSIGNED
12%token COMMA LPAREN RPAREN LBRACE RBRACE
13%token ENDL
14%token FOR RET IF ELSE WHILE
15%token NUM ID
16
17%start function_definition
18
19%%
20type_modifier: LONG
21 | UNSIGNED
22 ;
23
24type_specifier: VOID
25 | CHAR
26 | INT
27 | FLOAT
28 | DOUBLE
29 | type_modifier type_specifier
30 ;
31
32argument: type_specifier ID
33 ;
34
35argument_list: argument
36 | argument COMMA argument_list
37 ;
38
39primary_expr: NUM
40 | ID
41 ;
42
43postfix_expr: postfix_expr INC
44 | postfix_expr DEC
45 | primary_expr
46 ;
47
48unary_expr: INC unary_expr
49 | DEC unary_expr
50 | postfix_expr
51 ;
52
53boolean_expr: unary_expr LT unary_expr
54 | unary_expr GT unary_expr
55 | unary_expr LTE unary_expr
56 | unary_expr GTE unary_expr
57 | unary_expr EQ unary_expr
58 | unary_expr NEQ unary_expr
59 ;
60
61assignment_expr: unary_expr ASSIGN unary_expr
62 | unary_expr ASSIGN boolean_expr
63 ;
64
65expression: unary_expr
66 | boolean_expr
67 | assignment_expr
68 ;
69
70for_expr: FOR LPAREN statement statement expression RPAREN statement
71 | FOR LPAREN statement statement RPAREN statement
72 ;
73
74while_expr: WHILE LPAREN expression RPAREN block
75 | WHILE LPAREN RPAREN block
76 ;
77
78if_expr: IF LPAREN expression RPAREN block
79 | IF LPAREN expression RPAREN block ELSE block
80 | IF LPAREN expression RPAREN block ELSE if_expr
81 ;
82
83block: LBRACE statement block_cont
84 ;
85
86block_cont: statement block_cont
87 | RBRACE
88 ;
89
90statement: RET expression ENDL
91 | expression ENDL
92 | block
93 | for_expr
94 | if_expr
95 | while_expr
96 | ENDL
97 ;
98
99function_definition: argument LPAREN argument_list RPAREN block
100 | argument LPAREN RPAREN block
101 ;
102%%
103
104int main() {
105 yyparse();
106 printf("valid expression");
107}
108
109int yyerror(char *s) {
110 printf("error: %s", s);
111 exit(0);
112}