You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
int[] code = new int[ExecuteVM.CODESIZE];
private int i = 0;
private HashMap<String,Integer> labelAdd = new HashMap<String,Integer>();
private HashMap<Integer,String> labelRef = new HashMap<Integer,String>();
function0:
cfp
lra
lfp
push 7
push 5
lfp
push 2
lfp
add
lw
js
srv
sra
pop
pop
pop
sfp
lrv
lra
js
function1:
cfp
lra
push 1
lfp
add
lw
push 2
lfp
add
lw
add
push 1
lfp
lw
add
lw
mult
srv
sra
pop
pop
pop
sfp
lrv
lra
js
function2:
cfp
lra
push function1
lfp
push -2
lfp
add
lw
push -4
lfp
add
lw
lfp
lw
push -2
lfp
lw
add
lw
js
srv
pop
sra
pop
pop
sfp
lrv
lra
js
`
but the result is 420 and i have to get 60. I have found the error into three nodes: funNode's code generation, callNode's code generation and idNode's code generation:
funNode:
` public String codeGeneration() {
String declCode="";
for (Node dec:declist) declCode+=dec.codeGeneration();
I have to create a compilare for a fool Language where functions can be passed as parameters. I have these instructions to create assembler code:
`grammar SVM;
@Header {
import java.util.HashMap;
}
@lexer::members {
int lexicalErrors=0;
}
@parser::members {
}
/*------------------------------------------------------------------
------------------------------------------------------------------/
assembly:
( PUSH n=NUMBER {code[i++] = PUSH;
code[i++] = Integer.parseInt($n.text);}
| PUSH l=LABEL {code[i++] = PUSH; //
labelRef.put(i++,$l.text);}
| POP {code[i++] = POP;}
| ADD {code[i++] = ADD;}
| SUB {code[i++] = SUB;}
| MULT {code[i++] = MULT;}
| DIV {code[i++] = DIV;}
| STOREW {code[i++] = STOREW;} //
| LOADW {code[i++] = LOADW;} //
| l=LABEL COL {labelAdd.put($l.text,i);}
| BRANCH l=LABEL {code[i++] = BRANCH;
labelRef.put(i++,$l.text);}
| BRANCHEQ l=LABEL {code[i++] = BRANCHEQ; //
labelRef.put(i++,$l.text);}
| BRANCHLESSEQ l=LABEL {code[i++] = BRANCHLESSEQ;
labelRef.put(i++,$l.text);}
| JS {code[i++] = JS;} //
| LOADRA {code[i++] = LOADRA;} //
| STORERA {code[i++] = STORERA;} //
| LOADRV {code[i++] = LOADRV;} //
| STORERV {code[i++] = STORERV;} //
| LOADFP {code[i++] = LOADFP;} //
| STOREFP {code[i++] = STOREFP;} //
| COPYFP {code[i++] = COPYFP;} //
| LOADHP {code[i++] = LOADHP;} //
| STOREHP {code[i++] = STOREHP;} //
| PRINT {code[i++] = PRINT;}
| HALT {code[i++] = HALT;}
)* { for (Integer refAdd: labelRef.keySet()) {
code[refAdd]=labelAdd.get(labelRef.get(refAdd));
}
} ;
/*------------------------------------------------------------------
------------------------------------------------------------------/
PUSH : 'push' ;
POP : 'pop' ;
ADD : 'add' ;
SUB : 'sub' ;
MULT : 'mult' ;
DIV : 'div' ;
STOREW : 'sw' ;
LOADW : 'lw' ;
BRANCH : 'b' ;
BRANCHEQ : 'beq' ;
BRANCHLESSEQ:'bleq' ;
JS : 'js' ;
LOADRA : 'lra' ;
STORERA : 'sra' ;
LOADRV : 'lrv' ;
STORERV : 'srv' ;
LOADFP : 'lfp' ;
STOREFP : 'sfp' ;
COPYFP : 'cfp' ;
LOADHP : 'lhp' ;
STOREHP : 'shp' ;
PRINT : 'print' ;
HALT : 'halt' ;
COL : ':' ;
LABEL : ('a'..'z'|'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9')* ;
NUMBER : '0' | ('-')?(('1'..'9')('0'..'9')*) ;
WHITESP : (' '|'\t'|'\n'|'\r')+ -> channel(HIDDEN) ;
ERR : . { System.out.println("Invalid char: "+ getText()); lexicalErrors++; } -> channel(HIDDEN); `
I have to generate the code for this small program:
`
let
in
print(f(5));
`
I have generated this code but the result isn'correct:
`push 0
push function0
push function2
lfp
push 5
lfp
push -3
lfp
add
lw
js
print
halt
function0:
cfp
lra
lfp
push 7
push 5
lfp
push 2
lfp
add
lw
js
srv
sra
pop
pop
pop
sfp
lrv
lra
js
function1:
cfp
lra
push 1
lfp
add
lw
push 2
lfp
add
lw
add
push 1
lfp
lw
add
lw
mult
srv
sra
pop
pop
pop
sfp
lrv
lra
js
function2:
cfp
lra
push function1
lfp
push -2
lfp
add
lw
push -4
lfp
add
lw
lfp
lw
push -2
lfp
lw
add
lw
js
srv
pop
sra
pop
pop
sfp
lrv
lra
js
`
but the result is 420 and i have to get 60. I have found the error into three nodes: funNode's code generation, callNode's code generation and idNode's code generation:
funNode:
` public String codeGeneration() {
String declCode="";
for (Node dec:declist) declCode+=dec.codeGeneration();
CallNode:
return "lfp \n"+ parCode+ "lfp\n"+getAR+ "push "+entry.getOffset()+"\n"+ "lfp\n"+getAR+ "add\n"+ "lw\n"+ "js\n";
id Node:
`
`
but I don't know how to fix them.
The text was updated successfully, but these errors were encountered: