This commit is contained in:
Francesco Mecca 2019-07-04 16:09:56 +02:00
parent 5211833f3f
commit 94b459ec45
23 changed files with 85298 additions and 0 deletions

View file

@ -0,0 +1,80 @@
import java.util.LinkedList;
import java.io.*;
public class CodeGenerator {
LinkedList <Instruction> instructions = new LinkedList <Instruction>();
int label=0;
public void emit( OpCode opCode) {
instructions.add( new Instruction(opCode));
}
public void emit( OpCode opCode , int operand ) {
instructions.add( new Instruction( opCode, operand ));
}
public void emitLabel (int operand ) {
emit( OpCode.label , operand );
}
public int newLabel () {
return label++;
}
public void toJasmin () throws IOException{
PrintWriter out = new PrintWriter(new FileWriter("C:\\Users\\sproston\\Documents\\LFT1718\\CommandLine\\Output\\Output.j"));
String temp = "";
temp = temp + header;
while(instructions.size() > 0){
Instruction tmp = instructions.remove();
temp = temp + tmp.toJasmin();
}
temp = temp + footer;
out.println(temp);
out.flush();
out.close();
}
private static final String header = ".class public Output \n"+ ".super java/lang/Object\n"
+ "\n"
+ ".method public <init>()V\n"
+ " aload_0\n"
+ " invokenonvirtual java/lang/Object/<init>()V\n"
+ " return\n"
+ ".end method\n"
+ "\n"
+ ".method public static print(I)V\n"
+ " .limit stack 2\n"
+ " getstatic java/lang/System/out Ljava/io/PrintStream;\n"
+ " iload_0 \n"
+ " invokestatic java/lang/Integer/toString(I)Ljava/lang/String;\n"
+ " invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V\n"
+ " return\n"
+ ".end method\n"
+ "\n"
+ ".method public static read()I\n"
+ " .limit stack 3\n"
+ " new java/util/Scanner\n"
+ " dup\n"
+ " getstatic java/lang/System/in Ljava/io/InputStream;\n"
+ " invokespecial java/util/Scanner/<init>(Ljava/io/InputStream;)V\n"
+ " invokevirtual java/util/Scanner/next()Ljava/lang/String;\n"
+ " invokestatic java/lang/Integer.parseInt(Ljava/lang/String;)I\n"
+ " ireturn\n"
+ ".end method\n"
+ ".method public static run()V\n"
+ " .limit stack 1024\n"
+ " .limit locals 256\n";
private static final String footer = " return\n"
+ ".end method\n"
+ "\n"
+ ".method public static main([Ljava/lang/String;)V\n"
+ " invokestatic Output/run()V\n"
+ " return\n"
+ ".end method\n";
}

View file

@ -0,0 +1,38 @@
public class Instruction {
OpCode opCode ;
int operand ;
public Instruction ( OpCode opCode) {
this.opCode = opCode;
}
public Instruction ( OpCode opCode , int operand ) {
this.opCode = opCode;
this.operand = operand;
}
public String toJasmin () {
String temp="";
switch (opCode) {
case ldc : temp = " ldc "+ operand + "\n"; break;
case iadd : temp = " iadd " + "\n"; break;
case invokestatic : if( operand == 1) temp = " invokestatic "+ "Output/print(I)V" + "\n";
else temp =" invokestatic " + "Output/read()I" + "\n"; break;
case imul : temp = " imul " + "\n"; break;
case idiv : temp = " idiv " + "\n"; break;
case isub : temp = " isub " + "\n"; break;
case istore : temp = " istore " + operand + "\n"; break;
case iload : temp = " iload " + operand + "\n"; break;
case if_icmpeq : temp = " if_icmpeq L" + operand + "\n"; break;
case if_icmple : temp = " if_icmple L" + operand + "\n"; break;
case if_icmplt : temp = " if_icmplt L" + operand + "\n"; break;
case if_icmpne : temp = " if_icmpne L" + operand + "\n"; break;
case if_icmpge : temp = " if_icmpge L" + operand + "\n"; break;
case if_icmpgt : temp = " if_icmpgt L" + operand + "\n"; break;
case ifne : temp = " ifne L" + operand + "\n"; break;
case GOto : temp = " goto L" + operand + "\n" ; break;
case label : temp = "L" + operand + ":\n"; break;
}
return temp;
}
}

View file

@ -0,0 +1,6 @@
public enum OpCode {
ldc , imul , idiv , iadd ,
isub , istore , iload ,
if_icmpeq , if_icmple , if_icmplt , if_icmpne, if_icmpge ,
if_icmpgt , ifne , GOto , invokestatic , label
}

View file

@ -0,0 +1,21 @@
import java.util.*;
public class SymbolTable {
Map <String, Integer> OffsetMap = new HashMap <String,Integer>();
public void insert( String s, int address ) {
if( !OffsetMap.containsValue(address) )
OffsetMap.put(s,address);
else
throw new IllegalArgumentException("Reference to a memory location already occupied by another variable");
}
public int lookupAddress ( String s ) {
if( OffsetMap.containsKey(s) )
return OffsetMap.get(s);
else
return -1;
// throw new IllegalArgumentException("Unknown variable");
}
}

View file

@ -0,0 +1,102 @@
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 ...
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

10832
anno2/Sem2/lft/lab/main-6.pdf Normal file

File diff suppressed because one or more lines are too long

12940
anno2/Sem2/lft/lab/main-7.pdf Normal file

File diff suppressed because one or more lines are too long

22067
anno2/Sem2/lft/lab/main-8.pdf Normal file

File diff suppressed because one or more lines are too long

4202
anno2/Sem2/lft/lab/main.pdf Normal file

File diff suppressed because it is too large Load diff

4322
anno2/Sem2/lft/lab/main2.pdf Normal file

File diff suppressed because it is too large Load diff

9434
anno2/Sem2/lft/lab/main3.pdf Normal file

File diff suppressed because one or more lines are too long

9560
anno2/Sem2/lft/lab/main4.pdf Normal file

File diff suppressed because one or more lines are too long

11694
anno2/Sem2/lft/lab/main5.pdf Normal file

File diff suppressed because one or more lines are too long