-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlexer.y
More file actions
131 lines (107 loc) · 1.72 KB
/
lexer.y
File metadata and controls
131 lines (107 loc) · 1.72 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
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
extern FILE *fp;
%}
%token FOR WHILE
%token IF IN RANGE ELIF ELSE PRINT
%token DEF TAB
%token NUM ID
%right '='
%left AND OR
%left '<' '>' LE GE EQ NE LT GT
%%
start: Function
| Declaration
;
Declaration: Assignment
| FunctionCall
| ArrayUsage
| error
;
Assignment: ID '=' Assignment
| ID '=' FunctionCall
| ID '=' ArrayUsage
| ArrayUsage '=' Assignment
| ID ',' Assignment
| NUM ',' Assignment
| ID '+' Assignment
| ID '-' Assignment
| ID '*' Assignment
| ID '/' Assignment
| NUM '+' Assignment
| NUM '-' Assignment
| NUM '*' Assignment
| NUM '/' Assignment
| '(' Assignment ')'
| '-' '(' Assignment ')'
| '-' NUM
| '-' ID
| NUM
| ID
;
FunctionCall: ID'('')'
| ID'('Assignment')'
;
ArrayUsage: ID'['Assignment']'
;
Function: DEF ID '(' ArgListOpt ')' CompoundSt
;
ArgListOpt: ArgList
|
;
ArgList: ArgList ',' Arg
| Arg
;
Arg: ID
;
CompoundSt: TAB StmtList
;
StmtList: StmtList Stmt
|
;
Stmt: WhileStmt
| Declaration
| ForStmt
| IfStmt
| PrintFunc
;
WhileStmt: WHILE '(' Expr ')' Stmt
| WHILE '(' Expr ')' CompoundSt
;
ForStmt: FOR ID IN RANGE '(' Expr ')' Stmt
| FOR ID IN RANGE '(' Expr ')' CompoundSt
;
IfStmt: IF '(' Expr ')'
Stmt
;
PrintFunc: PRINT '(' ID ')'
;
Expr:
| Expr LE Expr
| Expr GE Expr
| Expr NE Expr
| Expr GT Expr
| Expr LT Expr
| Expr EQ Expr
| Assignment
| ArrayUsage
;
%%
#include"lex.yy.c"
#include<ctype.h>
int count=0;
int main(int argc, char *argv[])
{
yyin = fopen(argv[1], "r");
if(yyparse()==1)
printf("\nParsing failed\n");
else
printf("\nParsing completed successfully\n");
fclose(yyin);
return 0;
}
yyerror(char *s){
printf("%d: %s %s\n", yylineno, s, yytext );
}