Skip to content

Commit 2268f67

Browse files
committed
Feature(-): Finished the AST building during parsing
1 parent ef8589a commit 2268f67

6 files changed

Lines changed: 1494 additions & 869 deletions

File tree

ast.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func (n *Node) String() string {
6464
if len(parts) > 1 {
6565
return fmt.Sprintf("%v", strings.Join(parts, " "))
6666
}
67-
return strings.Join(parts, " ")
67+
return strings.Join(parts, "")
6868
//p := printer{}
6969
//return p.Print(*n)
7070
}

lexer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (g *golex) Lex(lval *yySymType) (tokenType int) {
4545
// you call into the parser.
4646
func (l *golex) Error(message string) {
4747
// is there a better way to handle this in the context of goyacc?
48-
panic(fmt.Errorf(message))
48+
panic(fmt.Errorf(fmt.Sprintf("error occured at (%d) with message %s", l.Scanner.TC, message)))
4949
}
5050
func newLexer() *lexmachine.Lexer {
5151
return lexical.NewLexer()

syntax.y

Lines changed: 199 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,22 @@ MainClass : CLASS IDENTIFIER LEFTANGLEBRACKET PUBLIC STATIC VOID MAIN LEFTPARENT
9797
;
9898
ClassDeclaration : CLASS IDENTIFIER Extension LEFTANGLEBRACKET VarDeclaration MethodDeclaration RIGHTANGLEBRACKET
9999
{
100-
$$.ast=NewNode("ClassDeclaration:", nil).
100+
$$.ast= NewNode("<NewClassDeclaration>:", nil).
101101
AddKid(NewNode("",$1.token)).
102102
AddKid(NewNode("",$2.token)).
103103
AddKid($3.ast).
104104
AddKid(NewNode("{",$4.token)).
105105
AddKid($5.ast).
106106
AddKid($6.ast).
107107
AddKid(NewNode("}",$7.token))
108+
109+
}
110+
| ClassDeclaration ClassDeclaration
111+
{
112+
$$.ast=NewNode("<ExtraClassDeclarations>:", nil).
113+
AddKid($1.ast).
114+
AddKid($2.ast)
108115
}
109-
| ClassDeclaration CLASS IDENTIFIER Extension LEFTANGLEBRACKET VarDeclaration MethodDeclaration RIGHTANGLEBRACKET
110116
;
111117
Extension: EXTENDS IDENTIFIER
112118
{
@@ -117,22 +123,23 @@ Extension: EXTENDS IDENTIFIER
117123
}
118124
| ;
119125

120-
VarDeclaration : Type IDENTIFIER SEMICOLON VarDeclaration
126+
VarDeclaration : VarDeclaration VarDeclaration
121127
{
122-
$$.ast=NewNode("",nil).
123-
AddKid($1.ast).
124-
AddKid(NewNode("",$2.token)).
125-
AddKid(NewNode("",$3.token)).
126-
AddKid($4.ast)
128+
$$.ast=NewNode("<Variable definitions>:",nil).
129+
AddKid($1.ast).
130+
AddKid($2.ast)
127131
}
132+
128133
| Type IDENTIFIER SEMICOLON
129134
{
130135
$$.ast=NewNode("",nil).
131136
AddKid($1.ast).
132137
AddKid(NewNode("",$2.token)).
133138
AddKid(NewNode("",$3.token))
134139
}
140+
| { $$.ast=nil }
135141
;
142+
136143
Statement : LEFTANGLEBRACKET Statement RIGHTANGLEBRACKET
137144
{
138145
$$.ast=NewNode("bracketed statement",nil).
@@ -141,39 +148,220 @@ Statement : LEFTANGLEBRACKET Statement RIGHTANGLEBRACKET
141148
AddKid(NewNode("}",$3.token))
142149
}
143150
| IF LEFTPARENTHESIS Expression RIGHTPARENTHESIS Statement ELSE Statement
151+
{
152+
$$.ast=NewNode("<If block>",nil).
153+
AddKid(NewNode("",$1.token)).
154+
AddKid(NewNode("(",$2.token)).
155+
AddKid($3.ast).
156+
AddKid(NewNode(")",$4.token)).
157+
AddKid($5.ast).
158+
AddKid(NewNode("",$6.token)).
159+
AddKid($7.ast)
160+
}
144161
| WHILE LEFTPARENTHESIS Expression RIGHTPARENTHESIS Statement
162+
{
163+
$$.ast=NewNode("<While block>",nil).
164+
AddKid(NewNode("",$1.token)).
165+
AddKid(NewNode("",$2.token)).
166+
AddKid($3.ast).
167+
AddKid(NewNode(")",$4.token)).
168+
AddKid($4.ast)
169+
170+
}
145171
| SYSTEMOUTPRINTLN LEFTPARENTHESIS Expression RIGHTPARENTHESIS SEMICOLON
172+
{
173+
$$.ast=NewNode("<Print Statement>",nil).
174+
AddKid(NewNode("",$1.token)).
175+
AddKid(NewNode("",$2.token)).
176+
AddKid($3.ast).
177+
AddKid(NewNode(")",$4.token)).
178+
AddKid(NewNode("",$5.token))
179+
}
146180
| IDENTIFIER EQUAL Expression SEMICOLON
181+
{
182+
$$.ast=NewNode("<Affectation>",nil).
183+
AddKid(NewNode("",$1.token)).
184+
AddKid(NewNode("=",$2.token)).
185+
AddKid($3.ast).
186+
AddKid(NewNode("",$4.token))
187+
}
147188
| IDENTIFIER LEFTBRACKET Expression RIGHTBRACKET EQUAL Expression SEMICOLON
189+
{
190+
$$.ast=NewNode("<Array Affectation>",nil).
191+
AddKid(NewNode("",$1.token)).
192+
AddKid(NewNode("[",$2.token)).
193+
AddKid($3.ast).
194+
AddKid(NewNode("]",$4.token)).
195+
AddKid(NewNode("=",$5.token)).
196+
AddKid($6.ast).
197+
AddKid(NewNode("",$7.token))
198+
}
199+
| Statement Statement
200+
{
201+
$$.ast=NewNode("<BlockOfStatements>:",nil).
202+
AddKid($1.ast).
203+
AddKid($2.ast)
204+
}
148205
| {$$.ast=NewNode("empty statement content",nil) } ;
149206
Type: INT LEFTBRACKET RIGHTBRACKET { $$.ast=NewNode("int[]",$1.token)}
150207
| BOOLEAN {$$.ast=NewNode("",$1.token)}
151208
| INT {$$.ast=NewNode("",$1.token)}
152209
| IDENTIFIER {$$.ast=NewNode("",$1.token)} ;
153210
MethodTypeDeclaration:
154211
| Type IDENTIFIER
155-
| Type IDENTIFIER COMMA MethodTypeDeclaration ;
212+
{
213+
$$.ast=NewNode("",nil).
214+
AddKid($1.ast).
215+
AddKid(NewNode("",$2.token))
216+
}
217+
| Type IDENTIFIER COMMA MethodTypeDeclaration
218+
{
219+
$$.ast = NewNode("<Method input type>:",nil).
220+
AddKid($1.ast).
221+
AddKid(NewNode("",$2.token)).
222+
AddKid(NewNode("",$3.token)).
223+
AddKid($4.ast)
224+
}
225+
;
226+
156227
MethodDeclaration : PUBLIC Type IDENTIFIER LEFTPARENTHESIS MethodTypeDeclaration RIGHTPARENTHESIS LEFTANGLEBRACKET VarDeclaration Statement RETURN Expression SEMICOLON RIGHTANGLEBRACKET
157-
| PUBLIC Type IDENTIFIER LEFTPARENTHESIS MethodTypeDeclaration RIGHTPARENTHESIS LEFTANGLEBRACKET VarDeclaration Statement RETURN Expression SEMICOLON RIGHTANGLEBRACKET MethodDeclaration
158-
| ;
228+
{
229+
$$.ast=NewNode("<MethodDeclaration>:",nil).
230+
AddKid(NewNode("",$1.token)).
231+
AddKid($2.ast).
232+
AddKid(NewNode("",$3.token)).
233+
AddKid(NewNode("(",$4.token)).
234+
AddKid($5.ast).
235+
AddKid(NewNode(")",$6.token)).
236+
AddKid(NewNode("{",$7.token)).
237+
AddKid($8.ast).
238+
AddKid($9.ast).
239+
AddKid(NewNode("",$10.token)).
240+
AddKid($11.ast).
241+
AddKid(NewNode(";",$12.token)).
242+
AddKid(NewNode("}",$13.token))
243+
}
244+
| MethodDeclaration MethodDeclaration
245+
{
246+
$$.ast=NewNode("<MethodDeclarations>:",nil).
247+
AddKid($1.ast).
248+
AddKid($2.ast)
249+
250+
}
251+
;
252+
159253
Expression : IDENTIFIER
254+
{
255+
$$.ast=NewNode("",$1.token)
256+
}
160257
| Expression LOGICALAND Expression
258+
{
259+
$$.ast=NewNode("&&",$2.token).
260+
AddKid($1.ast).
261+
AddKid($3.ast)
262+
}
161263
| Expression LESS Expression
264+
{
265+
$$.ast=NewNode("<",$2.token).
266+
AddKid($1.ast).
267+
AddKid($3.ast)
268+
}
162269
| Expression PLUS Expression
270+
{
271+
$$.ast=NewNode("+",$2.token).
272+
AddKid($1.ast).
273+
AddKid($3.ast)
274+
}
163275
| Expression MINUS Expression
276+
{
277+
$$.ast=NewNode("+",$2.token).
278+
AddKid($1.ast).
279+
AddKid($3.ast)
280+
}
164281
| Expression ASTERIX Expression
282+
{
283+
$$.ast=NewNode("*",$2.token).
284+
AddKid($1.ast).
285+
AddKid($3.ast)
286+
}
165287
| INTEGER_LITERAL
288+
{
289+
$$.ast=NewNode("",$1.token)
290+
}
166291
| BOOLEAN_LITERAL
292+
{
293+
$$.ast=NewNode("",$1.token)
294+
}
167295
| Expression LEFTBRACKET Expression RIGHTBRACKET
296+
{
297+
$$.ast=NewNode("",nil).
298+
AddKid($1.ast).
299+
AddKid(NewNode("[",$2.token)).
300+
AddKid($3.ast).
301+
AddKid(NewNode("]",$4.token))
302+
}
168303
| Expression PERIOD LENGTH
304+
{
305+
$$.ast=NewNode("<PeriodAccess>:",nil).
306+
AddKid($1.ast).
307+
AddKid(NewNode(".",$2.token)).
308+
AddKid(NewNode("",$3.token))
309+
}
169310
| Expression PERIOD IDENTIFIER LEFTPARENTHESIS MethodExpressionSignature RIGHTPARENTHESIS
311+
{
312+
$$.ast=NewNode("<AccessedFunction>", nil).
313+
AddKid($1.ast).
314+
AddKid(NewNode(".",$2.token)).
315+
AddKid(NewNode("",$3.token)).
316+
AddKid(NewNode("(",$4.token)).
317+
AddKid($5.ast).
318+
AddKid(NewNode(")",$6.token))
319+
}
170320
| THIS
321+
{
322+
$$.ast=NewNode("",$1.token)
323+
}
171324
| NEW INT LEFTBRACKET Expression RIGHTBRACKET
325+
{
326+
$$.ast=NewNode("",nil).
327+
AddKid(NewNode("",$1.token)).
328+
AddKid(NewNode("",$2.token)).
329+
AddKid(NewNode("[",$3.token)).
330+
AddKid($4.ast).
331+
AddKid(NewNode("]",$5.token))
332+
}
172333
| NEW IDENTIFIER LEFTPARENTHESIS RIGHTPARENTHESIS
334+
{
335+
$$.ast=NewNode("<Instantiation>:",nil).
336+
AddKid(NewNode("",$1.token)).
337+
AddKid(NewNode("",$2.token)).
338+
AddKid(NewNode("(",$3.token)).
339+
AddKid(NewNode(")",$4.token))
340+
}
173341
| BANG Expression
342+
{
343+
$$.ast=NewNode("<NOT!>:",nil).
344+
AddKid(NewNode("!",$1.token)).
345+
AddKid($2.ast)
346+
}
174347
| LEFTPARENTHESIS Expression RIGHTPARENTHESIS
348+
{
349+
$$.ast=NewNode("<ParenthesisedExpression>",nil).
350+
AddKid(NewNode("(",$1.token)).
351+
AddKid($2.ast).
352+
AddKid(NewNode(")",$3.token))
353+
}
175354
;
176355
MethodExpressionSignature : Expression
356+
{
357+
$$.ast=$1.ast
358+
}
177359
| MethodExpressionSignature COMMA Expression
360+
{
361+
$$.ast=NewNode("<MultiParametersMethodSignature>",nil).
362+
AddKid($1.ast).
363+
AddKid(NewNode(".",$2.token)).
364+
AddKid($3.ast)
365+
}
178366
;
179367
%%

test/example.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
11
class HelloWorld{
22
public static void main(String[] args){
3+
{
4+
if (1 && 2)
5+
{
6+
x=1;
7+
while(1)
38

9+
{
10+
System.out.println(he);
11+
}
12+
}
13+
else
14+
{
15+
System.out.println(Hello);
16+
}
17+
}
418
}
519
}
6-
class Test extends Thread {
7-
int id;
8-
}

0 commit comments

Comments
 (0)