-
Notifications
You must be signed in to change notification settings - Fork 1
/
yacc.yacc
277 lines (272 loc) · 5.77 KB
/
yacc.yacc
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
/* actions.y */
%{
#include <stdio.h>
int yylex();
int yyerror();
%}
%token SPACE
%token LP
%token RP
%token LSB
%token RSB
%token LESS_THAN
%token GREATER_THAN
%token LEFT_BRACE
%token RIGHT_BRACE
%token EXCLAMATION
%token AND
%token OR
%token DOUBLE_QUOTE
%token SINGLE_QUOTE
%token HASHTAG
%token DOT
%token ASSIGN_OP
%token EQUALS_OP
%token NOT_EQUAL_OP
%token PLUS
%token MINUS
%token SLASH
%token BACKSLASH
%token MULT_OP
%token QUESTION_MARK
%token UNDER_SCORE
%token SEMI_COLON
%token COLON
%token COMMA
%token LETTER
%token LOWERCASE
%token UPPERCASE
%token NON_ZERO_DIGIT
%token DIGITS
%token INT
%token DOUBLE
%token ELSE_IDENTIFIER
%token RETURN_IDENTIFIER
%token DIGIT
%token BOOL_IDENTIFIER
%token SIGN
%token DOLLAR_SIGN
%token TILDE
%token MODULO
%token INT_TYPE
%token STRING_TYPE
%token BOOL_TYPE
%token DOUBLE_TYPE
%token SENSOR_TYPE
%token SWITCH_TYPE
%token VOID_TYPE
%token EMPTY_FUNCTION_CALL
%token METHOD_IDENTIFIER
%token SET_SWITCH_ON_IDENTIFIER
%token SET_SWITCH_OFF_IDENTIFIER
%token TOGGLE_SWITCH_IDENTIFIER
%token GET_TIME
%token GET_TIME_HOUR
%token SYMBOL
%token PRINT
%token SCAN
%token NEW_LINE
%token RETURN
%token LESS_THAN_OR_EQUALS_OP
%token GREATER_THAN_OR_EQUALS_OP
%token GET_METHOD_IDENTIFIER
%token POST_METHOD_IDENTIFIER
%token DELETE_METHOD_IDENTIFIER
%token CONNECT_METHOD_IDENTIFIER
%token READ_METHOD_IDENTIFIER
%token WHILE_IDENTIFIER
%token FOR_IDENTIFIER
%token IF_IDENTIFIER
%token IDENTIFIER_SYMBOL
%token SENSOR_IDENTIFIER
%token SWITCH_IDENTIFIER
%token PURE_IDENTIFIER
%token TRUE_CONSTANT
%token FALSE_CONSTANT
%token STRING
%token SINGLE_QUOTE_STRING
%%
PROGRAM : STMTS
;
STMTS : STMTS STMT | STMT
;
STMT : IF_STMT
| NON_IF_STMT
| error SEMI_COLON {yyerrok;}
;
NON_IF_STMT : ASSIGN_STMT SEMI_COLON
| ITERATION_STMT
| FUNCTION_DEF_STMT
| FUNCTION_CALL_STMT SEMI_COLON
| RETURN_STMT SEMI_COLON
| VAR_DECLARATION_STMT SEMI_COLON
| OUTPUT_STMT SEMI_COLON
| INPUT_STMT SEMI_COLON
;
FUNCTION_CALL_STMT: FUNCTION_CALL
;
VAR_DECLARATION : PRIMITIVE_VAR_DECLARATION
| SENSOR_TYPE SENSOR_IDENTIFIER
| SWITCH_TYPE SWITCH_IDENTIFIER
;
PRIMITIVE_VAR_DECLARATION : PURE_TYPE PURE_IDENTIFIER
| BOOL_TYPE BOOL_IDENTIFIER
;
VAR_DECLARATION_STMT : VAR_DECLARATION
;
LEFT_HAND_SIDE : PRIMITIVE_VAR_DECLARATION | PURE_IDENTIFIER | BOOL_IDENTIFIER
;
ASSIGN_STMT : LEFT_HAND_SIDE ASSIGN_OP STRING
| LEFT_HAND_SIDE ASSIGN_OP EXPRESSION
;
OUTPUT_STMT : PRINT LP EXPRESSION RP
| PRINT LP STRING RP
;
INPUT_STMT : SCAN LP IDENTIFIER RP
| SCAN LP STRING RP
| SCAN LP INT RP
| SCAN LP BOOL_CONSTANT RP
| SCAN LP DOUBLE RP
;
IDENTIFIER : PURE_IDENTIFIER | SENSOR_IDENTIFIER | SWITCH_IDENTIFIER | BOOL_IDENTIFIER
;
NUMBER : INT
| DOUBLE
;
PURE_TYPE : INT_TYPE
| STRING_TYPE
| DOUBLE_TYPE
;
TYPE : SENSOR_TYPE
| SWITCH_TYPE
| PURE_TYPE
;
METHOD_TYPE : TYPE
| VOID_TYPE
| BOOL_TYPE
;
ARITHMETIC_EXPRESSION : ARITHMETIC_EXPRESSION PLUS TERM
| ARITHMETIC_EXPRESSION MINUS TERM
| TERM
;
TERM : TERM MULT_OP FACTOR
| TERM SLASH FACTOR
| TERM MODULO FACTOR
| FACTOR
;
FACTOR : LP ARITHMETIC_EXPRESSION RP
| NUMBER
| PURE_IDENTIFIER
| FUNCTION_CALL
;
EXPRESSION : ARITHMETIC_EXPRESSION
| BOOL_EXPRESSION
;
BOOL_CONSTANT : TRUE_CONSTANT
| FALSE_CONSTANT
;
BOOL_EXPRESSION : BOOL_EXPRESSION OR AND_EXPRESSION
| AND_EXPRESSION
;
AND_EXPRESSION : AND_EXPRESSION AND BOOL
| BOOL
;
BOOL : LP BOOL_EXPRESSION RP
| BOOL_CONSTANT
| BOOL_IDENTIFIER
| COMPARISON
| BOOL_COMPARISON
;
COMPARISON : COMPARISON_EXPRESSION COMPARISON_OPERATOR ARITHMETIC_EXPRESSION
;
BOOL_COMPARISON : BOOL_CONSTANT EQUALS_OR_NOT BOOL_IDENTIFIER
| BOOL_CONSTANT EQUALS_OR_NOT BOOL_CONSTANT
| BOOL_IDENTIFIER EQUALS_OR_NOT BOOL_CONSTANT
| BOOL_IDENTIFIER EQUALS_OR_NOT BOOL_IDENTIFIER
;
EQUALS_OR_NOT : EQUALS_OP
| NOT_EQUAL_OP
;
COMPARISON_OPERATOR : EQUALS_OP
| GREATER_THAN
| GREATER_THAN_OR_EQUALS_OP
| LESS_THAN
| LESS_THAN_OR_EQUALS_OP
| NOT_EQUAL_OP
;
COMPARISON_EXPRESSION : COMPARISON_EXPRESSION COMPARISON_OPERATOR ARITHMETIC_EXPRESSION
| ARITHMETIC_EXPRESSION
| RP COMPARISON_EXPRESSION LP
;
VAR_DECLARATION_LIST : VAR_DECLARATION
| VAR_DECLARATION_LIST COMMA VAR_DECLARATION
;
FUNCTION_DEF_INPUT : EMPTY_FUNCTION_CALL
| LP VAR_DECLARATION_LIST RP
;
FUNCTION_DEF_STMT : METHOD_TYPE METHOD_IDENTIFIER FUNCTION_DEF_INPUT LEFT_BRACE STMTS RIGHT_BRACE
;
FUNCTION_INPUT_LIST : EXPRESSION | FUNCTION_INPUT_LIST COMMA EXPRESSION
;
FUNCTION_CALL_INPUT : METHOD_IDENTIFIER EMPTY_FUNCTION_CALL
;
FUNCTION_CALL : FUNCTION_CALL_INPUT
| METHOD_IDENTIFIER LP FUNCTION_INPUT_LIST RP
| READ_SENSOR
| POST_DATA
| GET_DATA
| CONNECT
| SET_SWITCH_OFF
| SET_SWITCH_ON
| TOGGLE_SWITCH
;
RETURN_STMT : RETURN_IDENTIFIER EXPRESSION
;
IF_STMT : MATCHED
| UNMATCHED
;
MATCHED : IF_IDENTIFIER LP BOOL_EXPRESSION RP MATCHED ELSE_IDENTIFIER MATCHED
| LEFT_BRACE STMTS RIGHT_BRACE
;
UNMATCHED : IF_IDENTIFIER LP BOOL_EXPRESSION RP LEFT_BRACE STMTS RIGHT_BRACE
| IF_IDENTIFIER LP BOOL_EXPRESSION RP MATCHED ELSE_IDENTIFIER UNMATCHED
;
ITERATION_STMT : WHILE_STMT
| FOR_STMT
;
WHILE_STMT : WHILE_IDENTIFIER LP BOOL_EXPRESSION RP LEFT_BRACE STMTS RIGHT_BRACE
;
FOR_EXPRESSION : ASSIGN_STMT SEMI_COLON COMPARISON_EXPRESSION SEMI_COLON ASSIGN_STMT
;
FOR_STMT : FOR_IDENTIFIER LP FOR_EXPRESSION RP LEFT_BRACE STMTS RIGHT_BRACE
;
READ_SENSOR : READ_METHOD_IDENTIFIER LP SENSOR_IDENTIFIER RP
;
POST_DATA : POST_METHOD_IDENTIFIER LP EXPRESSION RP
;
GET_DATA : GET_METHOD_IDENTIFIER LP STRING RP
;
CONNECT : CONNECT_METHOD_IDENTIFIER LP STRING RP
;
SET_SWITCH_ON : SET_SWITCH_ON_IDENTIFIER LP SWITCH_IDENTIFIER RP
;
SET_SWITCH_OFF : SET_SWITCH_OFF_IDENTIFIER LP SWITCH_IDENTIFIER RP
;
TOGGLE_SWITCH : TOGGLE_SWITCH_IDENTIFIER LP SWITCH_IDENTIFIER RP
;
%%
#include "lex.yy.c"
int lineno=1;
int isValid = 1;
int yyerror(char *s) {
//printf ("%s\n", s);
printf("Syntax error on line %d!\n", lineno);
isValid = 0;
}
int main(void){
yyparse();
if(isValid)
{
printf("Input program is valid\n");
}
}