6
6
7
7
import java .util .ArrayList ;
8
8
9
+
9
10
public class CodeVM extends MonkeyParserBaseVisitor <Object > {
10
11
11
12
//private int letmain;
@@ -104,10 +105,12 @@ public Object visitLetStatementAST(MonkeyParser.LetStatementASTContext ctx) {
104
105
forgetType ();
105
106
ctxLet = ctx ; //save the ctx as aux
106
107
108
+ this .tablaIDS .insertar (ctx .IDENT ().getSymbol (),0 ,ctx );
109
+
107
110
// If is function
108
111
if (ctx .getText ().split ("\\ =" )[1 ].startsWith ("fn(" )){
109
112
isFunct = true ;
110
- this .tablaIDS .insertar (ctx .IDENT ().getSymbol (),0 ,ctx );
113
+ // this.tablaIDS.insertar(ctx.IDENT().getSymbol(),0,ctx);
111
114
112
115
if (ctx .IDENT ().getText ().toLowerCase ().equals ("main" ) && level == 0 ){
113
116
letmain = true ;
@@ -126,8 +129,17 @@ public Object visitLetStatementAST(MonkeyParser.LetStatementASTContext ctx) {
126
129
// if is List
127
130
else if (ctx .getText ().split ("\\ =" )[1 ].startsWith ("[" )){
128
131
isList = true ;
129
- visit (ctx .expression ());
130
- //System.out.println("IDENT: " +ctx.IDENT() +" Level: " + level +" => []");
132
+ if (level == 0 | letmain ){
133
+ this .generate (this .index ,"PUSH_GLOBAL_I" ,ctx .IDENT ().getText ());
134
+ visit (ctx .expression ());
135
+ this .generate (this .index ,"STORE_GLOBAL" ,ctx .IDENT ().getText ());
136
+ }else {
137
+ this .generate (this .index ,"PUSH_LOCAL_I" ,ctx .IDENT ().getText ());
138
+ visit (ctx .expression ());
139
+ this .generate (this .index ,"STORE_FAST" ,ctx .IDENT ().getText ());
140
+ }
141
+
142
+
131
143
}
132
144
// if is hash
133
145
else if (ctx .getText ().split ("\\ =" )[1 ].startsWith ("{" )){
@@ -429,6 +441,8 @@ public Object visitArrayFunctions_restAST(MonkeyParser.ArrayFunctions_restASTCon
429
441
430
442
@ Override
431
443
public Object visitArrayFunctions_pushAST (MonkeyParser .ArrayFunctions_pushASTContext ctx ) {
444
+ // Este el profe dijo que no habia que implementarlo por el chat de Whatsapp, 9/12/2020, 09:28 am
445
+
432
446
return null ;
433
447
}
434
448
@@ -487,15 +501,30 @@ public Object visitHashLiteralAST(MonkeyParser.HashLiteralASTContext ctx) {
487
501
488
502
@ Override
489
503
public Object visitHashContentAST (MonkeyParser .HashContentASTContext ctx ) {
504
+ if (!ctx .expression ().isEmpty ()){
505
+ for (int i = 0 ; i < ctx .expression ().size (); i ++) {
506
+ visit (ctx .expression (i ));
507
+ }
508
+ }
509
+ //System.err.println(ctx.getText());
490
510
return ctx .getText ();
491
511
}
492
512
493
513
@ Override
494
514
public Object visitExpressionList_expressionAST (MonkeyParser .ExpressionList_expressionASTContext ctx ) {
495
515
//System.out.println("Array size: " + ctx.expression().size());
496
- for (int i = 0 ; i < ctx .expression ().size (); i ++) {
497
- //System.out.println("Data array, index " + i + " : " + visit(ctx.expression(i)));
516
+ if (!ctx .expression ().isEmpty ()){
517
+ for (int i = 0 ; i < ctx .expression ().size (); i ++) {
518
+ visit (ctx .expression (i ));
519
+ }
498
520
}
521
+
522
+ // if is let & list
523
+ if (isList && isLet ){
524
+ System .out .println ("Size: " + ctx .expression ().size ());
525
+ this .generate (this .index , "BUILD_LIST" , ctx .expression ().size ());
526
+ }
527
+
499
528
return null ;
500
529
}
501
530
0 commit comments