1
1
package codeGeneration ;
2
2
3
- import backend .IDLE ;
4
3
import generated .MonkeyParser ;
5
4
import generated .MonkeyParserBaseVisitor ;
6
- import utils . TYPE ;
5
+
7
6
8
7
import java .util .ArrayList ;
9
8
@@ -13,11 +12,21 @@ public class CodeGenerator extends MonkeyParserBaseVisitor<Object> {
13
12
private ArrayList <String > code ;
14
13
public int level ;
15
14
15
+ // Aux
16
+ private MonkeyParser .LetStatementASTContext ctxLet ;
17
+ private boolean isLet ;
18
+ private boolean isReturn ;
19
+ private boolean isCall ;
20
+
21
+
16
22
//Constructor
17
23
public CodeGenerator () {
18
24
this .index =0 ;
19
25
this .code = new ArrayList <>();
20
26
this .level = -1 ;
27
+ this .isLet = false ;
28
+ this .isReturn = false ;
29
+ this .isCall = false ;
21
30
}
22
31
23
32
//Method to generate Monkey Virtual Machine code
@@ -45,7 +54,9 @@ public Object visitProgramAST(MonkeyParser.ProgramASTContext ctx) {
45
54
@ Override
46
55
public Object visitStatement_LetAST (MonkeyParser .Statement_LetASTContext ctx ) {
47
56
System .out .println ("***********************************************************************************" );
48
- System .out .println ("LET : " );
57
+ System .out .println ("LET : " + ctx .getText ());
58
+ makeAllFalse ();
59
+ isLet = true ;
49
60
visit (ctx .letStatement ());
50
61
return null ;
51
62
}
@@ -54,6 +65,8 @@ public Object visitStatement_LetAST(MonkeyParser.Statement_LetASTContext ctx) {
54
65
public Object visitStatement_returnAST (MonkeyParser .Statement_returnASTContext ctx ) {
55
66
System .out .println ("***********************************************************************************" );
56
67
System .out .println ("RETURN : " );
68
+ makeAllFalse ();
69
+ isReturn = true ;
57
70
visit (ctx .returnStatement ());
58
71
return null ;
59
72
}
@@ -62,6 +75,8 @@ public Object visitStatement_returnAST(MonkeyParser.Statement_returnASTContext c
62
75
public Object visitCallExpressionStatementAST (MonkeyParser .CallExpressionStatementASTContext ctx ) {
63
76
System .out .println ("***********************************************************************************" );
64
77
System .out .println ("CALL : " + ctx .getText ());
78
+ makeAllFalse ();
79
+ isCall = true ;
65
80
visit (ctx .expressionStatement ());
66
81
return null ;
67
82
}
@@ -70,9 +85,11 @@ public Object visitCallExpressionStatementAST(MonkeyParser.CallExpressionStateme
70
85
public Object visitLetStatementAST (MonkeyParser .LetStatementASTContext ctx ) {
71
86
level ++;
72
87
88
+ //save the ctx as aux
89
+ ctxLet = ctx ;
73
90
//TODO: get best order if this visit at the end, but the problem is Virtual Machine
74
91
//visit(ctx.expression());
75
- //System.out.println("***********************************************************************************");
92
+
76
93
// If is function
77
94
if (ctx .getText ().split ("\\ =" )[1 ].startsWith ("fn(" )){
78
95
if (ctx .IDENT ().getText ().toLowerCase ().equals ("main" ) && level == 1 ){
@@ -94,6 +111,12 @@ else if(ctx.getText().split("\\=")[1].startsWith("{")){
94
111
// if is variable
95
112
else {
96
113
System .out .println ("IDENT: " +ctx .IDENT () +" Level: " + level +" => var" );
114
+ if (level == 1 ){
115
+ this .generate (this .index ,"PUSH_GLOBAL_I" ,ctx .IDENT ().getText ());
116
+ }else {
117
+ this .generate (this .index ,"PUSH_LOCAL_I" ,ctx .IDENT ().getText ());
118
+ }
119
+
97
120
}
98
121
99
122
visit (ctx .expression ());
@@ -136,7 +159,6 @@ public Object visitAdditionExpressionAST(MonkeyParser.AdditionExpressionASTConte
136
159
if (ctx .multiplicationExpression () != null ){
137
160
visit (ctx .multiplicationExpression ());
138
161
}
139
-
140
162
return null ;
141
163
}
142
164
@@ -197,6 +219,12 @@ public Object visitCallExpressionAST(MonkeyParser.CallExpressionASTContext ctx)
197
219
198
220
@ Override
199
221
public Object visitPrimitiveExpression_numberAST (MonkeyParser .PrimitiveExpression_numberASTContext ctx ) {
222
+
223
+ if (isLet ){
224
+ this .generate (this .index ,"LOAD_CONST" , ctx .INTEGER ());
225
+ this .generate (this .index ,"STORE_FAST" , ctxLet .IDENT ().getText ());
226
+ }
227
+
200
228
System .out .println ("INT: " + ctx .INTEGER ());
201
229
return null ;
202
230
}
@@ -396,7 +424,6 @@ public Object visitBlockStatementAST(MonkeyParser.BlockStatementASTContext ctx)
396
424
return null ;
397
425
}
398
426
399
-
400
427
//Method To String
401
428
@ Override
402
429
public String toString () {
@@ -406,4 +433,11 @@ public String toString() {
406
433
}
407
434
return data ;
408
435
}
436
+
437
+ public void makeAllFalse (){
438
+ isLet = false ;
439
+ isCall = false ;
440
+ isReturn = false ;
441
+ }
442
+
409
443
}
0 commit comments