UniTO/anno2/Sem2/lft/lab/Translator.java
2024-10-29 09:11:05 +01:00

102 lines
2.4 KiB
Java
Executable file

import java.io.*;
public class Translator {
private Lexer lex;
private BufferedReader pbr;
private Token look;
SymbolTable st = new SymbolTable();
CodeGenerator code = new CodeGenerator();
int count=0;
public Translator(Lexer l, BufferedReader br) {
lex = l;
pbr = br;
move();
}
void move() {
// come in Esercizio 3.1
}
void error(String s) {
// come in Esercizio 3.1
}
void match(int t) {
// come in Esercizio 3.1
}
public void prog() {
// ... completare ...
int lnext_prog = code.newLabel();
statlist(lnext_prog);
code.emitLabel(lnext_prog);
match(Tag.EOF);
try {
code.toJasmin();
}
catch(java.io.IOException e) {
System.out.println("IO error\n");
};
// ... completare ...
}
public void stat(int lnext) {
switch(look.tag) {
// ... completare ...
case Tag.PRINT:
match(Tag.PRINT);
match('(');
expr();
code.emit(OpCode.invokestatic,1);
match(')');
break;
case Tag.READ:
match(Tag.READ);
match('(');
if (look.tag==Tag.ID) {
int read_id_addr = st.lookupAddress(((Word)look).lexeme);
if (read_id_addr==-1) {
read_id_addr = count;
st.insert(((Word)look).lexeme,count++);
}
match(Tag.ID);
match(')');
code.emit(OpCode.invokestatic,0);
code.emit(OpCode.istore,read_id_addr);
}
else
error("Error in grammar (stat) after read( with " + look);
break;
// ... completare ...
}
// ... completare ...
private void b_expr(int ltrue, int lfalse) {
// ... completare ...
expr();
if (look == Word.eq) {
match(Tag.RELOP);
expr();
// ... completare ...
}
// ... completare ...
}
// ... completare ...
private void exprp() {
switch(look.tag) {
case '+':
match('+');
term();
code.emit(OpCode.iadd);
exprp();
break;
// ... completare ...
}
}
// ... completare ...
}