forked from JavaTX/JavaCompilerCore
Merge branch 'bytecode2' of ssh://gohorb.ba-horb.de/bahome/projekt/git/JavaCompilerCore into bytecode2
This commit is contained in:
commit
f46d26e53f
24
doc/parser.md
Normal file
24
doc/parser.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Dateien
|
||||||
|
* sämtliche Datein im Ordner de.dhbwstuttgart.parser gehören zum Parser
|
||||||
|
* Auch zu beachten: pom.xml
|
||||||
|
* Ein Teil der pom.xml instruiert maven zur Kompilierung der Java8.g4 Datei
|
||||||
|
* VORSICHT! Wird nicht zwangsläufig von der IDE ausgeführt
|
||||||
|
* siehe Kapitel "Grammatik -> Parser"
|
||||||
|
|
||||||
|
|
||||||
|
## Unterordner antlr
|
||||||
|
* Java8.g4
|
||||||
|
* die eigentliche Java Grammatik
|
||||||
|
* hier wurden Anpassungen vorgenommen, damit sie auch typloses Java annimmt
|
||||||
|
* alle anderen Dateien in diesem Ordner sind vom ANTLR-Parsergenerator autogeneriert
|
||||||
|
|
||||||
|
## Unterordner SyntaxTreeGenerator
|
||||||
|
* SyntaxTreeGenerator
|
||||||
|
* TODO
|
||||||
|
|
||||||
|
# Grammatik -> Parser
|
||||||
|
* Die Antlr-Grammatik (Java8.g4) wandelt
|
||||||
|
* Folgende Stellen sind relevant
|
||||||
|
* TODO
|
||||||
|
|
||||||
|
|
@ -223,7 +223,7 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Label endLabel = new Label();
|
Label endLabel = new Label();
|
||||||
// this case for while loops
|
// this case for while loops and If statements
|
||||||
if (statement instanceof LoopStmt)
|
if (statement instanceof LoopStmt)
|
||||||
mv.visitLabel(endLabel);
|
mv.visitLabel(endLabel);
|
||||||
|
|
||||||
@ -270,6 +270,8 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
case LESSEQUAL:
|
case LESSEQUAL:
|
||||||
case BIGGERTHAN:
|
case BIGGERTHAN:
|
||||||
case BIGGEREQUAL:
|
case BIGGEREQUAL:
|
||||||
|
case EQUAL:
|
||||||
|
case NOTEQUAL:
|
||||||
Label branchLabel = new Label();
|
Label branchLabel = new Label();
|
||||||
doVisitRelOpInsn(op, largerType, branchLabel, endLabel);
|
doVisitRelOpInsn(op, largerType, branchLabel, endLabel);
|
||||||
break;
|
break;
|
||||||
@ -644,7 +646,10 @@ public class BytecodeGenMethod implements StatementVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(IfStmt ifStmt) {
|
public void visit(IfStmt ifStmt) {
|
||||||
System.out.println("If");
|
statement = new IfStatement(ifStmt.expr, ifStmt.then_block, ifStmt.else_block);
|
||||||
|
isBinaryExp = statement.isExprBinary();
|
||||||
|
ifStmt.expr.accept(this);
|
||||||
|
statement = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
31
src/de/dhbwstuttgart/bytecode/IfStatement.java
Normal file
31
src/de/dhbwstuttgart/bytecode/IfStatement.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import org.objectweb.asm.Label;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Statement;
|
||||||
|
|
||||||
|
public class IfStatement extends AStatement{
|
||||||
|
|
||||||
|
private Statement then_block;
|
||||||
|
private Statement else_block;
|
||||||
|
|
||||||
|
public IfStatement(Expression expr, Statement then_block, Statement else_block) {
|
||||||
|
super(expr);
|
||||||
|
this.then_block = then_block;
|
||||||
|
this.else_block = else_block;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void genBCForRelOp(MethodVisitor mv,Label branchLabel, Label endLabel, BytecodeGenMethod bytecodeGenMethod) {
|
||||||
|
bytecodeGenMethod.isBinary(false);
|
||||||
|
this.then_block.accept(bytecodeGenMethod);
|
||||||
|
|
||||||
|
mv.visitLabel(branchLabel);
|
||||||
|
this.else_block.accept(bytecodeGenMethod);
|
||||||
|
// mv.visitLabel(endLabel);
|
||||||
|
// mv.visitJumpInsn(Opcodes.GOTO, endLabel);
|
||||||
|
}
|
||||||
|
}
|
@ -178,7 +178,6 @@ public class Signature {
|
|||||||
if(hasTPHs(ref))
|
if(hasTPHs(ref))
|
||||||
createSignatureForParameterizedType(ref);
|
createSignatureForParameterizedType(ref);
|
||||||
|
|
||||||
System.out.println("HAS WC = " + hasWC(ref));
|
|
||||||
if(hasWC(ref))
|
if(hasWC(ref))
|
||||||
createSigForParamTypeWithWC(ref);
|
createSigForParamTypeWithWC(ref);
|
||||||
}
|
}
|
||||||
@ -234,7 +233,6 @@ public class Signature {
|
|||||||
if(p instanceof WildcardType) {
|
if(p instanceof WildcardType) {
|
||||||
if(((WildcardType) p).getInnerType() instanceof GenericRefType) {
|
if(((WildcardType) p).getInnerType() instanceof GenericRefType) {
|
||||||
String name = new TypeToSignature().visit((GenericRefType)((WildcardType) p).getInnerType());
|
String name = new TypeToSignature().visit((GenericRefType)((WildcardType) p).getInnerType());
|
||||||
System.out.println("NAME WC = " + name);
|
|
||||||
if(!genericsAndBoundsMethod.containsKey(name) && !genericsAndBounds.containsKey(name)) {
|
if(!genericsAndBoundsMethod.containsKey(name) && !genericsAndBounds.containsKey(name)) {
|
||||||
sw.visitFormalTypeParameter(name);
|
sw.visitFormalTypeParameter(name);
|
||||||
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
sw.visitClassBound().visitClassType(Type.getInternalName(Object.class));
|
||||||
|
@ -34,9 +34,9 @@ public class TypeToSignature implements TypeVisitor<String> {
|
|||||||
// params += "L"+param.toString().replace(".", "/");
|
// params += "L"+param.toString().replace(".", "/");
|
||||||
// }
|
// }
|
||||||
params += param.acceptTV(new TypeToSignature());
|
params += param.acceptTV(new TypeToSignature());
|
||||||
if(!(param instanceof RefType))
|
|
||||||
|
if(param instanceof TypePlaceholder)
|
||||||
params += ";";
|
params += ";";
|
||||||
// if(it.hasNext())params += ";";
|
|
||||||
}
|
}
|
||||||
params += ">";
|
params += ">";
|
||||||
}
|
}
|
||||||
|
@ -36,8 +36,9 @@ public class Tph5Test {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
Method m = classToTest.getDeclaredMethod("m", Object.class, Object.class, Object.class);
|
// Method m = classToTest.getDeclaredMethod("m", Object.class, Object.class, Object.class);
|
||||||
Object result = m.invoke(instanceOfClass, "xx",2,3);
|
Method m = classToTest.getDeclaredMethod("m", Object.class, Object.class);
|
||||||
|
// Object result = m.invoke(instanceOfClass, "xx",2,3);
|
||||||
|
|
||||||
//assertEquals(2,result);
|
//assertEquals(2,result);
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,32 @@
|
|||||||
import java.lang.Integer;
|
import java.lang.Integer;
|
||||||
|
|
||||||
class Faculty {
|
public class Faculty {
|
||||||
|
|
||||||
m () {
|
m (x) {
|
||||||
|
|
||||||
var fact = (x) -> {
|
// var fact = (x) -> {
|
||||||
if (x == 1) {
|
// if (x == 1) {
|
||||||
return x;
|
// return x;
|
||||||
}
|
// }
|
||||||
else {
|
// else {
|
||||||
return x * (fact.apply(x-1));
|
// return x * (fact.apply(x-1));
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
return fact;
|
// return fact;
|
||||||
|
// var x = 13;
|
||||||
|
// if(x>22) {
|
||||||
|
// return 0;
|
||||||
|
// }else if(x <1){
|
||||||
|
// return x;
|
||||||
|
// }else {
|
||||||
|
// return 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (x == 1) {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return x * m(x-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,13 @@
|
|||||||
public class Tph5 {
|
public class Tph5 {
|
||||||
m(a,b,c){
|
// m(a,b,c){
|
||||||
a = c;
|
// a = c;
|
||||||
b = c;
|
// b = c;
|
||||||
return a;
|
// return a;
|
||||||
|
// }
|
||||||
|
|
||||||
|
m(x,y){
|
||||||
|
x = m2(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m2(y) { return y; }
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user