arm64: codea/abgabe_aa.0
[uebersetzerbau-ss10.git] / parser / parser.y
1 %{
2         #include <stdio.h>
3         #include <stdlib.h>
4 %}
5
6 %start Program
7 %token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS
8 %token IDENT NUM
9
10 %%
11
12 Program:
13           Methoddef ';' Program
14         | Structdef ';' Program
15         |
16         ;
17
18 Structdef:
19           STRUCT Idents END
20         ;
21
22 Methoddef:
23           METHOD IDENT '(' Idents ')' Statseq END
24         ;
25
26 Idents:
27           IDENT Idents
28         |
29         ;
30
31 Statseq:
32           Statement ';' Statseq
33         |
34         ;
35
36 Statement:
37           Lexpr ':=' Expr
38         | VAR IDENT ':=' Expr
39         | Expr
40         | IF Expr THEN Statseq END
41         | IF Expr THEN Statseq ELSE Statseq END
42         | WHILE Expr DO Statseq END
43         | RETURN Expr
44         ;
45
46 Lexpr:
47           IDENT
48         | Term '.' IDENT
49         ;
50
51 Expr:
52           Term
53         | NOT Term
54         | Term Minusterm
55         | Term Multerm
56         | Term Orterm
57         | Term '<' Term
58         | Term '=' Term
59         ;
60
61 Minusterm:
62           '-' Term Minusterm
63         | '-' Term
64         ;
65
66 Multerm:
67           '*' Term Multerm
68         | '*' Term
69         ;
70
71 Orterm:
72           OR Term Orterm
73         | OR Term
74         ;
75
76
77 Term:
78           '(' Expr ')'
79         | NUM
80         | '-' NUM
81         | THIS
82         | IDENT
83         | Term '.' IDENT
84         | IDENT '(' Exprs ')'
85         | Term '.' IDENT '(' Exprs ')'
86         ;
87
88 Exprs:
89           Expr ',' Exprs
90         | Expr
91         |
92         ;
93
94 %%
95
96 extern int yylex();
97 extern int yylineno;
98
99 int yyerror(char *error_text)
100 {
101         fprintf(stderr,"Zeile %i: %s\n", yylineno, error_text);
102         exit(2);
103 }
104
105 int main(int argc, char **argv)
106 {
107         #if 0
108         yydebug=1;
109         #endif
110         yyparse();
111         return 0;
112 }
113