-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlimbaj.y
More file actions
166 lines (130 loc) · 3.81 KB
/
limbaj.y
File metadata and controls
166 lines (130 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
%{
#include <iostream>
#include <string>
#include "SymTableHelp.h"
using namespace std;
extern int yylex();
extern int yylineno;
extern char* yytext;
extern FILE* yyin;
void yyerror(const char * s);
%}
%union {
std::string* Str;
};
%token BGIN END CLASS_BC NEW_BC FN_BC ACCES
%token IF_BC ELSE_BC WHILE_BC RETURN_BC PRINT_BC
%token ASSIGN_GIFT ATELIER_AND_COR DECORATIUNI_OR_COLINDE EQ_GIFTS NEQ_GIFTS LE_GIFTS GE_GIFTS LT GT
%token <Str> INT_BC FLOAT_BC STRING_BC BOOL_BC
%token <Str> ID_BC STRING_VAL BOOL_VAL_BC NR FLOAT_NR
%left DECORATIUNI_OR_COLINDE
%left ATELIER_AND_COR
%left EQ_GIFTS NEQ_GIFTS
%left LT GT LE_GIFTS GE_GIFTS
%left '+' '-'
%left '*' '/'
%left ACCES
%start progr
%%
progr : { SymTableHelp::Init(); } orice main_bc {
cout << "Sintaxa corecta. Mos Craciun a ajuns" << endl;
SymTableHelp::Clean();
}
;
orice: orice elem
|
;
elem : decl
| class_decl
| fn_decl
;
type : INT_BC { SymTableHelp::SetType("int_gift"); }
| FLOAT_BC { SymTableHelp::SetType("float_snow"); }
| STRING_BC { SymTableHelp::SetType("str_letter"); }
| BOOL_BC { SymTableHelp::SetType("bool"); }
;
return_type : type ;
decl : type list_variabile ';' ;
list_variabile : ID_BC { SymTableHelp::AddVar(*$1, "variabila"); }
| list_variabile ',' ID_BC { SymTableHelp::AddVar(*$3, "variabila"); }
;
class_decl : CLASS_BC ID_BC {
SymTableHelp::AddVar(*$2, "clasa");
SymTableHelp::EnterScope("Class_" + *$2);
}
'[' class_body ']' {
SymTableHelp::ExitScope();
}
;
class_body : class_body decl
| class_body fn_decl
|
;
header_fn: FN_BC return_type ID_BC {
SymTableHelp::AddVar(*$3, "functie");
SymTableHelp::EnterScope("Func_" + *$3);
}
;
fn_decl : header_fn '^' list_param '^' '[' fn_body ']' { SymTableHelp::ExitScope(); }
| header_fn '^' '^' '[' fn_body ']' { SymTableHelp::ExitScope(); }
;
list_param : param
| list_param ',' param ;
param : type ID_BC { SymTableHelp::AddVar(*$2, "parametru"); } ;
fn_body : declarations statement_list
;
declarations : declarations decl
|
;
main_bc : BGIN { SymTableHelp::EnterScope("Main"); } statement_list END { SymTableHelp::ExitScope(); } ;
statement_list :
| statement_list statement
;
statement : ID_BC ASSIGN_GIFT e ';' { SymTableHelp::CheckId(*$1); }
| ID_BC ACCES ID_BC ASSIGN_GIFT e ';' { SymTableHelp::CheckId(*$1); }
| IF_BC '(' e ')' '{' statement_list '}'
| IF_BC '(' e ')' '{' statement_list '}' ELSE_BC '{' statement_list '}'
| WHILE_BC '(' e ')' '{' statement_list '}'
| PRINT_BC '(' e ')' ';'
| RETURN_BC e ';'
| call_fn ';'
;
e : e '+' e
| e '-' e
| e '*' e
| e '/' e
| '(' e ')'
| NR
| FLOAT_NR
| STRING_VAL
| BOOL_VAL_BC
| ID_BC { SymTableHelp::CheckId(*$1); }
| e EQ_GIFTS e
| e NEQ_GIFTS e
| e LE_GIFTS e
| e GE_GIFTS e
| e LT e
| e GT e
| e ATELIER_AND_COR e
| e DECORATIUNI_OR_COLINDE e
| ID_BC ACCES ID_BC
| NEW_BC ID_BC
| call_fn
;
call_fn: ID_BC '(' wishlist ')' { SymTableHelp::CheckId(*$1); }
| ID_BC '(' ')' { SymTableHelp::CheckId(*$1); }
| ID_BC ACCES ID_BC '(' wishlist ')'
| ID_BC ACCES ID_BC '(' ')'
;
wishlist : e
| wishlist ',' e
;
%%
void yyerror(const char * s){
std::cout << "Eroare la linia " << yylineno << ": " << s << std::endl;
}
int main(int argc, char** argv){
if(argc > 1) yyin = fopen(argv[1], "r");
yyparse();
return 0;
}