1
1
from Classes .tokenizer import Tokenizer
2
- from Classes .node import IntVal , UnOp , BinOp , NoOp , Node , Assignment , Identifier , Statement , Print
2
+ from Classes .node import IntVal , UnOp , BinOp , NoOp , Node , Assignment , Identifier , Statement , Print , Read , While , If
3
3
4
4
class Parser :
5
5
tokens = None
@@ -14,7 +14,8 @@ def run(code):
14
14
@staticmethod
15
15
def parseBlock ():
16
16
stat = Statement ()
17
- while (Parser .tokens .actual .type != "EOF" ):
17
+ while (Parser .tokens .actual .type != "EOF" and Parser .tokens .actual .type != "END"
18
+ and Parser .tokens .actual .type != "ELSE" and Parser .tokens .actual .type != "ELSEIF" ):
18
19
stat .children .append (Parser .parseCommand ())
19
20
20
21
return stat
@@ -35,15 +36,27 @@ def parseCommand():
35
36
if (Parser .tokens .actual .type == 'EQUAL' ):
36
37
result = Assignment ([iden , None ])
37
38
Parser .tokens .selectNext ()
38
- result .children [1 ] = Parser .parseExpression ()
39
+
40
+ if (Parser .tokens .actual .type == 'READ' ):
41
+ Parser .tokens .selectNext ()
42
+ if (Parser .tokens .actual .type == 'OPEN_P' ):
43
+ Parser .tokens .selectNext ()
44
+ result .children [1 ] = Read ()
45
+
46
+ if (Parser .tokens .actual .type == 'CLOSE_P' ):
47
+ Parser .tokens .selectNext ()
48
+ else :
49
+ raise NameError ("Expected to Close Parenthesis" )
50
+ else :
51
+ result .children [1 ] = Parser .parseRelExpression ()
39
52
else :
40
53
raise NameError ('Expected "=", received ' + Parser .tokens .actual .type )
41
54
42
55
elif (Parser .tokens .actual .type == 'PRINT' ):
43
56
Parser .tokens .selectNext ()
44
57
if (Parser .tokens .actual .type == 'OPEN_P' ):
45
58
Parser .tokens .selectNext ()
46
- result = Print (Parser .parseExpression ())
59
+ result = Print (Parser .parseRelExpression ())
47
60
48
61
if (Parser .tokens .actual .type == 'CLOSE_P' ):
49
62
Parser .tokens .selectNext ()
@@ -52,18 +65,93 @@ def parseCommand():
52
65
else :
53
66
raise NameError ("Expected Parenthesis" )
54
67
68
+ elif (Parser .tokens .actual .type == 'WHILE' ):
69
+ Parser .tokens .selectNext ()
70
+ result = While ([Parser .parseRelExpression (), None ])
71
+
72
+ if (Parser .tokens .actual .type == 'LINE_END' ):
73
+ Parser .tokens .selectNext ()
74
+ result .children [1 ] = Parser .parseBlock ()
75
+
76
+ if (Parser .tokens .actual .type == 'END' ):
77
+ Parser .tokens .selectNext ()
78
+ if (Parser .tokens .actual .type == 'LINE_END' ):
79
+ Parser .tokens .selectNext ()
80
+ else :
81
+ raise NameError ("Expected End" )
82
+
83
+ elif (Parser .tokens .actual .type == 'IF' ):
84
+ Parser .tokens .selectNext ()
85
+ result = If ([Parser .parseRelExpression (), None , None ])
86
+
87
+ if (Parser .tokens .actual .type == 'LINE_END' ):
88
+ Parser .tokens .selectNext ()
89
+ atual = 0
90
+ result .children [1 ] = Parser .parseBlock ()
91
+
92
+ if (Parser .tokens .actual .type == 'ELSEIF' ):
93
+ while (Parser .tokens .actual .type == "ELSEIF" ):
94
+ Parser .tokens .selectNext ()
95
+ newIf = If ([Parser .parseRelExpression (), None , None ])
96
+
97
+ if (Parser .tokens .actual .type == 'LINE_END' ):
98
+ Parser .tokens .selectNext ()
99
+ newIf .children [1 ] = Parser .parseBlock ()
100
+
101
+ if (atual == 0 ):
102
+ result .children [2 ] = newIf
103
+ atual = newIf
104
+ else :
105
+ atual .children [2 ] = newIf
106
+ atual = newIf
107
+
108
+ if (Parser .tokens .actual .type == 'ELSE' ):
109
+ Parser .tokens .selectNext ()
110
+ if (Parser .tokens .actual .type == 'LINE_END' ):
111
+ Parser .tokens .selectNext ()
112
+ if (atual == 0 ):
113
+ result .children [2 ] = Parser .parseBlock ()
114
+ else :
115
+ atual .children [2 ] = Parser .parseBlock ()
116
+
117
+ if (Parser .tokens .actual .type == 'END' ):
118
+ Parser .tokens .selectNext ()
119
+ if (Parser .tokens .actual .type == 'LINE_END' ):
120
+ Parser .tokens .selectNext ()
121
+
122
+ else :
123
+ raise NameError ("Expected End, Else or Elseif" )
124
+
55
125
else :
56
126
raise NameError (f"Unexpected token { Parser .tokens .actual .type } " )
57
127
58
128
return result
59
129
130
+ @staticmethod
131
+ def parseRelExpression ():
132
+ result = Parser .parseExpression ()
133
+
134
+ if (Parser .tokens .actual != None ):
135
+ while (Parser .tokens .actual .type == "EQUAL_I" or Parser .tokens .actual .type == "LESSER" or Parser .tokens .actual .type == "GREATER" ):
136
+ if (Parser .tokens .actual .type == "EQUAL_I" or Parser .tokens .actual .type == "LESSER" or Parser .tokens .actual .type == "GREATER" ):
137
+ result = BinOp (Parser .tokens .actual .value , [result , None ])
138
+
139
+ Parser .tokens .selectNext ()
140
+ result .children [1 ] = Parser .parseExpression () # Right Child
141
+
142
+ else :
143
+ raise NameError (f"Got type { Parser .tokens .actual .type } when expecting <, > or ==" )
144
+ else :
145
+ raise NameError (f"Invalid Syntax" )
146
+ return result
147
+
60
148
@staticmethod
61
149
def parseExpression ():
62
150
result = Parser .parseTerm ()
63
151
64
152
if (Parser .tokens .actual != None ):
65
- while (Parser .tokens .actual .type == "PLUS" or Parser .tokens .actual .type == "MINUS" ):
66
- if (Parser .tokens .actual .type == 'PLUS' or Parser .tokens .actual .type == 'MINUS' ):
153
+ while (Parser .tokens .actual .type == "PLUS" or Parser .tokens .actual .type == "MINUS" or Parser . tokens . actual . type == "OR" ):
154
+ if (Parser .tokens .actual .type == 'PLUS' or Parser .tokens .actual .type == 'MINUS' or Parser . tokens . actual . type == "OR" ):
67
155
result = BinOp (Parser .tokens .actual .value , [result , None ])
68
156
69
157
Parser .tokens .selectNext ()
@@ -80,8 +168,8 @@ def parseTerm():
80
168
result = Parser .parseFactor ()
81
169
82
170
if (Parser .tokens .actual != None ):
83
- while (Parser .tokens .actual .type == "MULT" or Parser .tokens .actual .type == "DIV" ):
84
- if (Parser .tokens .actual .type == 'MULT' or Parser .tokens .actual .type == 'DIV' ):
171
+ while (Parser .tokens .actual .type == "MULT" or Parser .tokens .actual .type == "DIV" or Parser . tokens . actual . type == "AND" ):
172
+ if (Parser .tokens .actual .type == 'MULT' or Parser .tokens .actual .type == 'DIV' or Parser . tokens . actual . type == "AND" ):
85
173
result = BinOp (Parser .tokens .actual .value , [result , None ])
86
174
87
175
Parser .tokens .selectNext ()
@@ -105,14 +193,14 @@ def parseFactor():
105
193
result = Identifier (Parser .tokens .actual .value )
106
194
Parser .tokens .selectNext ()
107
195
108
- elif (Parser .tokens .actual .type == 'MINUS' or Parser .tokens .actual .type == 'PLUS' ):
196
+ elif (Parser .tokens .actual .type == 'MINUS' or Parser .tokens .actual .type == 'PLUS' or Parser . tokens . actual . type == "NOT" ):
109
197
result = UnOp (Parser .tokens .actual .value )
110
198
Parser .tokens .selectNext ()
111
199
result .children [0 ] = Parser .parseFactor ()
112
200
113
201
elif (Parser .tokens .actual .type == 'OPEN_P' ):
114
202
Parser .tokens .selectNext ()
115
- result = Parser .parseExpression ()
203
+ result = Parser .parseRelExpression ()
116
204
117
205
if (Parser .tokens .actual .type == 'CLOSE_P' ):
118
206
Parser .tokens .selectNext ()
0 commit comments