forked from JavaTX/JavaCompilerCore
Plugin deploy backup
This commit is contained in:
commit
da41857a4f
22
.classpath
22
.classpath
@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<classpath>
|
|
||||||
<classpathentry kind="src" path="src"/>
|
|
||||||
<classpathentry kind="src" path="test"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
|
||||||
<classpathentry kind="lib" path="lib/bcel-6.1-SNAPSHOT.jar" sourcepath="lib/bcel-6.1-SNAPSHOT-sources.jar"/>
|
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
|
||||||
<classpathentry kind="lib" path="lib/antlr-complete.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/annotations-2.0.1.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/bcel-6.1-SNAPSHOT-sources.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/cloning.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/commons-bcel6-6.0-SNAPSHOT.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/javassist-3.19.0-GA.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/junit-4.0.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/log4j-1.2.12.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/reflections-0.9.10-javadoc.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/reflections-0.9.10-sources.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/reflections-0.9.10.jar" sourcepath="/reflections/src"/>
|
|
||||||
<classpathentry kind="lib" path="lib/guava-22.0.jar" sourcepath="lib/guava-22.0-sources.jar"/>
|
|
||||||
<classpathentry kind="lib" path="lib/guava-15.0.jar"/>
|
|
||||||
<classpathentry kind="output" path="bin"/>
|
|
||||||
</classpath>
|
|
10
.gitignore
vendored
10
.gitignore
vendored
@ -10,3 +10,13 @@ bin
|
|||||||
*.jar
|
*.jar
|
||||||
*.war
|
*.war
|
||||||
*.ear
|
*.ear
|
||||||
|
|
||||||
|
# IDEs
|
||||||
|
.classpath
|
||||||
|
*.iml
|
||||||
|
.idea/
|
||||||
|
/target/
|
||||||
|
.DS_Store
|
||||||
|
.project
|
||||||
|
.settings/
|
||||||
|
/target/
|
||||||
|
22
.idea/libraries/lib.xml
generated
22
.idea/libraries/lib.xml
generated
@ -1,22 +0,0 @@
|
|||||||
<component name="libraryTable">
|
|
||||||
<library name="lib">
|
|
||||||
<CLASSES>
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/log4j-1.2.12.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/guava-10.0.1.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/bcel-6.1-SNAPSHOT.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/bcel-6.1-SNAPSHOT-sources.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/annotations-2.0.1.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/guava-15.0.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/junit-4.0.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/commons-bcel6-6.0-SNAPSHOT.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/reflections-0.9.10-javadoc.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/reflections-0.9.10.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/cloning.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/javassist-3.19.0-GA.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/reflections-0.9.10-sources.jar!/" />
|
|
||||||
<root url="jar://$PROJECT_DIR$/lib/antlr-complete.jar!/" />
|
|
||||||
</CLASSES>
|
|
||||||
<JAVADOC />
|
|
||||||
<SOURCES />
|
|
||||||
</library>
|
|
||||||
</component>
|
|
17
.project
17
.project
@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>JavaCompilerCore</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
@ -1,12 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
|
||||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
|
||||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
|
||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
|
||||||
org.eclipse.jdt.core.compiler.source=1.8
|
|
@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="WEB_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
|
||||||
<exclude-output />
|
|
||||||
<content url="file://$MODULE_DIR$" />
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="WEB_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
|
||||||
<exclude-output />
|
|
||||||
<content url="file://$MODULE_DIR$" />
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/cloning.jar
BIN
lib/cloning.jar
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.
2
pom.xml
2
pom.xml
@ -42,7 +42,7 @@
|
|||||||
<build>
|
<build>
|
||||||
<directory>target</directory>
|
<directory>target</directory>
|
||||||
<outputDirectory>target/classes</outputDirectory>
|
<outputDirectory>target/classes</outputDirectory>
|
||||||
<finalName>${project.artifactId}-${project.version}</finalName>
|
<finalName>${artifactId}-${version}</finalName>
|
||||||
<testOutputDirectory>target/test-classes</testOutputDirectory>
|
<testOutputDirectory>target/test-classes</testOutputDirectory>
|
||||||
<sourceDirectory>src/</sourceDirectory>
|
<sourceDirectory>src/</sourceDirectory>
|
||||||
<testSourceDirectory>test/</testSourceDirectory>
|
<testSourceDirectory>test/</testSourceDirectory>
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="JAVA_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
|
||||||
<exclude-output />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
BIN
src/de/dhbwstuttgart/.DS_Store
vendored
Normal file
BIN
src/de/dhbwstuttgart/.DS_Store
vendored
Normal file
Binary file not shown.
366
src/de/dhbwstuttgart/bytecode/BytecodeGen.java
Normal file
366
src/de/dhbwstuttgart/bytecode/BytecodeGen.java
Normal file
@ -0,0 +1,366 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.FieldVisitor;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Literal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Null;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
|
public class BytecodeGen implements ASTVisitor {
|
||||||
|
|
||||||
|
ClassWriter cw =new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
|
||||||
|
// String methDesc;
|
||||||
|
|
||||||
|
String type;
|
||||||
|
|
||||||
|
String className;
|
||||||
|
private boolean isInterface;
|
||||||
|
private ResultSet resultSet;
|
||||||
|
private int indexOfFirstParam = 0;
|
||||||
|
|
||||||
|
// stores parameter, local vars and the next index on the local variable table, which use for aload_i, astore_i,...
|
||||||
|
HashMap<String, Integer> paramsAndLocals = new HashMap<>();
|
||||||
|
byte[] bytecode;
|
||||||
|
HashMap<String,byte[]> classFiles;
|
||||||
|
|
||||||
|
public BytecodeGen(HashMap<String,byte[]> classFiles, ResultSet resultSet) {
|
||||||
|
this.classFiles = classFiles;
|
||||||
|
this.resultSet = resultSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SourceFile sourceFile) {
|
||||||
|
for(ClassOrInterface cl : sourceFile.getClasses()) {
|
||||||
|
isInterface = (cl.getModifiers()&512)==512;
|
||||||
|
System.out.println("IS Interface = "+"modifiers= "+cl.getModifiers()+" ->"+(cl.getModifiers()&512) + isInterface);
|
||||||
|
BytecodeGen classGen = new BytecodeGen(classFiles, resultSet);
|
||||||
|
cl.accept(classGen);
|
||||||
|
classGen.writeClass(cl.getClassName().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeClass(String name) {
|
||||||
|
bytecode = cw.toByteArray();
|
||||||
|
classFiles.put(name, bytecode);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap<String,byte[]> getClassFiles() {
|
||||||
|
return classFiles;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void visit(ClassOrInterface classOrInterface) {
|
||||||
|
className = classOrInterface.getClassName().toString();
|
||||||
|
// access flages??
|
||||||
|
cw.visit(Opcodes.V1_8, classOrInterface.getModifiers()+Opcodes.ACC_SUPER, classOrInterface.getClassName().toString()
|
||||||
|
, null, classOrInterface.getSuperClass().toString().replace(".", "/"), null);
|
||||||
|
|
||||||
|
// for each field in the class
|
||||||
|
for(Field f : classOrInterface.getFieldDecl()) {
|
||||||
|
System.out.println("get Fields");
|
||||||
|
System.out.println(f.getName());
|
||||||
|
f.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Constructor c : classOrInterface.getConstructors()) {
|
||||||
|
c.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Method m : classOrInterface.getMethods()) {
|
||||||
|
m.accept(this);
|
||||||
|
}
|
||||||
|
cw.visitSource(classOrInterface.getClassName().toString()+".jav", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Constructor field) {
|
||||||
|
Descriptor desc = new Descriptor(field, resultSet);
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", desc.getDesc(), null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
System.out.println("-----Constructor-----");
|
||||||
|
BytecodeGenMethod gen = new BytecodeGenMethod(className,resultSet,field, mv,paramsAndLocals,desc.getDesc(),cw,isInterface);
|
||||||
|
|
||||||
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
mv.visitMaxs(0, 0);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Method method) {
|
||||||
|
// TODO: check if the method is static => if static then the first param will be stored in pos 0
|
||||||
|
// else it will be stored in pos 1 and this will be stored in pos 0
|
||||||
|
method.getParameterList().accept(this);
|
||||||
|
Descriptor methDesc = new Descriptor(method,resultSet);
|
||||||
|
System.out.println("-----Method-----");
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, method.getName(), methDesc.getDesc(), null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
|
||||||
|
BytecodeGenMethod gen = new BytecodeGenMethod(className,resultSet,method, mv,paramsAndLocals,methDesc.getDesc(),cw,isInterface);
|
||||||
|
mv.visitMaxs(0, 0);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ParameterList formalParameters) {
|
||||||
|
paramsAndLocals = new HashMap<>();
|
||||||
|
Iterator<FormalParameter> itr = formalParameters.iterator();
|
||||||
|
int i = 1;
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
paramsAndLocals.put(fp.getName(), i);
|
||||||
|
fp.accept(this);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(FormalParameter formalParameter) {
|
||||||
|
formalParameter.getType().accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(RefType refType) {
|
||||||
|
type = "L"+refType.toString()+";";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SuperWildcardType superWildcardType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(TypePlaceholder typePlaceholder) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ExtendsWildcardType extendsWildcardType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(GenericRefType genericRefType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ??
|
||||||
|
@Override
|
||||||
|
public void visit(FieldVar fieldVar) {
|
||||||
|
System.out.println("in fieldvar");
|
||||||
|
// cw.newField(fieldVar.receiver.toString(), fieldVar.fieldVarName.toString(), fieldVar.getType().toString());
|
||||||
|
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, fieldVar.fieldVarName, "L"+fieldVar.getType()+";", null, null);
|
||||||
|
fv.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
// access flages?? modifiers
|
||||||
|
@Override
|
||||||
|
public void visit(Field field) {
|
||||||
|
System.out.println("in field");
|
||||||
|
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, field.getName(), "L"+field.getType().toString().replace(".", "/")+";", null, null);
|
||||||
|
fv.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Assign assign) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Binary binary) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Block block) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(CastExpr castExpr) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(EmptyStmt emptyStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ForStmt forStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(IfStmt ifStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(InstanceOf instanceOf) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVar localVar) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVarDecl localVarDecl) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(MethodCall methodCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewClass methodCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewArray newArray) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Return aReturn) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ReturnVoid aReturn) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(StaticClassName staticClassName) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Super aSuper) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(This aThis) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(UnaryPlus unaryPlus) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(WhileStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(DoStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Null aNull) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
// ???
|
||||||
|
@Override
|
||||||
|
public void visit(Literal literal) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ArgumentList argumentList) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(GenericTypeVar genericTypeVar) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(GenericDeclarationList genericTypeVars) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToField assignLeftSide) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToLocal assignLeftSide) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SuperCall superCall) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ExpressionReceiver expressionReceiver) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
417
src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java
Normal file
417
src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java
Normal file
@ -0,0 +1,417 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.lang.invoke.CallSite;
|
||||||
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.lang.invoke.MethodHandles;
|
||||||
|
import java.lang.invoke.MethodType;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.Handle;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Method;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Literal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Null;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
|
public class BytecodeGenMethod implements StatementVisitor{
|
||||||
|
|
||||||
|
private Method m;
|
||||||
|
private MethodVisitor mv;
|
||||||
|
private HashMap<String, Integer> paramsAndLocals = new HashMap<>();
|
||||||
|
private String desc;
|
||||||
|
private String className;
|
||||||
|
private int lamCounter;
|
||||||
|
private ClassWriter cw;
|
||||||
|
private ResultSet resultSet;
|
||||||
|
private boolean isInterface;
|
||||||
|
|
||||||
|
//for tests **
|
||||||
|
private String fieldName;
|
||||||
|
private String fieldDesc;
|
||||||
|
private Expression rightSideTemp;
|
||||||
|
private String where;
|
||||||
|
private boolean isRightSideALambda = false;
|
||||||
|
private KindOfLambda kindOfLambda;
|
||||||
|
|
||||||
|
private ArrayList<RefTypeOrTPHOrWildcardOrGeneric> varsFunInterface;
|
||||||
|
|
||||||
|
public BytecodeGenMethod(String className,ResultSet resultSet, Method m, MethodVisitor mv, HashMap<String, Integer> paramsAndLocals,
|
||||||
|
String desc, ClassWriter cw, boolean isInterface) {
|
||||||
|
|
||||||
|
this.where = "<<<<<< NORMAL METHOD >>>>>>";
|
||||||
|
|
||||||
|
this.className = className;
|
||||||
|
this.resultSet = resultSet;
|
||||||
|
this.m = m;
|
||||||
|
this.mv = mv;
|
||||||
|
this.paramsAndLocals = paramsAndLocals;
|
||||||
|
this.desc = desc;
|
||||||
|
this.cw = cw;
|
||||||
|
this.isInterface = isInterface;
|
||||||
|
this.lamCounter = -1;
|
||||||
|
|
||||||
|
this.varsFunInterface = new ArrayList<>();
|
||||||
|
System.out.println("PARAMS = "+this.paramsAndLocals.size());
|
||||||
|
this.m.block.accept(this);
|
||||||
|
System.out.println("PARAMS = "+this.paramsAndLocals.size());
|
||||||
|
for(int i = 0; i<this.paramsAndLocals.size();i++) {
|
||||||
|
System.out.println(this.paramsAndLocals.keySet().toArray()[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public BytecodeGenMethod(LambdaExpression lambdaExpression,ResultSet resultSet ,MethodVisitor mv,
|
||||||
|
String desc,int indexOfFirstParamLam, boolean isInterface) {
|
||||||
|
System.out.println("\t\t++++++IN LAMBDA -------");
|
||||||
|
|
||||||
|
this.where = "<<<<<< LAMBDA METHOD >>>>>>";
|
||||||
|
this.resultSet = resultSet;
|
||||||
|
this.mv = mv;
|
||||||
|
this.desc = desc;
|
||||||
|
this.isInterface = isInterface;
|
||||||
|
this.lamCounter = -1;
|
||||||
|
this.varsFunInterface = new ArrayList<>();
|
||||||
|
|
||||||
|
Iterator<FormalParameter> itr = lambdaExpression.params.iterator();
|
||||||
|
int i = indexOfFirstParamLam;
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
this.paramsAndLocals.put(fp.getName(), i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
lambdaExpression.methodBody.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getResolvedType(RefTypeOrTPHOrWildcardOrGeneric type) {
|
||||||
|
return resultSet.resolveType(type).resolvedType.toString().replace(".", "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Block block) {
|
||||||
|
for(Statement stmt : block.getStatements()) {
|
||||||
|
System.out.println(where);
|
||||||
|
System.out.println("Stmt : " + stmt.toString());
|
||||||
|
stmt.accept(this);
|
||||||
|
System.out.println("--------------------------\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SuperCall superCall) {
|
||||||
|
superCall.receiver.accept(this);
|
||||||
|
superCall.arglist.accept(this);
|
||||||
|
// mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", superCall.name, desc,false);
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), superCall.name, desc,isInterface);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ??
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVar localVar) {
|
||||||
|
System.out.println("in Local Var: " + localVar.name);
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, paramsAndLocals.get(localVar.name));
|
||||||
|
}
|
||||||
|
// ??
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVarDecl localVarDecl) {
|
||||||
|
// Integer i;
|
||||||
|
// paramsAndLocals.put(localVarDecl.getName(), paramsAndLocals.size()+1);
|
||||||
|
System.out.println("In localVarDecl :: "+localVarDecl.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Assign assign) {
|
||||||
|
System.out.println("Assign : \nright = "+assign.rightSide + "\nLeft = " + assign.lefSide);
|
||||||
|
|
||||||
|
// if the right side is a lambda => the left side must be a functional interface
|
||||||
|
if(assign.rightSide.getClass().equals(LambdaExpression.class)) {
|
||||||
|
isRightSideALambda = true;
|
||||||
|
}else {
|
||||||
|
isRightSideALambda = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("\t isRight Side lambda: " + isRightSideALambda);
|
||||||
|
if(assign.lefSide.getClass().equals(AssignToField.class)) {
|
||||||
|
// load_0, ldc or .. then putfield
|
||||||
|
this.rightSideTemp = assign.rightSide;
|
||||||
|
assign.lefSide.accept(this);
|
||||||
|
}else {
|
||||||
|
assign.rightSide.accept(this);
|
||||||
|
assign.lefSide.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Binary binary) {
|
||||||
|
System.out.println("\t++ In Binary: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
|
System.out.println("\n++ In Lambda: ");
|
||||||
|
this.lamCounter++;
|
||||||
|
Descriptor lamDesc = new Descriptor(lambdaExpression, resultSet);
|
||||||
|
//Call site, which, when invoked, returns an instance of the functional interface to which
|
||||||
|
//the lambda is being converted
|
||||||
|
MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
|
||||||
|
MethodType.class, MethodType.class, MethodHandle.class, MethodType.class);
|
||||||
|
|
||||||
|
|
||||||
|
Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory",
|
||||||
|
"metafactory", mt.toMethodDescriptorString(), false);
|
||||||
|
String methodName = "lambda$new$" + this.lamCounter;
|
||||||
|
// Type erasure
|
||||||
|
Type arg1 = Type.getMethodType(lamDesc.getDesc());
|
||||||
|
// real Type
|
||||||
|
Type arg3 = Type.getMethodType(lamDesc.getDesc());
|
||||||
|
|
||||||
|
int staticOrSpecial=0;
|
||||||
|
int staticOrInstance=0;
|
||||||
|
int indexOfFirstParamLam = 0;
|
||||||
|
this.kindOfLambda = new KindOfLambda(lambdaExpression);
|
||||||
|
|
||||||
|
if(kindOfLambda.isInstanceCapturingLambda()) {
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
staticOrSpecial = Opcodes.H_INVOKESPECIAL;
|
||||||
|
indexOfFirstParamLam = 1;
|
||||||
|
}else {
|
||||||
|
staticOrSpecial = Opcodes.H_INVOKESTATIC;
|
||||||
|
staticOrInstance = Opcodes.ACC_STATIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
// first check if capturing lambda then invokestatic or invokespecial
|
||||||
|
Handle arg2 = new Handle(staticOrSpecial, this.className, methodName,
|
||||||
|
arg3.toString(),false);
|
||||||
|
// Descriptor of functional interface methode
|
||||||
|
Descriptor fiMethodDesc = new Descriptor(kindOfLambda.getArgumentList(), lambdaExpression.getType(),resultSet);
|
||||||
|
|
||||||
|
// Desc: (this/nothing)TargetType
|
||||||
|
mv.visitInvokeDynamicInsn("apply", fiMethodDesc.getDesc(), bootstrap,
|
||||||
|
arg1, arg2,arg3);
|
||||||
|
|
||||||
|
MethodVisitor mvLambdaBody = cw.visitMethod(Opcodes.ACC_PRIVATE+ staticOrInstance + Opcodes.ACC_SYNTHETIC,
|
||||||
|
methodName, arg3.toString(), null, null);
|
||||||
|
|
||||||
|
new BytecodeGenMethod(lambdaExpression,this.resultSet,mvLambdaBody,arg3.toString(),indexOfFirstParamLam,isInterface);
|
||||||
|
|
||||||
|
mvLambdaBody.visitMaxs(0, 0);
|
||||||
|
mvLambdaBody.visitEnd();
|
||||||
|
cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
|
||||||
|
Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(CastExpr castExpr) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(EmptyStmt emptyStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(FieldVar fieldVar) {
|
||||||
|
System.out.println("in fieldVar " + fieldVar.fieldVarName + " ** receiver: "+fieldVar.receiver);
|
||||||
|
|
||||||
|
fieldName = fieldVar.fieldVarName;
|
||||||
|
fieldDesc = "L"+getResolvedType(fieldVar.getType())+";";
|
||||||
|
|
||||||
|
fieldVar.receiver.accept(this);
|
||||||
|
// test (if)
|
||||||
|
if(!fieldVar.receiver.getClass().equals(StaticClassName.class)) {
|
||||||
|
mv.visitFieldInsn(Opcodes.GETFIELD,getResolvedType(fieldVar.receiver.getType()),
|
||||||
|
fieldName ,fieldDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// mv.visitFieldInsn(Opcodes.GETSTATIC, fieldVar.receiver.getType().toString().replace(".", "/"),
|
||||||
|
// fieldVar.fieldVarName, fieldVar.getType().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ForStmt forStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(IfStmt ifStmt) {
|
||||||
|
System.out.println("++ IF-Statment: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(InstanceOf instanceOf) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(MethodCall methodCall) {
|
||||||
|
System.out.println(" In Methodcall: (" +methodCall.name+")" );
|
||||||
|
System.out.print("\t\tMethod-Receiver: ");
|
||||||
|
if(methodCall.receiver instanceof ExpressionReceiver){
|
||||||
|
System.out.print(((ExpressionReceiver) methodCall.receiver).expr + "\n");
|
||||||
|
}else{
|
||||||
|
System.out.print(((StaticClassName) methodCall.receiver).getType().toString() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
methodCall.receiver.accept(this);
|
||||||
|
methodCall.arglist.accept(this);
|
||||||
|
|
||||||
|
Descriptor mDesc = new Descriptor(methodCall.arglist, methodCall.getType(),resultSet);
|
||||||
|
|
||||||
|
System.out.println("is Vars empty: "+varsFunInterface.isEmpty());
|
||||||
|
|
||||||
|
// is methodCall.receiver functional Interface)?
|
||||||
|
if(varsFunInterface.contains(methodCall.receiver.getType())) {
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, getResolvedType(methodCall.receiver.getType()),
|
||||||
|
methodCall.name, mDesc.getDesc(), false);
|
||||||
|
}else {
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getResolvedType(methodCall.receiver.getType()),
|
||||||
|
methodCall.name, mDesc.getDesc(), isInterface);
|
||||||
|
}
|
||||||
|
// test
|
||||||
|
// if(!methodCall.getType().toString().equals("V")) {
|
||||||
|
// mv.visitInsn(Opcodes.POP);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewClass methodCall) {
|
||||||
|
System.out.println("In NewClass: ");
|
||||||
|
System.out.println("\t\tname: " + methodCall.name + " *** " + "Receiver: " + methodCall.receiver);
|
||||||
|
|
||||||
|
mv.visitTypeInsn(Opcodes.NEW, methodCall.name.replace(".", "/"));
|
||||||
|
mv.visitInsn(Opcodes.DUP);
|
||||||
|
// creates Descriptor
|
||||||
|
methodCall.arglist.accept(this);
|
||||||
|
String d = "(";
|
||||||
|
for(Expression e : methodCall.arglist.getArguments()) {
|
||||||
|
d = d + "L"+e.getType().toString().replace(".", "/") + ";";
|
||||||
|
}
|
||||||
|
d += ")V";
|
||||||
|
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, methodCall.name.replace(".", "/"), "<init>", d, isInterface);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewArray newArray) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ExpressionReceiver receiver) {
|
||||||
|
System.out.println(" in Receiver");
|
||||||
|
System.out.println(" expr : " + receiver.expr);
|
||||||
|
receiver.expr.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Return aReturn) {
|
||||||
|
aReturn.retexpr.accept(this);
|
||||||
|
mv.visitInsn(Opcodes.ARETURN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ReturnVoid aReturn) {
|
||||||
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(StaticClassName staticClassName) {
|
||||||
|
System.out.println("In StaticClassName: ");
|
||||||
|
// mv.visitMethodInsn(Opcodes.INVOKESTATIC, staticClassName.getType().toString().replace(".", "/"),
|
||||||
|
// staticClassName.toString(), staticClassName.getType().toString(), false);
|
||||||
|
mv.visitFieldInsn(Opcodes.GETSTATIC, staticClassName.getType().toString().replace(".", "/"),
|
||||||
|
fieldName, fieldDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Super aSuper) {
|
||||||
|
System.out.println(">> In Super: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(This aThis) {
|
||||||
|
System.out.println("-> IN This");
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(UnaryPlus unaryPlus) {
|
||||||
|
System.out.println("++ In UnaryPlus: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(WhileStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(DoStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Null aNull) {
|
||||||
|
mv.visitInsn(Opcodes.ACONST_NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Literal literal) {
|
||||||
|
// value?
|
||||||
|
mv.visitLdcInsn(literal.getType().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ArgumentList argumentList) {
|
||||||
|
System.out.println("in ArgumentList: ");
|
||||||
|
for(Expression al : argumentList.getArguments()) {
|
||||||
|
al.accept(this);
|
||||||
|
}
|
||||||
|
System.out.println("out from Argumentlist");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToField assignLeftSide) {
|
||||||
|
if(isRightSideALambda)
|
||||||
|
varsFunInterface.add(assignLeftSide.field.getType());
|
||||||
|
// Loads the an object reference from the local variable
|
||||||
|
// array slot onto the top of the operand stack.
|
||||||
|
assignLeftSide.field.receiver.accept(this);
|
||||||
|
this.rightSideTemp.accept(this);
|
||||||
|
mv.visitFieldInsn(Opcodes.PUTFIELD, assignLeftSide.field.receiver.getType().toString(),
|
||||||
|
assignLeftSide.field.fieldVarName, assignLeftSide.field.getType().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToLocal assignLeftSide) {
|
||||||
|
System.out.println("In Assign To Local: ");
|
||||||
|
if(isRightSideALambda)
|
||||||
|
varsFunInterface.add(assignLeftSide.localVar.getType());
|
||||||
|
paramsAndLocals.put(assignLeftSide.localVar.name, paramsAndLocals.size()+1);
|
||||||
|
mv.visitVarInsn(Opcodes.ASTORE, paramsAndLocals.size());
|
||||||
|
// Debug:::
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
src/de/dhbwstuttgart/bytecode/ClassFile.java
Normal file
14
src/de/dhbwstuttgart/bytecode/ClassFile.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class ClassFile {
|
||||||
|
|
||||||
|
String name;
|
||||||
|
byte[] bytecode;
|
||||||
|
|
||||||
|
public ClassFile(String name, byte[] bytecode) {
|
||||||
|
this.name = name;
|
||||||
|
this.bytecode = bytecode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
112
src/de/dhbwstuttgart/bytecode/Descriptor.java
Normal file
112
src/de/dhbwstuttgart/bytecode/Descriptor.java
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Constructor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Method;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.*;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
|
||||||
|
public class Descriptor {
|
||||||
|
String desc;
|
||||||
|
|
||||||
|
public Descriptor(Method method, ResultSet resultSet) {
|
||||||
|
desc = "(";
|
||||||
|
Iterator<FormalParameter> itr = method.getParameterList().iterator();
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
desc = desc + "L"+resultSet.resolveType(fp.getType()).resolvedType.acceptTV(new TypeToDescriptor())+ ";";
|
||||||
|
}
|
||||||
|
desc = addReturnType(desc,method.getReturnType(), resultSet);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TypeToDescriptor implements TypeVisitor<String>{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String visit(RefType refType) {
|
||||||
|
return refType.getName().toString().replace(".", "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String visit(SuperWildcardType superWildcardType) {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String visit(TypePlaceholder typePlaceholder) {
|
||||||
|
return typePlaceholder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String visit(ExtendsWildcardType extendsWildcardType) {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String visit(GenericRefType genericRefType) {
|
||||||
|
return genericRefType.getParsedName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String addReturnType(String desc2, RefTypeOrTPHOrWildcardOrGeneric returnType, ResultSet resultSet) {
|
||||||
|
System.out.println("DescType = "+returnType.toString());
|
||||||
|
if(resultSet.resolveType(returnType).resolvedType.toString().equals("void")){
|
||||||
|
desc = desc + ")V";
|
||||||
|
}else {
|
||||||
|
desc = desc + ")" + "L"+resultSet.resolveType(returnType).resolvedType.toString().replace(".", "/")+";";
|
||||||
|
}
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Descriptor(Constructor constructor, ResultSet resultSet) {
|
||||||
|
desc = "(";
|
||||||
|
Iterator<FormalParameter> itr = constructor.getParameterList().iterator();
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
desc = desc + "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "/") + ";";
|
||||||
|
}
|
||||||
|
desc = desc + ")V";
|
||||||
|
}
|
||||||
|
|
||||||
|
public Descriptor(LambdaExpression lambdaExpr, ResultSet resultSet) {
|
||||||
|
desc = "(";
|
||||||
|
Iterator<FormalParameter> itr = lambdaExpr.params.iterator();
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
desc = desc + "L"+resultSet.resolveType(fp.getType()).resolvedType.toString().replace(".", "/") + ";";
|
||||||
|
}
|
||||||
|
desc = addReturnType(desc, lambdaExpr.getReturnType(), resultSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Descriptor(ArgumentList argList, RefTypeOrTPHOrWildcardOrGeneric returnType, ResultSet resultSet) {
|
||||||
|
desc = "(";
|
||||||
|
for(Expression e : argList.getArguments()) {
|
||||||
|
desc = desc + "L"+resultSet.resolveType(e.getType()).resolvedType.toString().replace(".", "/") + ";";
|
||||||
|
}
|
||||||
|
desc = addReturnType(desc, returnType, resultSet);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Descriptor(List<RefTypeOrTPHOrWildcardOrGeneric> argumentList,RefTypeOrTPHOrWildcardOrGeneric returnType ,ResultSet resultSet) {
|
||||||
|
desc = "(";
|
||||||
|
Iterator<RefTypeOrTPHOrWildcardOrGeneric> itr = argumentList.iterator();
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
RefTypeOrTPHOrWildcardOrGeneric rt = itr.next();
|
||||||
|
desc = desc + "L"+resultSet.resolveType(rt).resolvedType.toString().replace(".", "/")+";";
|
||||||
|
}
|
||||||
|
desc = desc + ")"+"L"+resultSet.resolveType(returnType).resolvedType.toString().replace(".", "/")+";";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return this.desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
205
src/de/dhbwstuttgart/bytecode/KindOfLambda.java
Normal file
205
src/de/dhbwstuttgart/bytecode/KindOfLambda.java
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Literal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Null;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
|
||||||
|
public class KindOfLambda implements StatementVisitor{
|
||||||
|
private boolean isInstanceCapturingLambda = false;
|
||||||
|
private List<RefTypeOrTPHOrWildcardOrGeneric> argumentList = new ArrayList<>();
|
||||||
|
|
||||||
|
public KindOfLambda(LambdaExpression lambdaExpression) {
|
||||||
|
lambdaExpression.methodBody.accept(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isInstanceCapturingLambda() {
|
||||||
|
return this.isInstanceCapturingLambda;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<RefTypeOrTPHOrWildcardOrGeneric> getArgumentList() {
|
||||||
|
return argumentList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ArgumentList argumentList) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Assign assign) {
|
||||||
|
assign.rightSide.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Binary binary) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Block block) {
|
||||||
|
for(Statement stmt : block.getStatements()) {
|
||||||
|
stmt.accept(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(CastExpr castExpr) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(EmptyStmt emptyStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(FieldVar fieldVar) {
|
||||||
|
fieldVar.receiver.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ForStmt forStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(IfStmt ifStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(InstanceOf instanceOf) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVar localVar) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVarDecl localVarDecl) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(MethodCall methodCall) {
|
||||||
|
methodCall.receiver.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewClass methodCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewArray newArray) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ExpressionReceiver receiver) {
|
||||||
|
receiver.expr.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Return aReturn) {
|
||||||
|
aReturn.retexpr.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ReturnVoid aReturn) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(StaticClassName staticClassName) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Super aSuper) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(This aThis) {
|
||||||
|
this.isInstanceCapturingLambda = true;
|
||||||
|
this.argumentList.add(aThis.getType());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(UnaryPlus unaryPlus) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(WhileStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(DoStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Null aNull) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Literal literal) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToField assignLeftSide) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToLocal assignLeftSide) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SuperCall superCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
150
src/de/dhbwstuttgart/bytecode/Test.java
Normal file
150
src/de/dhbwstuttgart/bytecode/Test.java
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.invoke.CallSite;
|
||||||
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.lang.invoke.MethodHandles;
|
||||||
|
import java.lang.invoke.MethodType;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.objectweb.asm.ClassReader;
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.Handle;
|
||||||
|
import org.objectweb.asm.Label;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
|
||||||
|
public class Test {
|
||||||
|
private static final String rootDirectory = System.getProperty("user.dir") + "/bin/de/dhbwstuttgart/bytecode/";
|
||||||
|
|
||||||
|
protected static ClassLoader getClassLoader() throws Exception {
|
||||||
|
File file = new File(rootDirectory);
|
||||||
|
URL url = file.toURI().toURL();
|
||||||
|
URL[] urls = new URL[] { url };
|
||||||
|
System.out.println(urls[0]);
|
||||||
|
return new URLClassLoader(urls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// Test Lambda
|
||||||
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
|
||||||
|
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "TestClass", null, "java/lang/Object", null);
|
||||||
|
|
||||||
|
cw.visitSource("TestClass.java", null);
|
||||||
|
|
||||||
|
// Create Constructor
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
|
||||||
|
|
||||||
|
// mv.visitMethodInsn(INVOKEDYNAMIC, "#0", "run", "()Ljava/lang/Runnable");
|
||||||
|
//Call site, which, when invoked, returns an instance of the functional interface to which
|
||||||
|
//the lambda is being converted
|
||||||
|
MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
|
||||||
|
MethodType.class, MethodType.class, MethodHandle.class, MethodType.class);
|
||||||
|
|
||||||
|
Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory",
|
||||||
|
mt.toMethodDescriptorString());
|
||||||
|
Handle arg2 = new Handle(Opcodes.H_INVOKESTATIC, "TestClass", "lambda$0", "()V");
|
||||||
|
|
||||||
|
mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap,
|
||||||
|
Type.getMethodType("()V"), arg2,
|
||||||
|
Type.getMethodType("()V"));
|
||||||
|
|
||||||
|
mv.visitVarInsn(Opcodes.ASTORE, 1);
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 1);
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/Runnable", "run", "()V");
|
||||||
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
|
||||||
|
// creates bridge method, contains lambdas body
|
||||||
|
MethodVisitor mvl = cw.visitMethod(Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC, "lambda$0",
|
||||||
|
"()V", null, null);
|
||||||
|
mvl.visitCode();
|
||||||
|
mvl.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
|
||||||
|
mvl.visitLdcInsn("lambda");
|
||||||
|
mvl.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
|
||||||
|
mvl.visitInsn(Opcodes.RETURN);
|
||||||
|
mvl.visitMaxs(2, 0);
|
||||||
|
mvl.visitEnd();
|
||||||
|
|
||||||
|
mv.visitMaxs(1, 2);
|
||||||
|
mv.visitEnd();
|
||||||
|
|
||||||
|
|
||||||
|
cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
|
||||||
|
Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL);
|
||||||
|
cw.visitEnd();
|
||||||
|
|
||||||
|
byte[] b = cw.toByteArray();
|
||||||
|
|
||||||
|
// Test if statement
|
||||||
|
/*
|
||||||
|
* ClassWriter cw = new
|
||||||
|
* ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
|
||||||
|
*
|
||||||
|
* cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+Opcodes.ACC_SUPER, "TestIf", null,
|
||||||
|
* "java/lang/Object", null); MethodVisitor mv =
|
||||||
|
* cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/Boolean;)V", null,
|
||||||
|
* null); mv.visitCode();
|
||||||
|
*
|
||||||
|
* // Label l0 = new Label(); // mv.visitLabel(l0);
|
||||||
|
*
|
||||||
|
* mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
*
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>",
|
||||||
|
* "()V");
|
||||||
|
*
|
||||||
|
* // Label l1 = new Label(); // mv.visitLabel(l1);
|
||||||
|
* mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
|
||||||
|
* "java/lang/Boolean", "booleanValue", "()Z");
|
||||||
|
*
|
||||||
|
* Label label = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, label);
|
||||||
|
*
|
||||||
|
* mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out",
|
||||||
|
* "Ljava/io/PrintStream;"); mv.visitLdcInsn("1");
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
|
||||||
|
* "(Ljava/lang/String;)V");
|
||||||
|
*
|
||||||
|
* Label endLabel = new Label(); mv.visitJumpInsn(Opcodes.GOTO, endLabel);
|
||||||
|
*
|
||||||
|
* mv.visitLabel(label); mv.visitFieldInsn(Opcodes.GETSTATIC,
|
||||||
|
* "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("0");
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
|
||||||
|
* "(Ljava/lang/String;)V");
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* mv.visitLabel(endLabel); mv.visitInsn(Opcodes.RETURN);
|
||||||
|
*
|
||||||
|
* // Label l2 = new Label(); // mv.visitLabel(l2);
|
||||||
|
*
|
||||||
|
* // mv.visitLocalVariable("this", "LTestIf;", null, l0, l2, 0); //
|
||||||
|
* mv.visitLocalVariable("b", "Ljava/lang/Boolean;", null, l0, l2, 1);
|
||||||
|
* mv.visitMaxs(2, 2); mv.visitEnd();
|
||||||
|
*
|
||||||
|
* cw.visitEnd(); byte[] b = cw.toByteArray();
|
||||||
|
*/
|
||||||
|
FileOutputStream output;
|
||||||
|
|
||||||
|
try {
|
||||||
|
output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/TestClass.class"));
|
||||||
|
output.write(b);
|
||||||
|
output.close();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
8
src/de/dhbwstuttgart/bytecode/TestClass.java
Normal file
8
src/de/dhbwstuttgart/bytecode/TestClass.java
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class TestClass {
|
||||||
|
public TestClass() {
|
||||||
|
Runnable lam = () -> System.out.println("lambda");
|
||||||
|
lam.run();
|
||||||
|
}
|
||||||
|
}
|
59
src/de/dhbwstuttgart/bytecode/TestFields.java
Normal file
59
src/de/dhbwstuttgart/bytecode/TestFields.java
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.FieldVisitor;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
public class TestFields {
|
||||||
|
private static final String rootDirectory = System.getProperty("user.dir") + "/bin/de/dhbwstuttgart/bytecode/";
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
|
||||||
|
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "TetsF", null, "java/lang/Object", null);
|
||||||
|
|
||||||
|
cw.visitSource("TetsF.java", null);
|
||||||
|
|
||||||
|
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, "z", Type.INT_TYPE.getDescriptor(), null, null);
|
||||||
|
fv.visitEnd();
|
||||||
|
|
||||||
|
FieldVisitor fvS = cw.visitField(Opcodes.ACC_PUBLIC, "s", "Ljava/lang/String;", null, null);
|
||||||
|
fvS.visitEnd();
|
||||||
|
// Create Constructor
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
mv.visitLdcInsn("");
|
||||||
|
mv.visitFieldInsn(Opcodes.PUTFIELD, "TetsF", "s", "Ljava/lang/String;");
|
||||||
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
mv.visitMaxs(2, 1);
|
||||||
|
mv.visitEnd();
|
||||||
|
|
||||||
|
byte[] b = cw.toByteArray();
|
||||||
|
|
||||||
|
FileOutputStream output;
|
||||||
|
|
||||||
|
try {
|
||||||
|
output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/TetsF.class"));
|
||||||
|
output.write(b);
|
||||||
|
output.close();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
11
src/de/dhbwstuttgart/bytecode/TestIf.java
Normal file
11
src/de/dhbwstuttgart/bytecode/TestIf.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class TestIf {
|
||||||
|
public TestIf(Boolean b) {
|
||||||
|
if(b) {
|
||||||
|
System.out.println("1");
|
||||||
|
}else {
|
||||||
|
System.out.println("0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
src/de/dhbwstuttgart/bytecode/TestMeth.java
Normal file
18
src/de/dhbwstuttgart/bytecode/TestMeth.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class TestMeth {
|
||||||
|
private int z;
|
||||||
|
public String s;
|
||||||
|
public TestMeth(int temp) {
|
||||||
|
this.z = temp;
|
||||||
|
}
|
||||||
|
public void m1(int a, int b) {
|
||||||
|
int y = m2(1,2,3,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int m2(int a, int b, int x, int y) {
|
||||||
|
Integer c = 55;
|
||||||
|
Integer g;
|
||||||
|
return a+b+y+c;
|
||||||
|
}
|
||||||
|
}
|
6
src/de/dhbwstuttgart/bytecode/TetsF.java
Normal file
6
src/de/dhbwstuttgart/bytecode/TetsF.java
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class TetsF {
|
||||||
|
private int z;
|
||||||
|
public String s = "";
|
||||||
|
}
|
8
src/de/dhbwstuttgart/core/ConsoleInterface.java
Executable file → Normal file
8
src/de/dhbwstuttgart/core/ConsoleInterface.java
Executable file → Normal file
@ -3,16 +3,14 @@ package de.dhbwstuttgart.core;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ConsoleInterface {
|
public class ConsoleInterface {
|
||||||
private static final String directory = System.getProperty("user.dir");
|
private static final String directory = System.getProperty("user.dir");
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException, ClassNotFoundException {
|
public static void main(String[] args) throws IOException, ClassNotFoundException {
|
||||||
|
List<File> input = Arrays.asList(args).stream().map((s -> new File(s))).collect(Collectors.toList());
|
||||||
JavaTXCompiler compiler = new JavaTXCompiler();
|
JavaTXCompiler compiler = new JavaTXCompiler(input);
|
||||||
for(String arg : Arrays.asList(args)){
|
|
||||||
compiler.parse(new File(arg));
|
|
||||||
}
|
|
||||||
compiler.typeInference();
|
compiler.typeInference();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
0
src/de/dhbwstuttgart/core/IItemWithOffset.java
Executable file → Normal file
0
src/de/dhbwstuttgart/core/IItemWithOffset.java
Executable file → Normal file
@ -1,11 +1,16 @@
|
|||||||
package de.dhbwstuttgart.core;
|
package de.dhbwstuttgart.core;
|
||||||
|
|
||||||
|
|
||||||
import de.dhbwstuttgart.environment.CompilationEnvironment;
|
import de.dhbwstuttgart.environment.CompilationEnvironment;
|
||||||
import de.dhbwstuttgart.parser.JavaTXParser;
|
import de.dhbwstuttgart.parser.JavaTXParser;
|
||||||
|
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
||||||
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator;
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator;
|
||||||
import de.dhbwstuttgart.parser.antlr.Java8Parser.CompilationUnitContext;
|
import de.dhbwstuttgart.parser.antlr.Java8Parser.CompilationUnitContext;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
||||||
import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory;
|
import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
@ -24,28 +29,73 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
public class JavaTXCompiler {
|
public class JavaTXCompiler {
|
||||||
|
|
||||||
CompilationEnvironment environment;
|
final CompilationEnvironment environment;
|
||||||
|
public final Map<File, SourceFile> sourceFiles = new HashMap<>();
|
||||||
protected List<SourceFile> sourceFiles = new ArrayList<>();
|
|
||||||
/*
|
|
||||||
public JavaTXCompiler(List<File> sourceFiles){
|
|
||||||
|
|
||||||
|
public JavaTXCompiler(File sourceFile) throws IOException, ClassNotFoundException {
|
||||||
|
this(Arrays.asList(sourceFile));
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
public List<ResultSet> typeInference(){
|
public JavaTXCompiler(List<File> sources) throws IOException, ClassNotFoundException {
|
||||||
List<ClassOrInterface> allClasses = new ArrayList<>();
|
environment = new CompilationEnvironment(sources);
|
||||||
for(SourceFile sf : sourceFiles){
|
for (File s : sources) {
|
||||||
|
sourceFiles.put(s, parse(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConstraintSet<Pair> getConstraints() throws ClassNotFoundException {
|
||||||
|
List<ClassOrInterface> allClasses = new ArrayList<>();//environment.getAllAvailableClasses();
|
||||||
|
for (SourceFile sf : sourceFiles.values()) {
|
||||||
allClasses.addAll(sf.getClasses());
|
allClasses.addAll(sf.getClasses());
|
||||||
}
|
}
|
||||||
|
List<ClassOrInterface> importedClasses = new ArrayList<>();
|
||||||
|
//Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC
|
||||||
|
for (File forSourceFile : sourceFiles.keySet())
|
||||||
|
for (JavaClassName name : sourceFiles.get(forSourceFile).getImports()) {
|
||||||
|
//TODO: Hier werden imports von eigenen (.jav) Klassen nicht beachtet
|
||||||
|
ClassOrInterface importedClass = ASTFactory.createClass(
|
||||||
|
ClassLoader.getSystemClassLoader().loadClass(name.toString()));
|
||||||
|
importedClasses.add(importedClass);
|
||||||
|
}
|
||||||
|
allClasses.addAll(importedClasses);
|
||||||
|
|
||||||
|
return new TYPE(sourceFiles.values(), allClasses).getConstraints();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ClassOrInterface> getAvailableClasses(SourceFile forSourceFile) throws ClassNotFoundException {
|
||||||
|
List<ClassOrInterface> allClasses = new ArrayList<>();//environment.getAllAvailableClasses();
|
||||||
|
for (SourceFile sf : sourceFiles.values()) {
|
||||||
|
allClasses.addAll(sf.getClasses());
|
||||||
|
}
|
||||||
|
List<ClassOrInterface> importedClasses = new ArrayList<>();
|
||||||
|
for (JavaClassName name : forSourceFile.getImports()) {
|
||||||
|
//TODO: Hier werden imports von eigenen (.jav) Klassen nicht beachtet
|
||||||
|
ClassOrInterface importedClass = ASTFactory.createClass(
|
||||||
|
ClassLoader.getSystemClassLoader().loadClass(name.toString()));
|
||||||
|
importedClasses.add(importedClass);
|
||||||
|
allClasses.addAll(importedClasses);
|
||||||
|
}
|
||||||
|
return allClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ResultSet> typeInference() throws ClassNotFoundException {
|
||||||
|
List<ClassOrInterface> allClasses = new ArrayList<>();//environment.getAllAvailableClasses();
|
||||||
|
//Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC
|
||||||
|
for(SourceFile sf : this.sourceFiles.values()) {
|
||||||
|
//allClasses.addAll(getAvailableClasses(sf));
|
||||||
|
allClasses.addAll(sf.getClasses());
|
||||||
|
}
|
||||||
|
|
||||||
|
final ConstraintSet<Pair> cons = getConstraints();
|
||||||
|
|
||||||
FiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses);
|
FiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses);
|
||||||
final ConstraintSet<Pair> cons = new TYPE(sourceFiles).getConstraints();
|
|
||||||
ConstraintSet<UnifyPair> unifyCons = UnifyTypeFactory.convert(cons);
|
ConstraintSet<UnifyPair> unifyCons = UnifyTypeFactory.convert(cons);
|
||||||
|
|
||||||
TypeUnify unify = new TypeUnify();
|
TypeUnify unify = new TypeUnify();
|
||||||
Set<Set<UnifyPair>> results = new HashSet<>();
|
Set<Set<UnifyPair>> results = new HashSet<>();
|
||||||
for(List<Constraint<UnifyPair>> xCons : unifyCons.cartesianProduct()){
|
for (List<Constraint<UnifyPair>> xCons : unifyCons.cartesianProduct()) {
|
||||||
Set<UnifyPair> xConsSet = new HashSet<>();
|
Set<UnifyPair> xConsSet = new HashSet<>();
|
||||||
for(Constraint<UnifyPair> constraint : xCons){
|
for (Constraint<UnifyPair> constraint : xCons) {
|
||||||
xConsSet.addAll(constraint);
|
xConsSet.addAll(constraint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,28 +106,27 @@ public class JavaTXCompiler {
|
|||||||
}
|
}
|
||||||
return results.stream().map((unifyPairs ->
|
return results.stream().map((unifyPairs ->
|
||||||
new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList());
|
new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, TypePlaceholder> generateTPHMap(ConstraintSet<Pair> constraints){
|
private Map<String, TypePlaceholder> generateTPHMap(ConstraintSet<Pair> constraints) {
|
||||||
HashMap<String, TypePlaceholder> ret = new HashMap<>();
|
HashMap<String, TypePlaceholder> ret = new HashMap<>();
|
||||||
constraints.map((Pair p)->{
|
constraints.map((Pair p) -> {
|
||||||
if(p.TA1 instanceof TypePlaceholder){
|
if (p.TA1 instanceof TypePlaceholder) {
|
||||||
ret.put(((TypePlaceholder)p.TA1).getName(), (TypePlaceholder) p.TA1);
|
ret.put(((TypePlaceholder) p.TA1).getName(), (TypePlaceholder) p.TA1);
|
||||||
}
|
}
|
||||||
if(p.TA2 instanceof TypePlaceholder){
|
if (p.TA2 instanceof TypePlaceholder) {
|
||||||
ret.put(((TypePlaceholder)p.TA2).getName(), (TypePlaceholder) p.TA2);
|
ret.put(((TypePlaceholder) p.TA2).getName(), (TypePlaceholder) p.TA2);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SourceFile parse(File sourceFile) throws IOException, java.lang.ClassNotFoundException {
|
private SourceFile parse(File sourceFile) throws IOException, java.lang.ClassNotFoundException {
|
||||||
CompilationUnitContext tree = JavaTXParser.parse(sourceFile);
|
CompilationUnitContext tree = JavaTXParser.parse(sourceFile);
|
||||||
SyntaxTreeGenerator generator = new SyntaxTreeGenerator(environment.getRegistry(sourceFile));
|
SyntaxTreeGenerator generator = new SyntaxTreeGenerator(environment.getRegistry(sourceFile), new GenericsRegistry(null));
|
||||||
SourceFile ret = generator.convert(tree);
|
SourceFile ret = generator.convert(tree, environment.packageCrawler);
|
||||||
sourceFiles.add(ret);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -5,11 +5,11 @@ import java.io.IOException;
|
|||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLClassLoader;
|
import java.net.URLClassLoader;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
||||||
import org.reflections.Reflections;
|
import org.reflections.Reflections;
|
||||||
import org.reflections.scanners.ResourcesScanner;
|
import org.reflections.scanners.ResourcesScanner;
|
||||||
import org.reflections.scanners.SubTypesScanner;
|
import org.reflections.scanners.SubTypesScanner;
|
||||||
@ -31,27 +31,41 @@ import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
|||||||
*/
|
*/
|
||||||
public class CompilationEnvironment {
|
public class CompilationEnvironment {
|
||||||
private final List<URL> librarys;
|
private final List<URL> librarys;
|
||||||
|
private final List<File> sourceFiles;
|
||||||
|
public final PackageCrawler packageCrawler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Imitiert die Environment beim Aufruf des JavaCompilers auf einer Menge von java-Dateien
|
* Imitiert die Environment beim Aufruf des JavaCompilers auf einer Menge von java-Dateien
|
||||||
* Die Environment enthält automatisch die Java Standard Library
|
* Die Environment enth<EFBFBD>lt automatisch die Java Standard Library
|
||||||
* @param sourceFiles die zu kompilierenden Dateien
|
* @param sourceFiles die zu kompilierenden Dateien
|
||||||
*/
|
*/
|
||||||
public CompilationEnvironment(List<File> sourceFiles) {
|
public CompilationEnvironment(List<File> sourceFiles) {
|
||||||
String bootClassPath = System.getProperty("sun.boot.class.path");
|
String bootClassPath = System.getProperty("sun.boot.class.path");
|
||||||
librarys = new ArrayList<>();
|
librarys = new ArrayList<>();
|
||||||
for(String path : bootClassPath.split(";")) {
|
for(String path : bootClassPath.split(File.pathSeparator)) {
|
||||||
try {
|
try {
|
||||||
librarys.add(new URL("file:"+path));
|
librarys.add(new URL("file:"+path));
|
||||||
} catch (MalformedURLException e) {
|
} catch (MalformedURLException e) {
|
||||||
new DebugException("Fehler im Classpath auf diesem System");
|
new DebugException("Fehler im Classpath auf diesem System");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.sourceFiles = sourceFiles;
|
||||||
|
this.packageCrawler = new PackageCrawler(librarys);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JavaClassRegistry getRegistry(File forSourceFile) throws ClassNotFoundException, IOException {
|
public JavaClassRegistry getRegistry(File forSourceFile) throws ClassNotFoundException, IOException {
|
||||||
List<String> allNames = new ArrayList<>();
|
Map<String, Integer> allNames;
|
||||||
CompilationUnitContext tree = JavaTXParser.parse(forSourceFile);
|
CompilationUnitContext tree = JavaTXParser.parse(forSourceFile);
|
||||||
return new JavaClassRegistry(GatherNames.getNames(tree, new PackageCrawler(librarys)));
|
allNames = GatherNames.getNames(tree, packageCrawler);
|
||||||
|
return new JavaClassRegistry(allNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ClassOrInterface> getAllAvailableClasses() {
|
||||||
|
List<ClassOrInterface> ret = new ArrayList<>();
|
||||||
|
for(Class c : new PackageCrawler(librarys).getAllAvailableClasses()){
|
||||||
|
ret.add(ASTFactory.createClass(c));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package de.dhbwstuttgart.environment;
|
package de.dhbwstuttgart.environment;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.reflections.Reflections;
|
import org.reflections.Reflections;
|
||||||
import org.reflections.scanners.ResourcesScanner;
|
import org.reflections.scanners.ResourcesScanner;
|
||||||
@ -12,6 +10,7 @@ import org.reflections.util.ConfigurationBuilder;
|
|||||||
import org.reflections.util.FilterBuilder;
|
import org.reflections.util.FilterBuilder;
|
||||||
|
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
import org.reflections.vfs.SystemDir;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hilft beim Durchsuchen von Packages
|
* Hilft beim Durchsuchen von Packages
|
||||||
@ -53,12 +52,25 @@ public class PackageCrawler {
|
|||||||
|
|
||||||
return classes;
|
return classes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getClassNames(String packageName){
|
public Set<Class<?>> getAllAvailableClasses(){
|
||||||
List<String> nameList = new ArrayList();
|
Reflections reflections = new Reflections(new ConfigurationBuilder()
|
||||||
|
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
|
||||||
|
.setUrls(urls));
|
||||||
|
|
||||||
|
Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);
|
||||||
|
|
||||||
|
return classes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Integer> getClassNames(String packageName){
|
||||||
|
Map<String, Integer> nameList = new HashMap<>();
|
||||||
Set<Class<?>> classes = getClassesInPackage(packageName);
|
Set<Class<?>> classes = getClassesInPackage(packageName);
|
||||||
|
if(packageName.equals("java.lang") && ! classes.contains(Object.class)) {
|
||||||
|
classes.add(Object.class);
|
||||||
|
}
|
||||||
for(Class c : classes){
|
for(Class c : classes){
|
||||||
nameList.add(c.getName());
|
nameList.put(c.getName(), c.getTypeParameters().length);
|
||||||
}
|
}
|
||||||
return nameList;
|
return nameList;
|
||||||
}
|
}
|
||||||
|
0
src/de/dhbwstuttgart/exceptions/TypeinferenceException.java
Executable file → Normal file
0
src/de/dhbwstuttgart/exceptions/TypeinferenceException.java
Executable file → Normal file
@ -1,7 +0,0 @@
|
|||||||
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
public class GenericsRegistry extends HashMap<String, GenericContext> {
|
|
||||||
|
|
||||||
}
|
|
@ -3,6 +3,7 @@ package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
|||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
||||||
|
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
import de.dhbwstuttgart.syntaxtree.*;
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.*;
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
@ -22,6 +23,7 @@ public class StatementGenerator {
|
|||||||
private JavaClassRegistry reg;
|
private JavaClassRegistry reg;
|
||||||
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars;
|
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars;
|
||||||
private GenericsRegistry generics;
|
private GenericsRegistry generics;
|
||||||
|
private String VAR_KEYWORD = "var";
|
||||||
|
|
||||||
public StatementGenerator(JavaClassRegistry reg, GenericsRegistry generics, Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars){
|
public StatementGenerator(JavaClassRegistry reg, GenericsRegistry generics, Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars){
|
||||||
this.reg = reg;
|
this.reg = reg;
|
||||||
@ -177,6 +179,14 @@ public class StatementGenerator {
|
|||||||
}else throw new NotImplementedException();
|
}else throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Receiver getReceiver(Expression expr){
|
||||||
|
if(expr instanceof StaticClassName){
|
||||||
|
return (Receiver) expr;
|
||||||
|
}else {
|
||||||
|
return new ExpressionReceiver(expr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.MethodInvocationContext methodInvocationContext) {
|
private Statement convert(Java8Parser.MethodInvocationContext methodInvocationContext) {
|
||||||
String name;
|
String name;
|
||||||
if(methodInvocationContext.methodName()!=null){
|
if(methodInvocationContext.methodName()!=null){
|
||||||
@ -198,7 +208,7 @@ public class StatementGenerator {
|
|||||||
}else throw new NotImplementedException();
|
}else throw new NotImplementedException();
|
||||||
|
|
||||||
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
||||||
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()),new Receiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()), getReceiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,7 +403,7 @@ public class StatementGenerator {
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
RefTypeOrTPHOrWildcardOrGeneric type;
|
RefTypeOrTPHOrWildcardOrGeneric type;
|
||||||
if(declaration.unannTypeOrAuto().unannType()==null){
|
if(declaration.unannTypeOrAuto().unannType().getText().equals(VAR_KEYWORD)){
|
||||||
type = TypePlaceholder.fresh(declaration.getStart());
|
type = TypePlaceholder.fresh(declaration.getStart());
|
||||||
}else{
|
}else{
|
||||||
type = TypeGenerator.convert(declaration.unannTypeOrAuto().unannType(), reg, generics);
|
type = TypeGenerator.convert(declaration.unannTypeOrAuto().unannType(), reg, generics);
|
||||||
@ -699,7 +709,7 @@ public class StatementGenerator {
|
|||||||
}else {
|
}else {
|
||||||
Java8Parser.MethodInvocation_lf_primaryContext ctxt = e.methodInvocation_lf_primary();
|
Java8Parser.MethodInvocation_lf_primaryContext ctxt = e.methodInvocation_lf_primary();
|
||||||
String methodName = ctxt.Identifier().toString();
|
String methodName = ctxt.Identifier().toString();
|
||||||
return new MethodCall(TypePlaceholder.fresh(e.getStart()), new Receiver(expr), methodName, convert(ctxt.argumentList()), e.getStart());
|
return new MethodCall(TypePlaceholder.fresh(e.getStart()), getReceiver(expr), methodName, convert(ctxt.argumentList()), e.getStart());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -807,7 +817,7 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
||||||
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()), new Receiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()), getReceiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.PackageCrawler;
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import java.lang.ClassNotFoundException;
|
import java.lang.ClassNotFoundException;
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
|
||||||
|
import de.dhbwstuttgart.exceptions.TypeinferenceException;
|
||||||
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
||||||
|
import de.dhbwstuttgart.parser.scope.GatherNames;
|
||||||
|
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
import de.dhbwstuttgart.syntaxtree.*;
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
@ -12,14 +16,11 @@ import de.dhbwstuttgart.syntaxtree.statement.*;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
import de.dhbwstuttgart.typecheck.*;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.sql.Ref;
|
import java.sql.Ref;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
import java.util.stream.Collectors;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
//import jdk.internal.dynalink.support.TypeConverterFactory;
|
//import jdk.internal.dynalink.support.TypeConverterFactory;
|
||||||
import org.antlr.v4.runtime.CommonToken;
|
import org.antlr.v4.runtime.CommonToken;
|
||||||
@ -28,12 +29,17 @@ import org.antlr.v4.runtime.tree.TerminalNode;
|
|||||||
|
|
||||||
public class SyntaxTreeGenerator{
|
public class SyntaxTreeGenerator{
|
||||||
private JavaClassRegistry reg;
|
private JavaClassRegistry reg;
|
||||||
|
private final GenericsRegistry globalGenerics;
|
||||||
private String pkgName = "";
|
private String pkgName = "";
|
||||||
List<JavaClassName> imports = new ArrayList();
|
Set<JavaClassName> imports = new HashSet();
|
||||||
|
|
||||||
List<Statement> fieldInitializations = new ArrayList<>();
|
List<Statement> fieldInitializations = new ArrayList<>();
|
||||||
|
|
||||||
public SyntaxTreeGenerator(JavaClassRegistry reg){
|
public SyntaxTreeGenerator(JavaClassRegistry reg, GenericsRegistry globalGenerics){
|
||||||
|
//Die Generics müssen während des Bauens des AST erstellt werden,
|
||||||
|
// da diese mit der Methode oder Klasse, in welcher sie deklariert werden
|
||||||
|
// verknüpft sein müssen. Dennoch werden die Namen aller Generics in einer globalen Datenbank benötigt.
|
||||||
|
this.globalGenerics = globalGenerics;
|
||||||
this.reg = reg;
|
this.reg = reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,56 +72,10 @@ public class SyntaxTreeGenerator{
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImports(Java8Parser.CompilationUnitContext ctx) throws ClassNotFoundException {
|
public SourceFile convert(Java8Parser.CompilationUnitContext ctx, PackageCrawler packageCrawler) throws ClassNotFoundException{
|
||||||
List<JavaClassName> newImports = new ArrayList();
|
|
||||||
for(Java8Parser.ImportDeclarationContext importDeclCtx : ctx.importDeclaration()){
|
|
||||||
if(importDeclCtx.singleTypeImportDeclaration() != null){
|
|
||||||
newImports.add(convertSingleTypeImportDeclaration(importDeclCtx.singleTypeImportDeclaration()));
|
|
||||||
}
|
|
||||||
else if(importDeclCtx.typeImportOnDemandDeclaration() != null){
|
|
||||||
newImports.add(convertTypeImportOnDemandDeclaration(importDeclCtx.typeImportOnDemandDeclaration()));
|
|
||||||
}
|
|
||||||
else if(importDeclCtx.singleStaticImportDeclaration() != null){
|
|
||||||
newImports.add(convertSingleStaticImportDeclaration(importDeclCtx.singleStaticImportDeclaration()));
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
newImports.add(convertStaticImportOnDemandDeclaration(importDeclCtx.staticImportOnDemandDeclaration()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.imports.addAll(newImports);
|
|
||||||
}
|
|
||||||
|
|
||||||
private JavaClassName convertSingleTypeImportDeclaration(Java8Parser.SingleTypeImportDeclarationContext ctx) throws ClassNotFoundException{
|
|
||||||
String typeName = convertTypeName(ctx.typeName());
|
|
||||||
JavaClassName ret = reg.getName(typeName);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
private JavaClassName convertTypeImportOnDemandDeclaration(Java8Parser.TypeImportOnDemandDeclarationContext ctx){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private JavaClassName convertSingleStaticImportDeclaration(Java8Parser.SingleStaticImportDeclarationContext ctx){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private JavaClassName convertStaticImportOnDemandDeclaration(Java8Parser.StaticImportOnDemandDeclarationContext ctx){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getPackageFromClass(String cls){
|
|
||||||
String ret = "";
|
|
||||||
String[] parts = cls.split("\\.");
|
|
||||||
for(int i = 0; i < parts.length - 1; i++){
|
|
||||||
ret = ret + "." + parts[i];
|
|
||||||
}
|
|
||||||
ret = ret.substring(1);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SourceFile convert(Java8Parser.CompilationUnitContext ctx) throws ClassNotFoundException{
|
|
||||||
List<ClassOrInterface> classes = new ArrayList<>();
|
List<ClassOrInterface> classes = new ArrayList<>();
|
||||||
this.setImports(ctx);
|
Map<String, Integer> imports = GatherNames.getImports(ctx, packageCrawler);
|
||||||
|
this.imports = imports.keySet().stream().map(name -> reg.getName(name)).collect(Collectors.toSet());
|
||||||
for(Java8Parser.TypeDeclarationContext typeDecl : ctx.typeDeclaration()){
|
for(Java8Parser.TypeDeclarationContext typeDecl : ctx.typeDeclaration()){
|
||||||
ClassOrInterface newClass;
|
ClassOrInterface newClass;
|
||||||
if(typeDecl.classDeclaration() != null){
|
if(typeDecl.classDeclaration() != null){
|
||||||
@ -133,7 +93,7 @@ public class SyntaxTreeGenerator{
|
|||||||
Java8Parser.MethodHeaderContext header = methodDeclarationContext.methodHeader();
|
Java8Parser.MethodHeaderContext header = methodDeclarationContext.methodHeader();
|
||||||
int modifiers = SyntaxTreeGenerator.convert(methodDeclarationContext.methodModifier());
|
int modifiers = SyntaxTreeGenerator.convert(methodDeclarationContext.methodModifier());
|
||||||
GenericsRegistry localGenerics = createGenerics(methodDeclarationContext.methodHeader().typeParameters(),
|
GenericsRegistry localGenerics = createGenerics(methodDeclarationContext.methodHeader().typeParameters(),
|
||||||
parentClass, header.methodDeclarator().Identifier().getText());
|
parentClass, header.methodDeclarator().Identifier().getText(), reg, generics);
|
||||||
localGenerics.putAll(generics);
|
localGenerics.putAll(generics);
|
||||||
return convert(modifiers, header, methodDeclarationContext.methodBody(),parentClass, superClass, localGenerics);
|
return convert(modifiers, header, methodDeclarationContext.methodBody(),parentClass, superClass, localGenerics);
|
||||||
}
|
}
|
||||||
@ -142,7 +102,7 @@ public class SyntaxTreeGenerator{
|
|||||||
Java8Parser.MethodHeaderContext header = ctx.methodHeader();
|
Java8Parser.MethodHeaderContext header = ctx.methodHeader();
|
||||||
int modifiers = SyntaxTreeGenerator.convertInterfaceModifier(ctx.interfaceMethodModifier());
|
int modifiers = SyntaxTreeGenerator.convertInterfaceModifier(ctx.interfaceMethodModifier());
|
||||||
|
|
||||||
GenericsRegistry localGenerics = createGenerics(header.typeParameters(), parentClass, header.methodDeclarator().Identifier().getText());
|
GenericsRegistry localGenerics = createGenerics(header.typeParameters(), parentClass, header.methodDeclarator().Identifier().getText(), reg, generics);
|
||||||
localGenerics.putAll(generics);
|
localGenerics.putAll(generics);
|
||||||
|
|
||||||
return convert(modifiers, header, ctx.methodBody(),parentClass, superClass, localGenerics);
|
return convert(modifiers, header, ctx.methodBody(),parentClass, superClass, localGenerics);
|
||||||
@ -179,13 +139,13 @@ public class SyntaxTreeGenerator{
|
|||||||
block = stmtGen.convert(body.block());
|
block = stmtGen.convert(body.block());
|
||||||
}
|
}
|
||||||
if(parentClass.equals(new JavaClassName(name))){
|
if(parentClass.equals(new JavaClassName(name))){
|
||||||
return new Constructor(name, retType, modifiers, parameterList, block, gtvDeclarations, header.getStart(), fieldInitializations, superClass);
|
return new Constructor(modifiers, name, retType, modifiers, parameterList, block, gtvDeclarations, header.getStart(), fieldInitializations);
|
||||||
}else{
|
}else{
|
||||||
return new Method(name, retType, modifiers, parameterList,block, gtvDeclarations, header.getStart());
|
return new Method(modifiers, name, retType, modifiers, parameterList,block, gtvDeclarations, header.getStart());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClassOrInterface convertClass(Java8Parser.ClassDeclarationContext ctx) {
|
private ClassOrInterface convertClass(Java8Parser.ClassDeclarationContext ctx) {
|
||||||
ClassOrInterface newClass;
|
ClassOrInterface newClass;
|
||||||
if(ctx.normalClassDeclaration() != null){
|
if(ctx.normalClassDeclaration() != null){
|
||||||
newClass = convertNormal(ctx.normalClassDeclaration());
|
newClass = convertNormal(ctx.normalClassDeclaration());
|
||||||
@ -196,7 +156,7 @@ public class SyntaxTreeGenerator{
|
|||||||
return newClass;
|
return newClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClassOrInterface convertNormal(Java8Parser.NormalClassDeclarationContext ctx){
|
private ClassOrInterface convertNormal(Java8Parser.NormalClassDeclarationContext ctx) {
|
||||||
int modifiers = 0;
|
int modifiers = 0;
|
||||||
if(ctx.classModifier() != null){
|
if(ctx.classModifier() != null){
|
||||||
for(Java8Parser.ClassModifierContext mod : ctx.classModifier()){
|
for(Java8Parser.ClassModifierContext mod : ctx.classModifier()){
|
||||||
@ -205,7 +165,7 @@ public class SyntaxTreeGenerator{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
JavaClassName name = reg.getName(ctx.Identifier().getText());
|
JavaClassName name = reg.getName(ctx.Identifier().getText());
|
||||||
GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "");
|
GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "", reg, new GenericsRegistry(globalGenerics));
|
||||||
Token offset = ctx.getStart();
|
Token offset = ctx.getStart();
|
||||||
GenericDeclarationList genericClassParameters;
|
GenericDeclarationList genericClassParameters;
|
||||||
if(ctx.typeParameters() == null){
|
if(ctx.typeParameters() == null){
|
||||||
@ -217,7 +177,7 @@ public class SyntaxTreeGenerator{
|
|||||||
if(ctx.superclass() != null){
|
if(ctx.superclass() != null){
|
||||||
superClass = convert(ctx.superclass());
|
superClass = convert(ctx.superclass());
|
||||||
}else{
|
}else{
|
||||||
superClass = ASTFactory.createObjectClass().getType();
|
superClass = new RefType(ASTFactory.createObjectClass().getClassName(), ctx.getStart());
|
||||||
}
|
}
|
||||||
List<Field> fielddecl = convertFields(ctx.classBody(), generics);
|
List<Field> fielddecl = convertFields(ctx.classBody(), generics);
|
||||||
List<Method> methods = convertMethods(ctx.classBody(), name, superClass, generics);
|
List<Method> methods = convertMethods(ctx.classBody(), name, superClass, generics);
|
||||||
@ -256,16 +216,29 @@ public class SyntaxTreeGenerator{
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9
|
||||||
|
*/
|
||||||
private Constructor generateStandardConstructor(String className, JavaClassName parentClass, RefType superClass, GenericDeclarationList classGenerics, Token offset){
|
private Constructor generateStandardConstructor(String className, JavaClassName parentClass, RefType superClass, GenericDeclarationList classGenerics, Token offset){
|
||||||
RefType classType = ClassOrInterface.generateTypeOfClass(reg.getName(className), classGenerics, offset);
|
RefType classType = ClassOrInterface.generateTypeOfClass(reg.getName(className), classGenerics, offset);
|
||||||
int modifiers = 0;
|
int modifiers = 0;
|
||||||
ParameterList params = new ParameterList(new ArrayList<>(), offset);
|
ParameterList params = new ParameterList(new ArrayList<>(), offset);
|
||||||
Block block = new Block(new ArrayList<>(), offset);
|
Block block = new Block(new ArrayList<>(), offset);
|
||||||
return new Constructor(className, classType, modifiers, params, block, classGenerics, offset, fieldInitializations, superClass);
|
return new Constructor(Modifier.PUBLIC, className, classType, modifiers, params, block, classGenerics, offset, fieldInitializations);
|
||||||
}
|
}
|
||||||
|
|
||||||
private RefType convert(Java8Parser.SuperclassContext superclass) {
|
private RefType convert(Java8Parser.SuperclassContext superclass) {
|
||||||
throw new NotImplementedException();
|
if(superclass.classType().classOrInterfaceType() != null){
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}else{
|
||||||
|
RefTypeOrTPHOrWildcardOrGeneric ret = TypeGenerator.convertTypeName(superclass.classType().Identifier().getText(), superclass.classType().typeArguments(),
|
||||||
|
superclass.getStart(), reg, globalGenerics);
|
||||||
|
if(ret instanceof RefType){
|
||||||
|
return (RefType) ret;
|
||||||
|
}else{
|
||||||
|
throw new TypeinferenceException(superclass.getText() + " ist kein gültiger Supertyp", superclass.getStart());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Method> convertMethods(Java8Parser.ClassBodyContext classBodyContext,
|
private List<Method> convertMethods(Java8Parser.ClassBodyContext classBodyContext,
|
||||||
@ -406,9 +379,11 @@ public class SyntaxTreeGenerator{
|
|||||||
modifiers += newModifier;
|
modifiers += newModifier;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(!Modifier.isInterface(modifiers))modifiers += Modifier.INTERFACE;
|
||||||
|
|
||||||
JavaClassName name = reg.getName(ctx.Identifier().getText());
|
JavaClassName name = reg.getName(ctx.Identifier().getText());
|
||||||
|
|
||||||
GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "");
|
GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "", reg, new GenericsRegistry(globalGenerics));
|
||||||
|
|
||||||
GenericDeclarationList genericParams;
|
GenericDeclarationList genericParams;
|
||||||
if(ctx.typeParameters() != null){
|
if(ctx.typeParameters() != null){
|
||||||
@ -416,7 +391,7 @@ public class SyntaxTreeGenerator{
|
|||||||
}else{
|
}else{
|
||||||
genericParams = createEmptyGenericDeclarationList(ctx.Identifier());
|
genericParams = createEmptyGenericDeclarationList(ctx.Identifier());
|
||||||
}
|
}
|
||||||
RefType superClass = ASTFactory.createObjectClass().getType();
|
RefType superClass = ASTFactory.createObjectType();
|
||||||
|
|
||||||
List<Field> fields = convertFields(ctx.interfaceBody());
|
List<Field> fields = convertFields(ctx.interfaceBody());
|
||||||
List<Method> methods = convertMethods(ctx.interfaceBody(), name, superClass, generics);
|
List<Method> methods = convertMethods(ctx.interfaceBody(), name, superClass, generics);
|
||||||
@ -434,8 +409,9 @@ public class SyntaxTreeGenerator{
|
|||||||
return new GenericDeclarationList(new ArrayList<>(), gtvOffset);
|
return new GenericDeclarationList(new ArrayList<>(), gtvOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
private GenericsRegistry createGenerics(Java8Parser.TypeParametersContext ctx, JavaClassName parentClass, String parentMethod) {
|
private GenericsRegistry createGenerics(Java8Parser.TypeParametersContext ctx, JavaClassName parentClass, String parentMethod, JavaClassRegistry reg, GenericsRegistry generics) {
|
||||||
GenericsRegistry ret = new GenericsRegistry();
|
GenericsRegistry ret = new GenericsRegistry(this.globalGenerics);
|
||||||
|
ret.putAll(generics);
|
||||||
if(ctx == null || ctx.typeParameterList() == null)return ret;
|
if(ctx == null || ctx.typeParameterList() == null)return ret;
|
||||||
for(Java8Parser.TypeParameterContext tp : ctx.typeParameterList().typeParameter()){
|
for(Java8Parser.TypeParameterContext tp : ctx.typeParameterList().typeParameter()){
|
||||||
TypeGenerator.convert(tp, parentClass, parentMethod, reg, ret);
|
TypeGenerator.convert(tp, parentClass, parentMethod, reg, ret);
|
||||||
|
@ -2,24 +2,22 @@ package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
|||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.exceptions.TypeinferenceException;
|
import de.dhbwstuttgart.exceptions.TypeinferenceException;
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
|
||||||
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
||||||
import de.dhbwstuttgart.parser.scope.GenericTypeName;
|
import de.dhbwstuttgart.parser.scope.GenericTypeName;
|
||||||
|
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
import de.dhbwstuttgart.syntaxtree.GenericDeclarationList;
|
import de.dhbwstuttgart.syntaxtree.GenericDeclarationList;
|
||||||
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
|
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
|
||||||
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TypeGenerator {
|
public class TypeGenerator {
|
||||||
@ -45,7 +43,7 @@ public class TypeGenerator {
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}else
|
}else
|
||||||
if(unannTypeContext.unannReferenceType().unannArrayType()!=null){
|
if(unannTypeContext.unannReferenceType().unannArrayType()!=null){
|
||||||
System.out.println(unannTypeContext.getText());
|
//System.out.println(unannTypeContext.getText());
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}else
|
}else
|
||||||
if(unannTypeContext.unannReferenceType().unannTypeVariable()!=null){
|
if(unannTypeContext.unannReferenceType().unannTypeVariable()!=null){
|
||||||
@ -68,6 +66,8 @@ public class TypeGenerator {
|
|||||||
|
|
||||||
public static GenericTypeVar convert(Java8Parser.TypeParameterContext typeParameter, JavaClassName parentClass, String parentMethod, JavaClassRegistry reg, GenericsRegistry generics) {
|
public static GenericTypeVar convert(Java8Parser.TypeParameterContext typeParameter, JavaClassName parentClass, String parentMethod, JavaClassRegistry reg, GenericsRegistry generics) {
|
||||||
String name = typeParameter.Identifier().getText();
|
String name = typeParameter.Identifier().getText();
|
||||||
|
//TODO: Es müssen erst alle GenericTypeVars generiert werden, dann können die bounds dieser Generics ermittelt werden
|
||||||
|
//Problem <A extends B, B> ist erlaubt, würde aber bei den Bounds von A den Generic B nicht als solchen erkennen
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> bounds = TypeGenerator.convert(typeParameter.typeBound(),reg, generics);
|
List<RefTypeOrTPHOrWildcardOrGeneric> bounds = TypeGenerator.convert(typeParameter.typeBound(),reg, generics);
|
||||||
|
|
||||||
GenericTypeVar ret = new GenericTypeVar(new GenericTypeName(new GenericContext(parentClass, parentMethod), name), bounds, typeParameter.getStart(), typeParameter.getStop());
|
GenericTypeVar ret = new GenericTypeVar(new GenericTypeName(new GenericContext(parentClass, parentMethod), name), bounds, typeParameter.getStart(), typeParameter.getStop());
|
||||||
@ -76,17 +76,46 @@ public class TypeGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<RefTypeOrTPHOrWildcardOrGeneric> convert(Java8Parser.TypeBoundContext typeBoundContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
public static List<RefTypeOrTPHOrWildcardOrGeneric> convert(Java8Parser.TypeBoundContext typeBoundContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
||||||
|
List<RefTypeOrTPHOrWildcardOrGeneric> ret = new ArrayList<>();
|
||||||
if(typeBoundContext == null){
|
if(typeBoundContext == null){
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> ret = new ArrayList<>();
|
ret.add(ASTFactory.createObjectType());
|
||||||
ret.add(ASTFactory.createObjectClass().getType());
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
if(typeBoundContext.typeVariable() != null){
|
||||||
|
ret.add(convertTypeName(typeBoundContext.typeVariable().Identifier().getText(), null, typeBoundContext.typeVariable().getStart(), reg, generics));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
if(typeBoundContext.classOrInterfaceType() != null){
|
||||||
|
ret.add(convert(typeBoundContext.classOrInterfaceType()));
|
||||||
|
if(typeBoundContext.additionalBound() != null)
|
||||||
|
for(Java8Parser.AdditionalBoundContext addCtx : typeBoundContext.additionalBound()){
|
||||||
|
ret.add(convert(addCtx.interfaceType()));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}else{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
throw new de.dhbwstuttgart.exceptions.NotImplementedException();
|
private static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.ClassOrInterfaceTypeContext classOrInterfaceTypeContext) {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.InterfaceTypeContext interfaceTypeContext) {
|
||||||
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.ReferenceTypeContext referenceTypeContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
public static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.ReferenceTypeContext referenceTypeContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
||||||
return convertTypeName(referenceTypeContext.getText(), referenceTypeContext.getStart(), reg, generics);
|
if(referenceTypeContext.classOrInterfaceType() != null){
|
||||||
|
if(referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType()!= null){
|
||||||
|
Java8Parser.ClassType_lfno_classOrInterfaceTypeContext ctx = referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType();
|
||||||
|
return convertTypeName(ctx.Identifier().toString(), ctx.typeArguments(),referenceTypeContext.getStart(), reg, generics);
|
||||||
|
}else{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RefTypeOrTPHOrWildcardOrGeneric convertTypeName(String name, Token offset, JavaClassRegistry reg, GenericsRegistry generics){
|
public static RefTypeOrTPHOrWildcardOrGeneric convertTypeName(String name, Token offset, JavaClassRegistry reg, GenericsRegistry generics){
|
||||||
@ -96,14 +125,18 @@ public class TypeGenerator {
|
|||||||
public static RefTypeOrTPHOrWildcardOrGeneric convertTypeName(
|
public static RefTypeOrTPHOrWildcardOrGeneric convertTypeName(
|
||||||
String name, Java8Parser.TypeArgumentsContext typeArguments, Token offset, JavaClassRegistry reg, GenericsRegistry generics){
|
String name, Java8Parser.TypeArgumentsContext typeArguments, Token offset, JavaClassRegistry reg, GenericsRegistry generics){
|
||||||
if(!reg.contains(name)){ //Dann könnte es ein Generische Type sein
|
if(!reg.contains(name)){ //Dann könnte es ein Generische Type sein
|
||||||
if(generics.keySet().contains(name)){
|
if(generics.contains(name)){
|
||||||
return new GenericRefType(new GenericTypeName(generics.get(name),name), offset);
|
return new GenericRefType(new GenericTypeName(generics.get(name),name), offset);
|
||||||
}else{
|
}else{
|
||||||
throw new TypeinferenceException("Der Typ "+ name + " ist nicht vorhanden",offset);
|
throw new TypeinferenceException("Der Typ "+ name + " ist nicht vorhanden",offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(typeArguments == null){
|
if(typeArguments == null){
|
||||||
return new RefType(reg.getName(name), offset);
|
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
||||||
|
for(int i = 0; i<reg.getNumberOfGenerics(name);i++){
|
||||||
|
params.add(TypePlaceholder.fresh(offset));
|
||||||
|
}
|
||||||
|
return new RefType(reg.getName(name), params, offset);
|
||||||
}else{
|
}else{
|
||||||
return new RefType(reg.getName(name), convert(typeArguments, reg, generics), offset);
|
return new RefType(reg.getName(name), convert(typeArguments, reg, generics), offset);
|
||||||
}
|
}
|
||||||
|
@ -732,7 +732,6 @@ localVariableDeclarationStatement
|
|||||||
|
|
||||||
unannTypeOrAuto
|
unannTypeOrAuto
|
||||||
: unannType
|
: unannType
|
||||||
| 'auto'
|
|
||||||
;
|
;
|
||||||
|
|
||||||
localVariableDeclaration
|
localVariableDeclaration
|
||||||
@ -1739,6 +1738,7 @@ Identifier
|
|||||||
: JavaLetter JavaLetterOrDigit*
|
: JavaLetter JavaLetterOrDigit*
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
fragment
|
fragment
|
||||||
JavaLetter
|
JavaLetter
|
||||||
: [a-zA-Z$_] // these are the "java letters" below 0x7F
|
: [a-zA-Z$_] // these are the "java letters" below 0x7F
|
||||||
|
@ -1,207 +1,205 @@
|
|||||||
T__0=1
|
ABSTRACT=1
|
||||||
ABSTRACT=2
|
ASSERT=2
|
||||||
ASSERT=3
|
BOOLEAN=3
|
||||||
BOOLEAN=4
|
BREAK=4
|
||||||
BREAK=5
|
BYTE=5
|
||||||
BYTE=6
|
CASE=6
|
||||||
CASE=7
|
CATCH=7
|
||||||
CATCH=8
|
CHAR=8
|
||||||
CHAR=9
|
CLASS=9
|
||||||
CLASS=10
|
CONST=10
|
||||||
CONST=11
|
CONTINUE=11
|
||||||
CONTINUE=12
|
DEFAULT=12
|
||||||
DEFAULT=13
|
DO=13
|
||||||
DO=14
|
DOUBLE=14
|
||||||
DOUBLE=15
|
ELSE=15
|
||||||
ELSE=16
|
ENUM=16
|
||||||
ENUM=17
|
EXTENDS=17
|
||||||
EXTENDS=18
|
FINAL=18
|
||||||
FINAL=19
|
FINALLY=19
|
||||||
FINALLY=20
|
FLOAT=20
|
||||||
FLOAT=21
|
FOR=21
|
||||||
FOR=22
|
IF=22
|
||||||
IF=23
|
GOTO=23
|
||||||
GOTO=24
|
IMPLEMENTS=24
|
||||||
IMPLEMENTS=25
|
IMPORT=25
|
||||||
IMPORT=26
|
INSTANCEOF=26
|
||||||
INSTANCEOF=27
|
INT=27
|
||||||
INT=28
|
INTERFACE=28
|
||||||
INTERFACE=29
|
LONG=29
|
||||||
LONG=30
|
NATIVE=30
|
||||||
NATIVE=31
|
NEW=31
|
||||||
NEW=32
|
PACKAGE=32
|
||||||
PACKAGE=33
|
PRIVATE=33
|
||||||
PRIVATE=34
|
PROTECTED=34
|
||||||
PROTECTED=35
|
PUBLIC=35
|
||||||
PUBLIC=36
|
RETURN=36
|
||||||
RETURN=37
|
SHORT=37
|
||||||
SHORT=38
|
STATIC=38
|
||||||
STATIC=39
|
STRICTFP=39
|
||||||
STRICTFP=40
|
SUPER=40
|
||||||
SUPER=41
|
SWITCH=41
|
||||||
SWITCH=42
|
SYNCHRONIZED=42
|
||||||
SYNCHRONIZED=43
|
THIS=43
|
||||||
THIS=44
|
THROW=44
|
||||||
THROW=45
|
THROWS=45
|
||||||
THROWS=46
|
TRANSIENT=46
|
||||||
TRANSIENT=47
|
TRY=47
|
||||||
TRY=48
|
VOID=48
|
||||||
VOID=49
|
VOLATILE=49
|
||||||
VOLATILE=50
|
WHILE=50
|
||||||
WHILE=51
|
IntegerLiteral=51
|
||||||
IntegerLiteral=52
|
FloatingPointLiteral=52
|
||||||
FloatingPointLiteral=53
|
BooleanLiteral=53
|
||||||
BooleanLiteral=54
|
CharacterLiteral=54
|
||||||
CharacterLiteral=55
|
StringLiteral=55
|
||||||
StringLiteral=56
|
NullLiteral=56
|
||||||
NullLiteral=57
|
LPAREN=57
|
||||||
LPAREN=58
|
RPAREN=58
|
||||||
RPAREN=59
|
LBRACE=59
|
||||||
LBRACE=60
|
RBRACE=60
|
||||||
RBRACE=61
|
LBRACK=61
|
||||||
LBRACK=62
|
RBRACK=62
|
||||||
RBRACK=63
|
SEMI=63
|
||||||
SEMI=64
|
COMMA=64
|
||||||
COMMA=65
|
DOT=65
|
||||||
DOT=66
|
ASSIGN=66
|
||||||
ASSIGN=67
|
GT=67
|
||||||
GT=68
|
LT=68
|
||||||
LT=69
|
BANG=69
|
||||||
BANG=70
|
TILDE=70
|
||||||
TILDE=71
|
QUESTION=71
|
||||||
QUESTION=72
|
COLON=72
|
||||||
COLON=73
|
EQUAL=73
|
||||||
EQUAL=74
|
LE=74
|
||||||
LE=75
|
GE=75
|
||||||
GE=76
|
NOTEQUAL=76
|
||||||
NOTEQUAL=77
|
AND=77
|
||||||
AND=78
|
OR=78
|
||||||
OR=79
|
INC=79
|
||||||
INC=80
|
DEC=80
|
||||||
DEC=81
|
ADD=81
|
||||||
ADD=82
|
SUB=82
|
||||||
SUB=83
|
MUL=83
|
||||||
MUL=84
|
DIV=84
|
||||||
DIV=85
|
BITAND=85
|
||||||
BITAND=86
|
BITOR=86
|
||||||
BITOR=87
|
CARET=87
|
||||||
CARET=88
|
MOD=88
|
||||||
MOD=89
|
ARROW=89
|
||||||
ARROW=90
|
COLONCOLON=90
|
||||||
COLONCOLON=91
|
ADD_ASSIGN=91
|
||||||
ADD_ASSIGN=92
|
SUB_ASSIGN=92
|
||||||
SUB_ASSIGN=93
|
MUL_ASSIGN=93
|
||||||
MUL_ASSIGN=94
|
DIV_ASSIGN=94
|
||||||
DIV_ASSIGN=95
|
AND_ASSIGN=95
|
||||||
AND_ASSIGN=96
|
OR_ASSIGN=96
|
||||||
OR_ASSIGN=97
|
XOR_ASSIGN=97
|
||||||
XOR_ASSIGN=98
|
MOD_ASSIGN=98
|
||||||
MOD_ASSIGN=99
|
LSHIFT_ASSIGN=99
|
||||||
LSHIFT_ASSIGN=100
|
RSHIFT_ASSIGN=100
|
||||||
RSHIFT_ASSIGN=101
|
URSHIFT_ASSIGN=101
|
||||||
URSHIFT_ASSIGN=102
|
Identifier=102
|
||||||
Identifier=103
|
AT=103
|
||||||
AT=104
|
ELLIPSIS=104
|
||||||
ELLIPSIS=105
|
WS=105
|
||||||
WS=106
|
COMMENT=106
|
||||||
COMMENT=107
|
LINE_COMMENT=107
|
||||||
LINE_COMMENT=108
|
'abstract'=1
|
||||||
'auto'=1
|
'assert'=2
|
||||||
'abstract'=2
|
'boolean'=3
|
||||||
'assert'=3
|
'break'=4
|
||||||
'boolean'=4
|
'byte'=5
|
||||||
'break'=5
|
'case'=6
|
||||||
'byte'=6
|
'catch'=7
|
||||||
'case'=7
|
'char'=8
|
||||||
'catch'=8
|
'class'=9
|
||||||
'char'=9
|
'const'=10
|
||||||
'class'=10
|
'continue'=11
|
||||||
'const'=11
|
'default'=12
|
||||||
'continue'=12
|
'do'=13
|
||||||
'default'=13
|
'double'=14
|
||||||
'do'=14
|
'else'=15
|
||||||
'double'=15
|
'enum'=16
|
||||||
'else'=16
|
'extends'=17
|
||||||
'enum'=17
|
'final'=18
|
||||||
'extends'=18
|
'finally'=19
|
||||||
'final'=19
|
'float'=20
|
||||||
'finally'=20
|
'for'=21
|
||||||
'float'=21
|
'if'=22
|
||||||
'for'=22
|
'goto'=23
|
||||||
'if'=23
|
'implements'=24
|
||||||
'goto'=24
|
'import'=25
|
||||||
'implements'=25
|
'instanceof'=26
|
||||||
'import'=26
|
'int'=27
|
||||||
'instanceof'=27
|
'interface'=28
|
||||||
'int'=28
|
'long'=29
|
||||||
'interface'=29
|
'native'=30
|
||||||
'long'=30
|
'new'=31
|
||||||
'native'=31
|
'package'=32
|
||||||
'new'=32
|
'private'=33
|
||||||
'package'=33
|
'protected'=34
|
||||||
'private'=34
|
'public'=35
|
||||||
'protected'=35
|
'return'=36
|
||||||
'public'=36
|
'short'=37
|
||||||
'return'=37
|
'static'=38
|
||||||
'short'=38
|
'strictfp'=39
|
||||||
'static'=39
|
'super'=40
|
||||||
'strictfp'=40
|
'switch'=41
|
||||||
'super'=41
|
'synchronized'=42
|
||||||
'switch'=42
|
'this'=43
|
||||||
'synchronized'=43
|
'throw'=44
|
||||||
'this'=44
|
'throws'=45
|
||||||
'throw'=45
|
'transient'=46
|
||||||
'throws'=46
|
'try'=47
|
||||||
'transient'=47
|
'void'=48
|
||||||
'try'=48
|
'volatile'=49
|
||||||
'void'=49
|
'while'=50
|
||||||
'volatile'=50
|
'null'=56
|
||||||
'while'=51
|
'('=57
|
||||||
'null'=57
|
')'=58
|
||||||
'('=58
|
'{'=59
|
||||||
')'=59
|
'}'=60
|
||||||
'{'=60
|
'['=61
|
||||||
'}'=61
|
']'=62
|
||||||
'['=62
|
';'=63
|
||||||
']'=63
|
','=64
|
||||||
';'=64
|
'.'=65
|
||||||
','=65
|
'='=66
|
||||||
'.'=66
|
'>'=67
|
||||||
'='=67
|
'<'=68
|
||||||
'>'=68
|
'!'=69
|
||||||
'<'=69
|
'~'=70
|
||||||
'!'=70
|
'?'=71
|
||||||
'~'=71
|
':'=72
|
||||||
'?'=72
|
'=='=73
|
||||||
':'=73
|
'<='=74
|
||||||
'=='=74
|
'>='=75
|
||||||
'<='=75
|
'!='=76
|
||||||
'>='=76
|
'&&'=77
|
||||||
'!='=77
|
'||'=78
|
||||||
'&&'=78
|
'++'=79
|
||||||
'||'=79
|
'--'=80
|
||||||
'++'=80
|
'+'=81
|
||||||
'--'=81
|
'-'=82
|
||||||
'+'=82
|
'*'=83
|
||||||
'-'=83
|
'/'=84
|
||||||
'*'=84
|
'&'=85
|
||||||
'/'=85
|
'|'=86
|
||||||
'&'=86
|
'^'=87
|
||||||
'|'=87
|
'%'=88
|
||||||
'^'=88
|
'->'=89
|
||||||
'%'=89
|
'::'=90
|
||||||
'->'=90
|
'+='=91
|
||||||
'::'=91
|
'-='=92
|
||||||
'+='=92
|
'*='=93
|
||||||
'-='=93
|
'/='=94
|
||||||
'*='=94
|
'&='=95
|
||||||
'/='=95
|
'|='=96
|
||||||
'&='=96
|
'^='=97
|
||||||
'|='=97
|
'%='=98
|
||||||
'^='=98
|
'<<='=99
|
||||||
'%='=99
|
'>>='=100
|
||||||
'<<='=100
|
'>>>='=101
|
||||||
'>>='=101
|
'@'=103
|
||||||
'>>>='=102
|
'...'=104
|
||||||
'@'=104
|
|
||||||
'...'=105
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Generated from Java8.g4 by ANTLR 4.5.3
|
// Generated from Java8.g4 by ANTLR 4.7
|
||||||
package de.dhbwstuttgart.parser.antlr;
|
package de.dhbwstuttgart.parser.antlr;
|
||||||
|
|
||||||
import org.antlr.v4.runtime.ParserRuleContext;
|
import org.antlr.v4.runtime.ParserRuleContext;
|
||||||
@ -1571,6 +1571,18 @@ public class Java8BaseListener implements Java8Listener {
|
|||||||
* <p>The default implementation does nothing.</p>
|
* <p>The default implementation does nothing.</p>
|
||||||
*/
|
*/
|
||||||
@Override public void exitLocalVariableDeclarationStatement(Java8Parser.LocalVariableDeclarationStatementContext ctx) { }
|
@Override public void exitLocalVariableDeclarationStatement(Java8Parser.LocalVariableDeclarationStatementContext ctx) { }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation does nothing.</p>
|
||||||
|
*/
|
||||||
|
@Override public void enterUnannTypeOrAuto(Java8Parser.UnannTypeOrAutoContext ctx) { }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation does nothing.</p>
|
||||||
|
*/
|
||||||
|
@Override public void exitUnannTypeOrAuto(Java8Parser.UnannTypeOrAutoContext ctx) { }
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*
|
*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Generated from /home/janulrich/Development/intellijworkspace/JavaCompilerCore/src/de/dhbwstuttgart/parser/antlr/Java8.g4 by ANTLR 4.5.1
|
// Generated from Java8.g4 by ANTLR 4.7
|
||||||
package de.dhbwstuttgart.parser.antlr;
|
package de.dhbwstuttgart.parser.antlr;
|
||||||
import org.antlr.v4.runtime.Lexer;
|
import org.antlr.v4.runtime.Lexer;
|
||||||
import org.antlr.v4.runtime.CharStream;
|
import org.antlr.v4.runtime.CharStream;
|
||||||
@ -11,37 +11,41 @@ import org.antlr.v4.runtime.misc.*;
|
|||||||
|
|
||||||
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
|
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
|
||||||
public class Java8Lexer extends Lexer {
|
public class Java8Lexer extends Lexer {
|
||||||
static { RuntimeMetaData.checkVersion("4.5.1", RuntimeMetaData.VERSION); }
|
static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); }
|
||||||
|
|
||||||
protected static final DFA[] _decisionToDFA;
|
protected static final DFA[] _decisionToDFA;
|
||||||
protected static final PredictionContextCache _sharedContextCache =
|
protected static final PredictionContextCache _sharedContextCache =
|
||||||
new PredictionContextCache();
|
new PredictionContextCache();
|
||||||
public static final int
|
public static final int
|
||||||
T__0=1, ABSTRACT=2, ASSERT=3, BOOLEAN=4, BREAK=5, BYTE=6, CASE=7, CATCH=8,
|
ABSTRACT=1, ASSERT=2, BOOLEAN=3, BREAK=4, BYTE=5, CASE=6, CATCH=7, CHAR=8,
|
||||||
CHAR=9, CLASS=10, CONST=11, CONTINUE=12, DEFAULT=13, DO=14, DOUBLE=15,
|
CLASS=9, CONST=10, CONTINUE=11, DEFAULT=12, DO=13, DOUBLE=14, ELSE=15,
|
||||||
ELSE=16, ENUM=17, EXTENDS=18, FINAL=19, FINALLY=20, FLOAT=21, FOR=22,
|
ENUM=16, EXTENDS=17, FINAL=18, FINALLY=19, FLOAT=20, FOR=21, IF=22, GOTO=23,
|
||||||
IF=23, GOTO=24, IMPLEMENTS=25, IMPORT=26, INSTANCEOF=27, INT=28, INTERFACE=29,
|
IMPLEMENTS=24, IMPORT=25, INSTANCEOF=26, INT=27, INTERFACE=28, LONG=29,
|
||||||
LONG=30, NATIVE=31, NEW=32, PACKAGE=33, PRIVATE=34, PROTECTED=35, PUBLIC=36,
|
NATIVE=30, NEW=31, PACKAGE=32, PRIVATE=33, PROTECTED=34, PUBLIC=35, RETURN=36,
|
||||||
RETURN=37, SHORT=38, STATIC=39, STRICTFP=40, SUPER=41, SWITCH=42, SYNCHRONIZED=43,
|
SHORT=37, STATIC=38, STRICTFP=39, SUPER=40, SWITCH=41, SYNCHRONIZED=42,
|
||||||
THIS=44, THROW=45, THROWS=46, TRANSIENT=47, TRY=48, VOID=49, VOLATILE=50,
|
THIS=43, THROW=44, THROWS=45, TRANSIENT=46, TRY=47, VOID=48, VOLATILE=49,
|
||||||
WHILE=51, IntegerLiteral=52, FloatingPointLiteral=53, BooleanLiteral=54,
|
WHILE=50, IntegerLiteral=51, FloatingPointLiteral=52, BooleanLiteral=53,
|
||||||
CharacterLiteral=55, StringLiteral=56, NullLiteral=57, LPAREN=58, RPAREN=59,
|
CharacterLiteral=54, StringLiteral=55, NullLiteral=56, LPAREN=57, RPAREN=58,
|
||||||
LBRACE=60, RBRACE=61, LBRACK=62, RBRACK=63, SEMI=64, COMMA=65, DOT=66,
|
LBRACE=59, RBRACE=60, LBRACK=61, RBRACK=62, SEMI=63, COMMA=64, DOT=65,
|
||||||
ASSIGN=67, GT=68, LT=69, BANG=70, TILDE=71, QUESTION=72, COLON=73, EQUAL=74,
|
ASSIGN=66, GT=67, LT=68, BANG=69, TILDE=70, QUESTION=71, COLON=72, EQUAL=73,
|
||||||
LE=75, GE=76, NOTEQUAL=77, AND=78, OR=79, INC=80, DEC=81, ADD=82, SUB=83,
|
LE=74, GE=75, NOTEQUAL=76, AND=77, OR=78, INC=79, DEC=80, ADD=81, SUB=82,
|
||||||
MUL=84, DIV=85, BITAND=86, BITOR=87, CARET=88, MOD=89, ARROW=90, COLONCOLON=91,
|
MUL=83, DIV=84, BITAND=85, BITOR=86, CARET=87, MOD=88, ARROW=89, COLONCOLON=90,
|
||||||
ADD_ASSIGN=92, SUB_ASSIGN=93, MUL_ASSIGN=94, DIV_ASSIGN=95, AND_ASSIGN=96,
|
ADD_ASSIGN=91, SUB_ASSIGN=92, MUL_ASSIGN=93, DIV_ASSIGN=94, AND_ASSIGN=95,
|
||||||
OR_ASSIGN=97, XOR_ASSIGN=98, MOD_ASSIGN=99, LSHIFT_ASSIGN=100, RSHIFT_ASSIGN=101,
|
OR_ASSIGN=96, XOR_ASSIGN=97, MOD_ASSIGN=98, LSHIFT_ASSIGN=99, RSHIFT_ASSIGN=100,
|
||||||
URSHIFT_ASSIGN=102, Identifier=103, AT=104, ELLIPSIS=105, WS=106, COMMENT=107,
|
URSHIFT_ASSIGN=101, Identifier=102, AT=103, ELLIPSIS=104, WS=105, COMMENT=106,
|
||||||
LINE_COMMENT=108;
|
LINE_COMMENT=107;
|
||||||
|
public static String[] channelNames = {
|
||||||
|
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
|
||||||
|
};
|
||||||
|
|
||||||
public static String[] modeNames = {
|
public static String[] modeNames = {
|
||||||
"DEFAULT_MODE"
|
"DEFAULT_MODE"
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final String[] ruleNames = {
|
public static final String[] ruleNames = {
|
||||||
"T__0", "ABSTRACT", "ASSERT", "BOOLEAN", "BREAK", "BYTE", "CASE", "CATCH",
|
"ABSTRACT", "ASSERT", "BOOLEAN", "BREAK", "BYTE", "CASE", "CATCH", "CHAR",
|
||||||
"CHAR", "CLASS", "CONST", "CONTINUE", "DEFAULT", "DO", "DOUBLE", "ELSE",
|
"CLASS", "CONST", "CONTINUE", "DEFAULT", "DO", "DOUBLE", "ELSE", "ENUM",
|
||||||
"ENUM", "EXTENDS", "FINAL", "FINALLY", "FLOAT", "FOR", "IF", "GOTO", "IMPLEMENTS",
|
"EXTENDS", "FINAL", "FINALLY", "FLOAT", "FOR", "IF", "GOTO", "IMPLEMENTS",
|
||||||
"IMPORT", "INSTANCEOF", "INT", "INTERFACE", "LONG", "NATIVE", "NEW", "PACKAGE",
|
"IMPORT", "INSTANCEOF", "INT", "INTERFACE", "LONG", "NATIVE", "NEW", "PACKAGE",
|
||||||
"PRIVATE", "PROTECTED", "PUBLIC", "RETURN", "SHORT", "STATIC", "STRICTFP",
|
"PRIVATE", "PROTECTED", "PUBLIC", "RETURN", "SHORT", "STATIC", "STRICTFP",
|
||||||
"SUPER", "SWITCH", "SYNCHRONIZED", "THIS", "THROW", "THROWS", "TRANSIENT",
|
"SUPER", "SWITCH", "SYNCHRONIZED", "THIS", "THROW", "THROWS", "TRANSIENT",
|
||||||
@ -68,8 +72,8 @@ public class Java8Lexer extends Lexer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private static final String[] _LITERAL_NAMES = {
|
private static final String[] _LITERAL_NAMES = {
|
||||||
null, "'auto'", "'abstract'", "'assert'", "'boolean'", "'break'", "'byte'",
|
null, "'abstract'", "'assert'", "'boolean'", "'break'", "'byte'", "'case'",
|
||||||
"'case'", "'catch'", "'char'", "'class'", "'const'", "'continue'", "'default'",
|
"'catch'", "'char'", "'class'", "'const'", "'continue'", "'default'",
|
||||||
"'do'", "'double'", "'else'", "'enum'", "'extends'", "'final'", "'finally'",
|
"'do'", "'double'", "'else'", "'enum'", "'extends'", "'final'", "'finally'",
|
||||||
"'float'", "'for'", "'if'", "'goto'", "'implements'", "'import'", "'instanceof'",
|
"'float'", "'for'", "'if'", "'goto'", "'implements'", "'import'", "'instanceof'",
|
||||||
"'int'", "'interface'", "'long'", "'native'", "'new'", "'package'", "'private'",
|
"'int'", "'interface'", "'long'", "'native'", "'new'", "'package'", "'private'",
|
||||||
@ -84,21 +88,21 @@ public class Java8Lexer extends Lexer {
|
|||||||
"'>>>='", null, "'@'", "'...'"
|
"'>>>='", null, "'@'", "'...'"
|
||||||
};
|
};
|
||||||
private static final String[] _SYMBOLIC_NAMES = {
|
private static final String[] _SYMBOLIC_NAMES = {
|
||||||
null, null, "ABSTRACT", "ASSERT", "BOOLEAN", "BREAK", "BYTE", "CASE",
|
null, "ABSTRACT", "ASSERT", "BOOLEAN", "BREAK", "BYTE", "CASE", "CATCH",
|
||||||
"CATCH", "CHAR", "CLASS", "CONST", "CONTINUE", "DEFAULT", "DO", "DOUBLE",
|
"CHAR", "CLASS", "CONST", "CONTINUE", "DEFAULT", "DO", "DOUBLE", "ELSE",
|
||||||
"ELSE", "ENUM", "EXTENDS", "FINAL", "FINALLY", "FLOAT", "FOR", "IF", "GOTO",
|
"ENUM", "EXTENDS", "FINAL", "FINALLY", "FLOAT", "FOR", "IF", "GOTO", "IMPLEMENTS",
|
||||||
"IMPLEMENTS", "IMPORT", "INSTANCEOF", "INT", "INTERFACE", "LONG", "NATIVE",
|
"IMPORT", "INSTANCEOF", "INT", "INTERFACE", "LONG", "NATIVE", "NEW", "PACKAGE",
|
||||||
"NEW", "PACKAGE", "PRIVATE", "PROTECTED", "PUBLIC", "RETURN", "SHORT",
|
"PRIVATE", "PROTECTED", "PUBLIC", "RETURN", "SHORT", "STATIC", "STRICTFP",
|
||||||
"STATIC", "STRICTFP", "SUPER", "SWITCH", "SYNCHRONIZED", "THIS", "THROW",
|
"SUPER", "SWITCH", "SYNCHRONIZED", "THIS", "THROW", "THROWS", "TRANSIENT",
|
||||||
"THROWS", "TRANSIENT", "TRY", "VOID", "VOLATILE", "WHILE", "IntegerLiteral",
|
"TRY", "VOID", "VOLATILE", "WHILE", "IntegerLiteral", "FloatingPointLiteral",
|
||||||
"FloatingPointLiteral", "BooleanLiteral", "CharacterLiteral", "StringLiteral",
|
"BooleanLiteral", "CharacterLiteral", "StringLiteral", "NullLiteral",
|
||||||
"NullLiteral", "LPAREN", "RPAREN", "LBRACE", "RBRACE", "LBRACK", "RBRACK",
|
"LPAREN", "RPAREN", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "SEMI", "COMMA",
|
||||||
"SEMI", "COMMA", "DOT", "ASSIGN", "GT", "LT", "BANG", "TILDE", "QUESTION",
|
"DOT", "ASSIGN", "GT", "LT", "BANG", "TILDE", "QUESTION", "COLON", "EQUAL",
|
||||||
"COLON", "EQUAL", "LE", "GE", "NOTEQUAL", "AND", "OR", "INC", "DEC", "ADD",
|
"LE", "GE", "NOTEQUAL", "AND", "OR", "INC", "DEC", "ADD", "SUB", "MUL",
|
||||||
"SUB", "MUL", "DIV", "BITAND", "BITOR", "CARET", "MOD", "ARROW", "COLONCOLON",
|
"DIV", "BITAND", "BITOR", "CARET", "MOD", "ARROW", "COLONCOLON", "ADD_ASSIGN",
|
||||||
"ADD_ASSIGN", "SUB_ASSIGN", "MUL_ASSIGN", "DIV_ASSIGN", "AND_ASSIGN",
|
"SUB_ASSIGN", "MUL_ASSIGN", "DIV_ASSIGN", "AND_ASSIGN", "OR_ASSIGN", "XOR_ASSIGN",
|
||||||
"OR_ASSIGN", "XOR_ASSIGN", "MOD_ASSIGN", "LSHIFT_ASSIGN", "RSHIFT_ASSIGN",
|
"MOD_ASSIGN", "LSHIFT_ASSIGN", "RSHIFT_ASSIGN", "URSHIFT_ASSIGN", "Identifier",
|
||||||
"URSHIFT_ASSIGN", "Identifier", "AT", "ELLIPSIS", "WS", "COMMENT", "LINE_COMMENT"
|
"AT", "ELLIPSIS", "WS", "COMMENT", "LINE_COMMENT"
|
||||||
};
|
};
|
||||||
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
|
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
|
||||||
|
|
||||||
@ -148,6 +152,9 @@ public class Java8Lexer extends Lexer {
|
|||||||
@Override
|
@Override
|
||||||
public String getSerializedATN() { return _serializedATN; }
|
public String getSerializedATN() { return _serializedATN; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getChannelNames() { return channelNames; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getModeNames() { return modeNames; }
|
public String[] getModeNames() { return modeNames; }
|
||||||
|
|
||||||
@ -157,9 +164,9 @@ public class Java8Lexer extends Lexer {
|
|||||||
@Override
|
@Override
|
||||||
public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
|
public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
|
||||||
switch (ruleIndex) {
|
switch (ruleIndex) {
|
||||||
case 147:
|
case 146:
|
||||||
return JavaLetter_sempred((RuleContext)_localctx, predIndex);
|
return JavaLetter_sempred((RuleContext)_localctx, predIndex);
|
||||||
case 148:
|
case 147:
|
||||||
return JavaLetterOrDigit_sempred((RuleContext)_localctx, predIndex);
|
return JavaLetterOrDigit_sempred((RuleContext)_localctx, predIndex);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -184,7 +191,7 @@ public class Java8Lexer extends Lexer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static final String _serializedATN =
|
public static final String _serializedATN =
|
||||||
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2n\u044f\b\1\4\2\t"+
|
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2m\u0448\b\1\4\2\t"+
|
||||||
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
|
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
|
||||||
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
|
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
|
||||||
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
|
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
|
||||||
@ -203,378 +210,376 @@ public class Java8Lexer extends Lexer {
|
|||||||
"\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e"+
|
"\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e"+
|
||||||
"\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092"+
|
"\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092"+
|
||||||
"\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097"+
|
"\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097"+
|
||||||
"\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b"+
|
"\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\3\2\3\2\3\2\3"+
|
||||||
"\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3"+
|
"\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4"+
|
||||||
"\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6"+
|
"\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3"+
|
||||||
"\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3"+
|
"\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n"+
|
||||||
"\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3"+
|
"\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+
|
||||||
"\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16"+
|
"\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3"+
|
||||||
"\3\16\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21"+
|
"\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3"+
|
||||||
"\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+
|
"\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3"+
|
||||||
"\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+
|
"\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3"+
|
||||||
"\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30"+
|
"\26\3\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+
|
||||||
"\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32"+
|
"\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3"+
|
||||||
"\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34"+
|
"\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3"+
|
||||||
"\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36"+
|
"\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3"+
|
||||||
"\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3"+
|
"\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3!"+
|
||||||
" \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#"+
|
"\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3"+
|
||||||
"\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&"+
|
"#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3"+
|
||||||
"\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)"+
|
"\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3"+
|
||||||
"\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,"+
|
")\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3"+
|
||||||
"\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/"+
|
",\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3"+
|
||||||
"\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61"+
|
"/\3/\3/\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3"+
|
||||||
"\3\61\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63"+
|
"\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3"+
|
||||||
"\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\5\65\u0294\n\65"+
|
"\64\3\64\5\64\u028d\n\64\3\65\3\65\5\65\u0291\n\65\3\66\3\66\5\66\u0295"+
|
||||||
"\3\66\3\66\5\66\u0298\n\66\3\67\3\67\5\67\u029c\n\67\38\38\58\u02a0\n"+
|
"\n\66\3\67\3\67\5\67\u0299\n\67\38\38\58\u029d\n8\39\39\3:\3:\3:\5:\u02a4"+
|
||||||
"8\39\39\59\u02a4\n9\3:\3:\3;\3;\3;\5;\u02ab\n;\3;\3;\3;\5;\u02b0\n;\5"+
|
"\n:\3:\3:\3:\5:\u02a9\n:\5:\u02ab\n:\3;\3;\5;\u02af\n;\3;\5;\u02b2\n;"+
|
||||||
";\u02b2\n;\3<\3<\5<\u02b6\n<\3<\5<\u02b9\n<\3=\3=\5=\u02bd\n=\3>\3>\3"+
|
"\3<\3<\5<\u02b6\n<\3=\3=\3>\6>\u02bb\n>\r>\16>\u02bc\3?\3?\5?\u02c1\n"+
|
||||||
"?\6?\u02c2\n?\r?\16?\u02c3\3@\3@\5@\u02c8\n@\3A\6A\u02cb\nA\rA\16A\u02cc"+
|
"?\3@\6@\u02c4\n@\r@\16@\u02c5\3A\3A\3A\3A\3B\3B\5B\u02ce\nB\3B\5B\u02d1"+
|
||||||
"\3B\3B\3B\3B\3C\3C\5C\u02d5\nC\3C\5C\u02d8\nC\3D\3D\3E\6E\u02dd\nE\rE"+
|
"\nB\3C\3C\3D\6D\u02d6\nD\rD\16D\u02d7\3E\3E\5E\u02dc\nE\3F\3F\5F\u02e0"+
|
||||||
"\16E\u02de\3F\3F\5F\u02e3\nF\3G\3G\5G\u02e7\nG\3G\3G\3H\3H\5H\u02ed\n"+
|
"\nF\3F\3F\3G\3G\5G\u02e6\nG\3G\5G\u02e9\nG\3H\3H\3I\6I\u02ee\nI\rI\16"+
|
||||||
"H\3H\5H\u02f0\nH\3I\3I\3J\6J\u02f5\nJ\rJ\16J\u02f6\3K\3K\5K\u02fb\nK\3"+
|
"I\u02ef\3J\3J\5J\u02f4\nJ\3K\3K\3K\3K\3L\3L\5L\u02fc\nL\3L\5L\u02ff\n"+
|
||||||
"L\3L\3L\3L\3M\3M\5M\u0303\nM\3M\5M\u0306\nM\3N\3N\3O\6O\u030b\nO\rO\16"+
|
"L\3M\3M\3N\6N\u0304\nN\rN\16N\u0305\3O\3O\5O\u030a\nO\3P\3P\5P\u030e\n"+
|
||||||
"O\u030c\3P\3P\5P\u0311\nP\3Q\3Q\5Q\u0315\nQ\3R\3R\3R\5R\u031a\nR\3R\5"+
|
"P\3Q\3Q\3Q\5Q\u0313\nQ\3Q\5Q\u0316\nQ\3Q\5Q\u0319\nQ\3Q\3Q\3Q\5Q\u031e"+
|
||||||
"R\u031d\nR\3R\5R\u0320\nR\3R\3R\3R\5R\u0325\nR\3R\5R\u0328\nR\3R\3R\3"+
|
"\nQ\3Q\5Q\u0321\nQ\3Q\3Q\3Q\5Q\u0326\nQ\3Q\3Q\3Q\5Q\u032b\nQ\3R\3R\3R"+
|
||||||
"R\5R\u032d\nR\3R\3R\3R\5R\u0332\nR\3S\3S\3S\3T\3T\3U\5U\u033a\nU\3U\3"+
|
"\3S\3S\3T\5T\u0333\nT\3T\3T\3U\3U\3V\3V\3W\3W\3W\5W\u033e\nW\3X\3X\5X"+
|
||||||
"U\3V\3V\3W\3W\3X\3X\3X\5X\u0345\nX\3Y\3Y\5Y\u0349\nY\3Y\3Y\3Y\5Y\u034e"+
|
"\u0342\nX\3X\3X\3X\5X\u0347\nX\3X\3X\5X\u034b\nX\3Y\3Y\3Y\3Z\3Z\3[\3["+
|
||||||
"\nY\3Y\3Y\5Y\u0352\nY\3Z\3Z\3Z\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3"+
|
"\3[\3[\3[\3[\3[\3[\3[\5[\u035b\n[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\5\\"+
|
||||||
"\\\5\\\u0362\n\\\3]\3]\3]\3]\3]\3]\3]\3]\5]\u036c\n]\3^\3^\3_\3_\5_\u0372"+
|
"\u0365\n\\\3]\3]\3^\3^\5^\u036b\n^\3^\3^\3_\6_\u0370\n_\r_\16_\u0371\3"+
|
||||||
"\n_\3_\3_\3`\6`\u0377\n`\r`\16`\u0378\3a\3a\5a\u037d\na\3b\3b\3b\3b\5"+
|
"`\3`\5`\u0376\n`\3a\3a\3a\3a\5a\u037c\na\3b\3b\3b\3b\3b\3b\3b\3b\3b\3"+
|
||||||
"b\u0383\nb\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u0390\nc\3d\3d\3e\3e\3"+
|
"b\3b\5b\u0389\nb\3c\3c\3d\3d\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3f\3f\3g\3"+
|
||||||
"e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3"+
|
"g\3h\3h\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3"+
|
||||||
"m\3n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3s\3s\3t\3t\3u\3u\3v\3v\3w\3w\3w\3x\3"+
|
"s\3s\3t\3t\3u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y\3y\3y\3z\3z\3z\3{\3{\3"+
|
||||||
"x\3x\3y\3y\3y\3z\3z\3z\3{\3{\3{\3|\3|\3|\3}\3}\3}\3~\3~\3~\3\177\3\177"+
|
"{\3|\3|\3|\3}\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081"+
|
||||||
"\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084"+
|
"\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086"+
|
||||||
"\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0088"+
|
"\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0089"+
|
||||||
"\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008b"+
|
"\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3\u008c"+
|
||||||
"\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008e"+
|
"\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008f"+
|
||||||
"\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0091"+
|
"\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091"+
|
||||||
"\3\u0091\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+
|
"\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\7\u0093"+
|
||||||
"\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\7\u0094\u0415\n\u0094\f\u0094"+
|
"\u040e\n\u0093\f\u0093\16\u0093\u0411\13\u0093\3\u0094\3\u0094\3\u0094"+
|
||||||
"\16\u0094\u0418\13\u0094\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095"+
|
"\3\u0094\3\u0094\3\u0094\5\u0094\u0419\n\u0094\3\u0095\3\u0095\3\u0095"+
|
||||||
"\5\u0095\u0420\n\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+
|
"\3\u0095\3\u0095\3\u0095\5\u0095\u0421\n\u0095\3\u0096\3\u0096\3\u0097"+
|
||||||
"\5\u0096\u0428\n\u0096\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098\3\u0098"+
|
"\3\u0097\3\u0097\3\u0097\3\u0098\6\u0098\u042a\n\u0098\r\u0098\16\u0098"+
|
||||||
"\3\u0099\6\u0099\u0431\n\u0099\r\u0099\16\u0099\u0432\3\u0099\3\u0099"+
|
"\u042b\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\7\u0099\u0434\n"+
|
||||||
"\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a\u043b\n\u009a\f\u009a\16\u009a"+
|
"\u0099\f\u0099\16\u0099\u0437\13\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+
|
||||||
"\u043e\13\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009b\3\u009b"+
|
"\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a\u0442\n\u009a\f\u009a"+
|
||||||
"\3\u009b\3\u009b\7\u009b\u0449\n\u009b\f\u009b\16\u009b\u044c\13\u009b"+
|
"\16\u009a\u0445\13\u009a\3\u009a\3\u009a\3\u0435\2\u009b\3\3\5\4\7\5\t"+
|
||||||
"\3\u009b\3\u009b\3\u043c\2\u009c\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23"+
|
"\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23"+
|
||||||
"\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31"+
|
"%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G"+
|
||||||
"\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60"+
|
"%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\2k\2m\2o\2q\2s\2u\2w\2"+
|
||||||
"_\61a\62c\63e\64g\65i\66k\2m\2o\2q\2s\2u\2w\2y\2{\2}\2\177\2\u0081\2\u0083"+
|
"y\2{\2}\2\177\2\u0081\2\u0083\2\u0085\2\u0087\2\u0089\2\u008b\2\u008d"+
|
||||||
"\2\u0085\2\u0087\2\u0089\2\u008b\2\u008d\2\u008f\2\u0091\2\u0093\2\u0095"+
|
"\2\u008f\2\u0091\2\u0093\2\u0095\2\u0097\2\u0099\2\u009b\2\u009d\2\u009f"+
|
||||||
"\2\u0097\2\u0099\2\u009b\2\u009d\2\u009f\2\u00a1\67\u00a3\2\u00a5\2\u00a7"+
|
"\66\u00a1\2\u00a3\2\u00a5\2\u00a7\2\u00a9\2\u00ab\2\u00ad\2\u00af\2\u00b1"+
|
||||||
"\2\u00a9\2\u00ab\2\u00ad\2\u00af\2\u00b1\2\u00b3\2\u00b5\2\u00b78\u00b9"+
|
"\2\u00b3\2\u00b5\67\u00b78\u00b9\2\u00bb9\u00bd\2\u00bf\2\u00c1\2\u00c3"+
|
||||||
"9\u00bb\2\u00bd:\u00bf\2\u00c1\2\u00c3\2\u00c5\2\u00c7\2\u00c9\2\u00cb"+
|
"\2\u00c5\2\u00c7\2\u00c9:\u00cb;\u00cd<\u00cf=\u00d1>\u00d3?\u00d5@\u00d7"+
|
||||||
";\u00cd<\u00cf=\u00d1>\u00d3?\u00d5@\u00d7A\u00d9B\u00dbC\u00ddD\u00df"+
|
"A\u00d9B\u00dbC\u00ddD\u00dfE\u00e1F\u00e3G\u00e5H\u00e7I\u00e9J\u00eb"+
|
||||||
"E\u00e1F\u00e3G\u00e5H\u00e7I\u00e9J\u00ebK\u00edL\u00efM\u00f1N\u00f3"+
|
"K\u00edL\u00efM\u00f1N\u00f3O\u00f5P\u00f7Q\u00f9R\u00fbS\u00fdT\u00ff"+
|
||||||
"O\u00f5P\u00f7Q\u00f9R\u00fbS\u00fdT\u00ffU\u0101V\u0103W\u0105X\u0107"+
|
"U\u0101V\u0103W\u0105X\u0107Y\u0109Z\u010b[\u010d\\\u010f]\u0111^\u0113"+
|
||||||
"Y\u0109Z\u010b[\u010d\\\u010f]\u0111^\u0113_\u0115`\u0117a\u0119b\u011b"+
|
"_\u0115`\u0117a\u0119b\u011bc\u011dd\u011fe\u0121f\u0123g\u0125h\u0127"+
|
||||||
"c\u011dd\u011fe\u0121f\u0123g\u0125h\u0127i\u0129\2\u012b\2\u012dj\u012f"+
|
"\2\u0129\2\u012bi\u012dj\u012fk\u0131l\u0133m\3\2\30\4\2NNnn\3\2\63;\4"+
|
||||||
"k\u0131l\u0133m\u0135n\3\2\30\4\2NNnn\3\2\63;\4\2ZZzz\5\2\62;CHch\3\2"+
|
"\2ZZzz\5\2\62;CHch\3\2\629\4\2DDdd\3\2\62\63\4\2GGgg\4\2--//\6\2FFHHf"+
|
||||||
"\629\4\2DDdd\3\2\62\63\4\2GGgg\4\2--//\6\2FFHHffhh\4\2RRrr\4\2))^^\4\2"+
|
"fhh\4\2RRrr\4\2))^^\4\2$$^^\n\2$$))^^ddhhppttvv\3\2\62\65\6\2&&C\\aac"+
|
||||||
"$$^^\n\2$$))^^ddhhppttvv\3\2\62\65\6\2&&C\\aac|\4\2\2\u0081\ud802\udc01"+
|
"|\4\2\2\u0081\ud802\udc01\3\2\ud802\udc01\3\2\udc02\ue001\7\2&&\62;C\\"+
|
||||||
"\3\2\ud802\udc01\3\2\udc02\ue001\7\2&&\62;C\\aac|\5\2\13\f\16\17\"\"\4"+
|
"aac|\5\2\13\f\16\17\"\"\4\2\f\f\17\17\2\u0456\2\3\3\2\2\2\2\5\3\2\2\2"+
|
||||||
"\2\f\f\17\17\u045d\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13"+
|
"\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3"+
|
||||||
"\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2"+
|
"\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2"+
|
||||||
"\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2"+
|
"\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2"+
|
||||||
"!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3"+
|
"\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2"+
|
||||||
"\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2"+
|
"\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2"+
|
||||||
"\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E"+
|
"\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2"+
|
||||||
"\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2"+
|
"\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y"+
|
||||||
"\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2"+
|
"\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2"+
|
||||||
"\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2\u00a1"+
|
"\2\2\2g\3\2\2\2\2\u009f\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00bb"+
|
||||||
"\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bd\3\2\2\2\2\u00cb\3\2\2"+
|
"\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2"+
|
||||||
"\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5"+
|
"\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+
|
||||||
"\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2"+
|
"\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2"+
|
||||||
"\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7"+
|
"\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb"+
|
||||||
"\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2"+
|
"\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2"+
|
||||||
"\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9"+
|
"\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd"+
|
||||||
"\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2"+
|
"\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2"+
|
||||||
"\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b"+
|
"\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b\3\2\2\2\2\u010d\3\2\2\2\2\u010f"+
|
||||||
"\3\2\2\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2\2\2\u0113\3\2\2"+
|
"\3\2\2\2\2\u0111\3\2\2\2\2\u0113\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2"+
|
||||||
"\2\2\u0115\3\2\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d"+
|
"\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0121"+
|
||||||
"\3\2\2\2\2\u011f\3\2\2\2\2\u0121\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2"+
|
"\3\2\2\2\2\u0123\3\2\2\2\2\u0125\3\2\2\2\2\u012b\3\2\2\2\2\u012d\3\2\2"+
|
||||||
"\2\2\u0127\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2\2\2\u0131\3\2\2\2\2\u0133"+
|
"\2\2\u012f\3\2\2\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\3\u0135\3\2\2\2\5\u013e"+
|
||||||
"\3\2\2\2\2\u0135\3\2\2\2\3\u0137\3\2\2\2\5\u013c\3\2\2\2\7\u0145\3\2\2"+
|
"\3\2\2\2\7\u0145\3\2\2\2\t\u014d\3\2\2\2\13\u0153\3\2\2\2\r\u0158\3\2"+
|
||||||
"\2\t\u014c\3\2\2\2\13\u0154\3\2\2\2\r\u015a\3\2\2\2\17\u015f\3\2\2\2\21"+
|
"\2\2\17\u015d\3\2\2\2\21\u0163\3\2\2\2\23\u0168\3\2\2\2\25\u016e\3\2\2"+
|
||||||
"\u0164\3\2\2\2\23\u016a\3\2\2\2\25\u016f\3\2\2\2\27\u0175\3\2\2\2\31\u017b"+
|
"\2\27\u0174\3\2\2\2\31\u017d\3\2\2\2\33\u0185\3\2\2\2\35\u0188\3\2\2\2"+
|
||||||
"\3\2\2\2\33\u0184\3\2\2\2\35\u018c\3\2\2\2\37\u018f\3\2\2\2!\u0196\3\2"+
|
"\37\u018f\3\2\2\2!\u0194\3\2\2\2#\u0199\3\2\2\2%\u01a1\3\2\2\2\'\u01a7"+
|
||||||
"\2\2#\u019b\3\2\2\2%\u01a0\3\2\2\2\'\u01a8\3\2\2\2)\u01ae\3\2\2\2+\u01b6"+
|
"\3\2\2\2)\u01af\3\2\2\2+\u01b5\3\2\2\2-\u01b9\3\2\2\2/\u01bc\3\2\2\2\61"+
|
||||||
"\3\2\2\2-\u01bc\3\2\2\2/\u01c0\3\2\2\2\61\u01c3\3\2\2\2\63\u01c8\3\2\2"+
|
"\u01c1\3\2\2\2\63\u01cc\3\2\2\2\65\u01d3\3\2\2\2\67\u01de\3\2\2\29\u01e2"+
|
||||||
"\2\65\u01d3\3\2\2\2\67\u01da\3\2\2\29\u01e5\3\2\2\2;\u01e9\3\2\2\2=\u01f3"+
|
"\3\2\2\2;\u01ec\3\2\2\2=\u01f1\3\2\2\2?\u01f8\3\2\2\2A\u01fc\3\2\2\2C"+
|
||||||
"\3\2\2\2?\u01f8\3\2\2\2A\u01ff\3\2\2\2C\u0203\3\2\2\2E\u020b\3\2\2\2G"+
|
"\u0204\3\2\2\2E\u020c\3\2\2\2G\u0216\3\2\2\2I\u021d\3\2\2\2K\u0224\3\2"+
|
||||||
"\u0213\3\2\2\2I\u021d\3\2\2\2K\u0224\3\2\2\2M\u022b\3\2\2\2O\u0231\3\2"+
|
"\2\2M\u022a\3\2\2\2O\u0231\3\2\2\2Q\u023a\3\2\2\2S\u0240\3\2\2\2U\u0247"+
|
||||||
"\2\2Q\u0238\3\2\2\2S\u0241\3\2\2\2U\u0247\3\2\2\2W\u024e\3\2\2\2Y\u025b"+
|
"\3\2\2\2W\u0254\3\2\2\2Y\u0259\3\2\2\2[\u025f\3\2\2\2]\u0266\3\2\2\2_"+
|
||||||
"\3\2\2\2[\u0260\3\2\2\2]\u0266\3\2\2\2_\u026d\3\2\2\2a\u0277\3\2\2\2c"+
|
"\u0270\3\2\2\2a\u0274\3\2\2\2c\u0279\3\2\2\2e\u0282\3\2\2\2g\u028c\3\2"+
|
||||||
"\u027b\3\2\2\2e\u0280\3\2\2\2g\u0289\3\2\2\2i\u0293\3\2\2\2k\u0295\3\2"+
|
"\2\2i\u028e\3\2\2\2k\u0292\3\2\2\2m\u0296\3\2\2\2o\u029a\3\2\2\2q\u029e"+
|
||||||
"\2\2m\u0299\3\2\2\2o\u029d\3\2\2\2q\u02a1\3\2\2\2s\u02a5\3\2\2\2u\u02b1"+
|
"\3\2\2\2s\u02aa\3\2\2\2u\u02ac\3\2\2\2w\u02b5\3\2\2\2y\u02b7\3\2\2\2{"+
|
||||||
"\3\2\2\2w\u02b3\3\2\2\2y\u02bc\3\2\2\2{\u02be\3\2\2\2}\u02c1\3\2\2\2\177"+
|
"\u02ba\3\2\2\2}\u02c0\3\2\2\2\177\u02c3\3\2\2\2\u0081\u02c7\3\2\2\2\u0083"+
|
||||||
"\u02c7\3\2\2\2\u0081\u02ca\3\2\2\2\u0083\u02ce\3\2\2\2\u0085\u02d2\3\2"+
|
"\u02cb\3\2\2\2\u0085\u02d2\3\2\2\2\u0087\u02d5\3\2\2\2\u0089\u02db\3\2"+
|
||||||
"\2\2\u0087\u02d9\3\2\2\2\u0089\u02dc\3\2\2\2\u008b\u02e2\3\2\2\2\u008d"+
|
"\2\2\u008b\u02dd\3\2\2\2\u008d\u02e3\3\2\2\2\u008f\u02ea\3\2\2\2\u0091"+
|
||||||
"\u02e4\3\2\2\2\u008f\u02ea\3\2\2\2\u0091\u02f1\3\2\2\2\u0093\u02f4\3\2"+
|
"\u02ed\3\2\2\2\u0093\u02f3\3\2\2\2\u0095\u02f5\3\2\2\2\u0097\u02f9\3\2"+
|
||||||
"\2\2\u0095\u02fa\3\2\2\2\u0097\u02fc\3\2\2\2\u0099\u0300\3\2\2\2\u009b"+
|
"\2\2\u0099\u0300\3\2\2\2\u009b\u0303\3\2\2\2\u009d\u0309\3\2\2\2\u009f"+
|
||||||
"\u0307\3\2\2\2\u009d\u030a\3\2\2\2\u009f\u0310\3\2\2\2\u00a1\u0314\3\2"+
|
"\u030d\3\2\2\2\u00a1\u032a\3\2\2\2\u00a3\u032c\3\2\2\2\u00a5\u032f\3\2"+
|
||||||
"\2\2\u00a3\u0331\3\2\2\2\u00a5\u0333\3\2\2\2\u00a7\u0336\3\2\2\2\u00a9"+
|
"\2\2\u00a7\u0332\3\2\2\2\u00a9\u0336\3\2\2\2\u00ab\u0338\3\2\2\2\u00ad"+
|
||||||
"\u0339\3\2\2\2\u00ab\u033d\3\2\2\2\u00ad\u033f\3\2\2\2\u00af\u0341\3\2"+
|
"\u033a\3\2\2\2\u00af\u034a\3\2\2\2\u00b1\u034c\3\2\2\2\u00b3\u034f\3\2"+
|
||||||
"\2\2\u00b1\u0351\3\2\2\2\u00b3\u0353\3\2\2\2\u00b5\u0356\3\2\2\2\u00b7"+
|
"\2\2\u00b5\u035a\3\2\2\2\u00b7\u0364\3\2\2\2\u00b9\u0366\3\2\2\2\u00bb"+
|
||||||
"\u0361\3\2\2\2\u00b9\u036b\3\2\2\2\u00bb\u036d\3\2\2\2\u00bd\u036f\3\2"+
|
"\u0368\3\2\2\2\u00bd\u036f\3\2\2\2\u00bf\u0375\3\2\2\2\u00c1\u037b\3\2"+
|
||||||
"\2\2\u00bf\u0376\3\2\2\2\u00c1\u037c\3\2\2\2\u00c3\u0382\3\2\2\2\u00c5"+
|
"\2\2\u00c3\u0388\3\2\2\2\u00c5\u038a\3\2\2\2\u00c7\u038c\3\2\2\2\u00c9"+
|
||||||
"\u038f\3\2\2\2\u00c7\u0391\3\2\2\2\u00c9\u0393\3\2\2\2\u00cb\u039a\3\2"+
|
"\u0393\3\2\2\2\u00cb\u0398\3\2\2\2\u00cd\u039a\3\2\2\2\u00cf\u039c\3\2"+
|
||||||
"\2\2\u00cd\u039f\3\2\2\2\u00cf\u03a1\3\2\2\2\u00d1\u03a3\3\2\2\2\u00d3"+
|
"\2\2\u00d1\u039e\3\2\2\2\u00d3\u03a0\3\2\2\2\u00d5\u03a2\3\2\2\2\u00d7"+
|
||||||
"\u03a5\3\2\2\2\u00d5\u03a7\3\2\2\2\u00d7\u03a9\3\2\2\2\u00d9\u03ab\3\2"+
|
"\u03a4\3\2\2\2\u00d9\u03a6\3\2\2\2\u00db\u03a8\3\2\2\2\u00dd\u03aa\3\2"+
|
||||||
"\2\2\u00db\u03ad\3\2\2\2\u00dd\u03af\3\2\2\2\u00df\u03b1\3\2\2\2\u00e1"+
|
"\2\2\u00df\u03ac\3\2\2\2\u00e1\u03ae\3\2\2\2\u00e3\u03b0\3\2\2\2\u00e5"+
|
||||||
"\u03b3\3\2\2\2\u00e3\u03b5\3\2\2\2\u00e5\u03b7\3\2\2\2\u00e7\u03b9\3\2"+
|
"\u03b2\3\2\2\2\u00e7\u03b4\3\2\2\2\u00e9\u03b6\3\2\2\2\u00eb\u03b8\3\2"+
|
||||||
"\2\2\u00e9\u03bb\3\2\2\2\u00eb\u03bd\3\2\2\2\u00ed\u03bf\3\2\2\2\u00ef"+
|
"\2\2\u00ed\u03bb\3\2\2\2\u00ef\u03be\3\2\2\2\u00f1\u03c1\3\2\2\2\u00f3"+
|
||||||
"\u03c2\3\2\2\2\u00f1\u03c5\3\2\2\2\u00f3\u03c8\3\2\2\2\u00f5\u03cb\3\2"+
|
"\u03c4\3\2\2\2\u00f5\u03c7\3\2\2\2\u00f7\u03ca\3\2\2\2\u00f9\u03cd\3\2"+
|
||||||
"\2\2\u00f7\u03ce\3\2\2\2\u00f9\u03d1\3\2\2\2\u00fb\u03d4\3\2\2\2\u00fd"+
|
"\2\2\u00fb\u03d0\3\2\2\2\u00fd\u03d2\3\2\2\2\u00ff\u03d4\3\2\2\2\u0101"+
|
||||||
"\u03d7\3\2\2\2\u00ff\u03d9\3\2\2\2\u0101\u03db\3\2\2\2\u0103\u03dd\3\2"+
|
"\u03d6\3\2\2\2\u0103\u03d8\3\2\2\2\u0105\u03da\3\2\2\2\u0107\u03dc\3\2"+
|
||||||
"\2\2\u0105\u03df\3\2\2\2\u0107\u03e1\3\2\2\2\u0109\u03e3\3\2\2\2\u010b"+
|
"\2\2\u0109\u03de\3\2\2\2\u010b\u03e0\3\2\2\2\u010d\u03e3\3\2\2\2\u010f"+
|
||||||
"\u03e5\3\2\2\2\u010d\u03e7\3\2\2\2\u010f\u03ea\3\2\2\2\u0111\u03ed\3\2"+
|
"\u03e6\3\2\2\2\u0111\u03e9\3\2\2\2\u0113\u03ec\3\2\2\2\u0115\u03ef\3\2"+
|
||||||
"\2\2\u0113\u03f0\3\2\2\2\u0115\u03f3\3\2\2\2\u0117\u03f6\3\2\2\2\u0119"+
|
"\2\2\u0117\u03f2\3\2\2\2\u0119\u03f5\3\2\2\2\u011b\u03f8\3\2\2\2\u011d"+
|
||||||
"\u03f9\3\2\2\2\u011b\u03fc\3\2\2\2\u011d\u03ff\3\2\2\2\u011f\u0402\3\2"+
|
"\u03fb\3\2\2\2\u011f\u03fe\3\2\2\2\u0121\u0402\3\2\2\2\u0123\u0406\3\2"+
|
||||||
"\2\2\u0121\u0405\3\2\2\2\u0123\u0409\3\2\2\2\u0125\u040d\3\2\2\2\u0127"+
|
"\2\2\u0125\u040b\3\2\2\2\u0127\u0418\3\2\2\2\u0129\u0420\3\2\2\2\u012b"+
|
||||||
"\u0412\3\2\2\2\u0129\u041f\3\2\2\2\u012b\u0427\3\2\2\2\u012d\u0429\3\2"+
|
"\u0422\3\2\2\2\u012d\u0424\3\2\2\2\u012f\u0429\3\2\2\2\u0131\u042f\3\2"+
|
||||||
"\2\2\u012f\u042b\3\2\2\2\u0131\u0430\3\2\2\2\u0133\u0436\3\2\2\2\u0135"+
|
"\2\2\u0133\u043d\3\2\2\2\u0135\u0136\7c\2\2\u0136\u0137\7d\2\2\u0137\u0138"+
|
||||||
"\u0444\3\2\2\2\u0137\u0138\7c\2\2\u0138\u0139\7w\2\2\u0139\u013a\7v\2"+
|
"\7u\2\2\u0138\u0139\7v\2\2\u0139\u013a\7t\2\2\u013a\u013b\7c\2\2\u013b"+
|
||||||
"\2\u013a\u013b\7q\2\2\u013b\4\3\2\2\2\u013c\u013d\7c\2\2\u013d\u013e\7"+
|
"\u013c\7e\2\2\u013c\u013d\7v\2\2\u013d\4\3\2\2\2\u013e\u013f\7c\2\2\u013f"+
|
||||||
"d\2\2\u013e\u013f\7u\2\2\u013f\u0140\7v\2\2\u0140\u0141\7t\2\2\u0141\u0142"+
|
"\u0140\7u\2\2\u0140\u0141\7u\2\2\u0141\u0142\7g\2\2\u0142\u0143\7t\2\2"+
|
||||||
"\7c\2\2\u0142\u0143\7e\2\2\u0143\u0144\7v\2\2\u0144\6\3\2\2\2\u0145\u0146"+
|
"\u0143\u0144\7v\2\2\u0144\6\3\2\2\2\u0145\u0146\7d\2\2\u0146\u0147\7q"+
|
||||||
"\7c\2\2\u0146\u0147\7u\2\2\u0147\u0148\7u\2\2\u0148\u0149\7g\2\2\u0149"+
|
"\2\2\u0147\u0148\7q\2\2\u0148\u0149\7n\2\2\u0149\u014a\7g\2\2\u014a\u014b"+
|
||||||
"\u014a\7t\2\2\u014a\u014b\7v\2\2\u014b\b\3\2\2\2\u014c\u014d\7d\2\2\u014d"+
|
"\7c\2\2\u014b\u014c\7p\2\2\u014c\b\3\2\2\2\u014d\u014e\7d\2\2\u014e\u014f"+
|
||||||
"\u014e\7q\2\2\u014e\u014f\7q\2\2\u014f\u0150\7n\2\2\u0150\u0151\7g\2\2"+
|
"\7t\2\2\u014f\u0150\7g\2\2\u0150\u0151\7c\2\2\u0151\u0152\7m\2\2\u0152"+
|
||||||
"\u0151\u0152\7c\2\2\u0152\u0153\7p\2\2\u0153\n\3\2\2\2\u0154\u0155\7d"+
|
"\n\3\2\2\2\u0153\u0154\7d\2\2\u0154\u0155\7{\2\2\u0155\u0156\7v\2\2\u0156"+
|
||||||
"\2\2\u0155\u0156\7t\2\2\u0156\u0157\7g\2\2\u0157\u0158\7c\2\2\u0158\u0159"+
|
"\u0157\7g\2\2\u0157\f\3\2\2\2\u0158\u0159\7e\2\2\u0159\u015a\7c\2\2\u015a"+
|
||||||
"\7m\2\2\u0159\f\3\2\2\2\u015a\u015b\7d\2\2\u015b\u015c\7{\2\2\u015c\u015d"+
|
"\u015b\7u\2\2\u015b\u015c\7g\2\2\u015c\16\3\2\2\2\u015d\u015e\7e\2\2\u015e"+
|
||||||
"\7v\2\2\u015d\u015e\7g\2\2\u015e\16\3\2\2\2\u015f\u0160\7e\2\2\u0160\u0161"+
|
"\u015f\7c\2\2\u015f\u0160\7v\2\2\u0160\u0161\7e\2\2\u0161\u0162\7j\2\2"+
|
||||||
"\7c\2\2\u0161\u0162\7u\2\2\u0162\u0163\7g\2\2\u0163\20\3\2\2\2\u0164\u0165"+
|
"\u0162\20\3\2\2\2\u0163\u0164\7e\2\2\u0164\u0165\7j\2\2\u0165\u0166\7"+
|
||||||
"\7e\2\2\u0165\u0166\7c\2\2\u0166\u0167\7v\2\2\u0167\u0168\7e\2\2\u0168"+
|
"c\2\2\u0166\u0167\7t\2\2\u0167\22\3\2\2\2\u0168\u0169\7e\2\2\u0169\u016a"+
|
||||||
"\u0169\7j\2\2\u0169\22\3\2\2\2\u016a\u016b\7e\2\2\u016b\u016c\7j\2\2\u016c"+
|
"\7n\2\2\u016a\u016b\7c\2\2\u016b\u016c\7u\2\2\u016c\u016d\7u\2\2\u016d"+
|
||||||
"\u016d\7c\2\2\u016d\u016e\7t\2\2\u016e\24\3\2\2\2\u016f\u0170\7e\2\2\u0170"+
|
"\24\3\2\2\2\u016e\u016f\7e\2\2\u016f\u0170\7q\2\2\u0170\u0171\7p\2\2\u0171"+
|
||||||
"\u0171\7n\2\2\u0171\u0172\7c\2\2\u0172\u0173\7u\2\2\u0173\u0174\7u\2\2"+
|
"\u0172\7u\2\2\u0172\u0173\7v\2\2\u0173\26\3\2\2\2\u0174\u0175\7e\2\2\u0175"+
|
||||||
"\u0174\26\3\2\2\2\u0175\u0176\7e\2\2\u0176\u0177\7q\2\2\u0177\u0178\7"+
|
"\u0176\7q\2\2\u0176\u0177\7p\2\2\u0177\u0178\7v\2\2\u0178\u0179\7k\2\2"+
|
||||||
"p\2\2\u0178\u0179\7u\2\2\u0179\u017a\7v\2\2\u017a\30\3\2\2\2\u017b\u017c"+
|
"\u0179\u017a\7p\2\2\u017a\u017b\7w\2\2\u017b\u017c\7g\2\2\u017c\30\3\2"+
|
||||||
"\7e\2\2\u017c\u017d\7q\2\2\u017d\u017e\7p\2\2\u017e\u017f\7v\2\2\u017f"+
|
"\2\2\u017d\u017e\7f\2\2\u017e\u017f\7g\2\2\u017f\u0180\7h\2\2\u0180\u0181"+
|
||||||
"\u0180\7k\2\2\u0180\u0181\7p\2\2\u0181\u0182\7w\2\2\u0182\u0183\7g\2\2"+
|
"\7c\2\2\u0181\u0182\7w\2\2\u0182\u0183\7n\2\2\u0183\u0184\7v\2\2\u0184"+
|
||||||
"\u0183\32\3\2\2\2\u0184\u0185\7f\2\2\u0185\u0186\7g\2\2\u0186\u0187\7"+
|
"\32\3\2\2\2\u0185\u0186\7f\2\2\u0186\u0187\7q\2\2\u0187\34\3\2\2\2\u0188"+
|
||||||
"h\2\2\u0187\u0188\7c\2\2\u0188\u0189\7w\2\2\u0189\u018a\7n\2\2\u018a\u018b"+
|
"\u0189\7f\2\2\u0189\u018a\7q\2\2\u018a\u018b\7w\2\2\u018b\u018c\7d\2\2"+
|
||||||
"\7v\2\2\u018b\34\3\2\2\2\u018c\u018d\7f\2\2\u018d\u018e\7q\2\2\u018e\36"+
|
"\u018c\u018d\7n\2\2\u018d\u018e\7g\2\2\u018e\36\3\2\2\2\u018f\u0190\7"+
|
||||||
"\3\2\2\2\u018f\u0190\7f\2\2\u0190\u0191\7q\2\2\u0191\u0192\7w\2\2\u0192"+
|
"g\2\2\u0190\u0191\7n\2\2\u0191\u0192\7u\2\2\u0192\u0193\7g\2\2\u0193 "+
|
||||||
"\u0193\7d\2\2\u0193\u0194\7n\2\2\u0194\u0195\7g\2\2\u0195 \3\2\2\2\u0196"+
|
"\3\2\2\2\u0194\u0195\7g\2\2\u0195\u0196\7p\2\2\u0196\u0197\7w\2\2\u0197"+
|
||||||
"\u0197\7g\2\2\u0197\u0198\7n\2\2\u0198\u0199\7u\2\2\u0199\u019a\7g\2\2"+
|
"\u0198\7o\2\2\u0198\"\3\2\2\2\u0199\u019a\7g\2\2\u019a\u019b\7z\2\2\u019b"+
|
||||||
"\u019a\"\3\2\2\2\u019b\u019c\7g\2\2\u019c\u019d\7p\2\2\u019d\u019e\7w"+
|
"\u019c\7v\2\2\u019c\u019d\7g\2\2\u019d\u019e\7p\2\2\u019e\u019f\7f\2\2"+
|
||||||
"\2\2\u019e\u019f\7o\2\2\u019f$\3\2\2\2\u01a0\u01a1\7g\2\2\u01a1\u01a2"+
|
"\u019f\u01a0\7u\2\2\u01a0$\3\2\2\2\u01a1\u01a2\7h\2\2\u01a2\u01a3\7k\2"+
|
||||||
"\7z\2\2\u01a2\u01a3\7v\2\2\u01a3\u01a4\7g\2\2\u01a4\u01a5\7p\2\2\u01a5"+
|
"\2\u01a3\u01a4\7p\2\2\u01a4\u01a5\7c\2\2\u01a5\u01a6\7n\2\2\u01a6&\3\2"+
|
||||||
"\u01a6\7f\2\2\u01a6\u01a7\7u\2\2\u01a7&\3\2\2\2\u01a8\u01a9\7h\2\2\u01a9"+
|
"\2\2\u01a7\u01a8\7h\2\2\u01a8\u01a9\7k\2\2\u01a9\u01aa\7p\2\2\u01aa\u01ab"+
|
||||||
"\u01aa\7k\2\2\u01aa\u01ab\7p\2\2\u01ab\u01ac\7c\2\2\u01ac\u01ad\7n\2\2"+
|
"\7c\2\2\u01ab\u01ac\7n\2\2\u01ac\u01ad\7n\2\2\u01ad\u01ae\7{\2\2\u01ae"+
|
||||||
"\u01ad(\3\2\2\2\u01ae\u01af\7h\2\2\u01af\u01b0\7k\2\2\u01b0\u01b1\7p\2"+
|
"(\3\2\2\2\u01af\u01b0\7h\2\2\u01b0\u01b1\7n\2\2\u01b1\u01b2\7q\2\2\u01b2"+
|
||||||
"\2\u01b1\u01b2\7c\2\2\u01b2\u01b3\7n\2\2\u01b3\u01b4\7n\2\2\u01b4\u01b5"+
|
"\u01b3\7c\2\2\u01b3\u01b4\7v\2\2\u01b4*\3\2\2\2\u01b5\u01b6\7h\2\2\u01b6"+
|
||||||
"\7{\2\2\u01b5*\3\2\2\2\u01b6\u01b7\7h\2\2\u01b7\u01b8\7n\2\2\u01b8\u01b9"+
|
"\u01b7\7q\2\2\u01b7\u01b8\7t\2\2\u01b8,\3\2\2\2\u01b9\u01ba\7k\2\2\u01ba"+
|
||||||
"\7q\2\2\u01b9\u01ba\7c\2\2\u01ba\u01bb\7v\2\2\u01bb,\3\2\2\2\u01bc\u01bd"+
|
"\u01bb\7h\2\2\u01bb.\3\2\2\2\u01bc\u01bd\7i\2\2\u01bd\u01be\7q\2\2\u01be"+
|
||||||
"\7h\2\2\u01bd\u01be\7q\2\2\u01be\u01bf\7t\2\2\u01bf.\3\2\2\2\u01c0\u01c1"+
|
"\u01bf\7v\2\2\u01bf\u01c0\7q\2\2\u01c0\60\3\2\2\2\u01c1\u01c2\7k\2\2\u01c2"+
|
||||||
"\7k\2\2\u01c1\u01c2\7h\2\2\u01c2\60\3\2\2\2\u01c3\u01c4\7i\2\2\u01c4\u01c5"+
|
"\u01c3\7o\2\2\u01c3\u01c4\7r\2\2\u01c4\u01c5\7n\2\2\u01c5\u01c6\7g\2\2"+
|
||||||
"\7q\2\2\u01c5\u01c6\7v\2\2\u01c6\u01c7\7q\2\2\u01c7\62\3\2\2\2\u01c8\u01c9"+
|
"\u01c6\u01c7\7o\2\2\u01c7\u01c8\7g\2\2\u01c8\u01c9\7p\2\2\u01c9\u01ca"+
|
||||||
"\7k\2\2\u01c9\u01ca\7o\2\2\u01ca\u01cb\7r\2\2\u01cb\u01cc\7n\2\2\u01cc"+
|
"\7v\2\2\u01ca\u01cb\7u\2\2\u01cb\62\3\2\2\2\u01cc\u01cd\7k\2\2\u01cd\u01ce"+
|
||||||
"\u01cd\7g\2\2\u01cd\u01ce\7o\2\2\u01ce\u01cf\7g\2\2\u01cf\u01d0\7p\2\2"+
|
"\7o\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7q\2\2\u01d0\u01d1\7t\2\2\u01d1"+
|
||||||
"\u01d0\u01d1\7v\2\2\u01d1\u01d2\7u\2\2\u01d2\64\3\2\2\2\u01d3\u01d4\7"+
|
"\u01d2\7v\2\2\u01d2\64\3\2\2\2\u01d3\u01d4\7k\2\2\u01d4\u01d5\7p\2\2\u01d5"+
|
||||||
"k\2\2\u01d4\u01d5\7o\2\2\u01d5\u01d6\7r\2\2\u01d6\u01d7\7q\2\2\u01d7\u01d8"+
|
"\u01d6\7u\2\2\u01d6\u01d7\7v\2\2\u01d7\u01d8\7c\2\2\u01d8\u01d9\7p\2\2"+
|
||||||
"\7t\2\2\u01d8\u01d9\7v\2\2\u01d9\66\3\2\2\2\u01da\u01db\7k\2\2\u01db\u01dc"+
|
"\u01d9\u01da\7e\2\2\u01da\u01db\7g\2\2\u01db\u01dc\7q\2\2\u01dc\u01dd"+
|
||||||
"\7p\2\2\u01dc\u01dd\7u\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7c\2\2\u01df"+
|
"\7h\2\2\u01dd\66\3\2\2\2\u01de\u01df\7k\2\2\u01df\u01e0\7p\2\2\u01e0\u01e1"+
|
||||||
"\u01e0\7p\2\2\u01e0\u01e1\7e\2\2\u01e1\u01e2\7g\2\2\u01e2\u01e3\7q\2\2"+
|
"\7v\2\2\u01e18\3\2\2\2\u01e2\u01e3\7k\2\2\u01e3\u01e4\7p\2\2\u01e4\u01e5"+
|
||||||
"\u01e3\u01e4\7h\2\2\u01e48\3\2\2\2\u01e5\u01e6\7k\2\2\u01e6\u01e7\7p\2"+
|
"\7v\2\2\u01e5\u01e6\7g\2\2\u01e6\u01e7\7t\2\2\u01e7\u01e8\7h\2\2\u01e8"+
|
||||||
"\2\u01e7\u01e8\7v\2\2\u01e8:\3\2\2\2\u01e9\u01ea\7k\2\2\u01ea\u01eb\7"+
|
"\u01e9\7c\2\2\u01e9\u01ea\7e\2\2\u01ea\u01eb\7g\2\2\u01eb:\3\2\2\2\u01ec"+
|
||||||
"p\2\2\u01eb\u01ec\7v\2\2\u01ec\u01ed\7g\2\2\u01ed\u01ee\7t\2\2\u01ee\u01ef"+
|
"\u01ed\7n\2\2\u01ed\u01ee\7q\2\2\u01ee\u01ef\7p\2\2\u01ef\u01f0\7i\2\2"+
|
||||||
"\7h\2\2\u01ef\u01f0\7c\2\2\u01f0\u01f1\7e\2\2\u01f1\u01f2\7g\2\2\u01f2"+
|
"\u01f0<\3\2\2\2\u01f1\u01f2\7p\2\2\u01f2\u01f3\7c\2\2\u01f3\u01f4\7v\2"+
|
||||||
"<\3\2\2\2\u01f3\u01f4\7n\2\2\u01f4\u01f5\7q\2\2\u01f5\u01f6\7p\2\2\u01f6"+
|
"\2\u01f4\u01f5\7k\2\2\u01f5\u01f6\7x\2\2\u01f6\u01f7\7g\2\2\u01f7>\3\2"+
|
||||||
"\u01f7\7i\2\2\u01f7>\3\2\2\2\u01f8\u01f9\7p\2\2\u01f9\u01fa\7c\2\2\u01fa"+
|
"\2\2\u01f8\u01f9\7p\2\2\u01f9\u01fa\7g\2\2\u01fa\u01fb\7y\2\2\u01fb@\3"+
|
||||||
"\u01fb\7v\2\2\u01fb\u01fc\7k\2\2\u01fc\u01fd\7x\2\2\u01fd\u01fe\7g\2\2"+
|
"\2\2\2\u01fc\u01fd\7r\2\2\u01fd\u01fe\7c\2\2\u01fe\u01ff\7e\2\2\u01ff"+
|
||||||
"\u01fe@\3\2\2\2\u01ff\u0200\7p\2\2\u0200\u0201\7g\2\2\u0201\u0202\7y\2"+
|
"\u0200\7m\2\2\u0200\u0201\7c\2\2\u0201\u0202\7i\2\2\u0202\u0203\7g\2\2"+
|
||||||
"\2\u0202B\3\2\2\2\u0203\u0204\7r\2\2\u0204\u0205\7c\2\2\u0205\u0206\7"+
|
"\u0203B\3\2\2\2\u0204\u0205\7r\2\2\u0205\u0206\7t\2\2\u0206\u0207\7k\2"+
|
||||||
"e\2\2\u0206\u0207\7m\2\2\u0207\u0208\7c\2\2\u0208\u0209\7i\2\2\u0209\u020a"+
|
"\2\u0207\u0208\7x\2\2\u0208\u0209\7c\2\2\u0209\u020a\7v\2\2\u020a\u020b"+
|
||||||
"\7g\2\2\u020aD\3\2\2\2\u020b\u020c\7r\2\2\u020c\u020d\7t\2\2\u020d\u020e"+
|
"\7g\2\2\u020bD\3\2\2\2\u020c\u020d\7r\2\2\u020d\u020e\7t\2\2\u020e\u020f"+
|
||||||
"\7k\2\2\u020e\u020f\7x\2\2\u020f\u0210\7c\2\2\u0210\u0211\7v\2\2\u0211"+
|
"\7q\2\2\u020f\u0210\7v\2\2\u0210\u0211\7g\2\2\u0211\u0212\7e\2\2\u0212"+
|
||||||
"\u0212\7g\2\2\u0212F\3\2\2\2\u0213\u0214\7r\2\2\u0214\u0215\7t\2\2\u0215"+
|
"\u0213\7v\2\2\u0213\u0214\7g\2\2\u0214\u0215\7f\2\2\u0215F\3\2\2\2\u0216"+
|
||||||
"\u0216\7q\2\2\u0216\u0217\7v\2\2\u0217\u0218\7g\2\2\u0218\u0219\7e\2\2"+
|
"\u0217\7r\2\2\u0217\u0218\7w\2\2\u0218\u0219\7d\2\2\u0219\u021a\7n\2\2"+
|
||||||
"\u0219\u021a\7v\2\2\u021a\u021b\7g\2\2\u021b\u021c\7f\2\2\u021cH\3\2\2"+
|
"\u021a\u021b\7k\2\2\u021b\u021c\7e\2\2\u021cH\3\2\2\2\u021d\u021e\7t\2"+
|
||||||
"\2\u021d\u021e\7r\2\2\u021e\u021f\7w\2\2\u021f\u0220\7d\2\2\u0220\u0221"+
|
"\2\u021e\u021f\7g\2\2\u021f\u0220\7v\2\2\u0220\u0221\7w\2\2\u0221\u0222"+
|
||||||
"\7n\2\2\u0221\u0222\7k\2\2\u0222\u0223\7e\2\2\u0223J\3\2\2\2\u0224\u0225"+
|
"\7t\2\2\u0222\u0223\7p\2\2\u0223J\3\2\2\2\u0224\u0225\7u\2\2\u0225\u0226"+
|
||||||
"\7t\2\2\u0225\u0226\7g\2\2\u0226\u0227\7v\2\2\u0227\u0228\7w\2\2\u0228"+
|
"\7j\2\2\u0226\u0227\7q\2\2\u0227\u0228\7t\2\2\u0228\u0229\7v\2\2\u0229"+
|
||||||
"\u0229\7t\2\2\u0229\u022a\7p\2\2\u022aL\3\2\2\2\u022b\u022c\7u\2\2\u022c"+
|
"L\3\2\2\2\u022a\u022b\7u\2\2\u022b\u022c\7v\2\2\u022c\u022d\7c\2\2\u022d"+
|
||||||
"\u022d\7j\2\2\u022d\u022e\7q\2\2\u022e\u022f\7t\2\2\u022f\u0230\7v\2\2"+
|
"\u022e\7v\2\2\u022e\u022f\7k\2\2\u022f\u0230\7e\2\2\u0230N\3\2\2\2\u0231"+
|
||||||
"\u0230N\3\2\2\2\u0231\u0232\7u\2\2\u0232\u0233\7v\2\2\u0233\u0234\7c\2"+
|
"\u0232\7u\2\2\u0232\u0233\7v\2\2\u0233\u0234\7t\2\2\u0234\u0235\7k\2\2"+
|
||||||
"\2\u0234\u0235\7v\2\2\u0235\u0236\7k\2\2\u0236\u0237\7e\2\2\u0237P\3\2"+
|
"\u0235\u0236\7e\2\2\u0236\u0237\7v\2\2\u0237\u0238\7h\2\2\u0238\u0239"+
|
||||||
"\2\2\u0238\u0239\7u\2\2\u0239\u023a\7v\2\2\u023a\u023b\7t\2\2\u023b\u023c"+
|
"\7r\2\2\u0239P\3\2\2\2\u023a\u023b\7u\2\2\u023b\u023c\7w\2\2\u023c\u023d"+
|
||||||
"\7k\2\2\u023c\u023d\7e\2\2\u023d\u023e\7v\2\2\u023e\u023f\7h\2\2\u023f"+
|
"\7r\2\2\u023d\u023e\7g\2\2\u023e\u023f\7t\2\2\u023fR\3\2\2\2\u0240\u0241"+
|
||||||
"\u0240\7r\2\2\u0240R\3\2\2\2\u0241\u0242\7u\2\2\u0242\u0243\7w\2\2\u0243"+
|
"\7u\2\2\u0241\u0242\7y\2\2\u0242\u0243\7k\2\2\u0243\u0244\7v\2\2\u0244"+
|
||||||
"\u0244\7r\2\2\u0244\u0245\7g\2\2\u0245\u0246\7t\2\2\u0246T\3\2\2\2\u0247"+
|
"\u0245\7e\2\2\u0245\u0246\7j\2\2\u0246T\3\2\2\2\u0247\u0248\7u\2\2\u0248"+
|
||||||
"\u0248\7u\2\2\u0248\u0249\7y\2\2\u0249\u024a\7k\2\2\u024a\u024b\7v\2\2"+
|
"\u0249\7{\2\2\u0249\u024a\7p\2\2\u024a\u024b\7e\2\2\u024b\u024c\7j\2\2"+
|
||||||
"\u024b\u024c\7e\2\2\u024c\u024d\7j\2\2\u024dV\3\2\2\2\u024e\u024f\7u\2"+
|
"\u024c\u024d\7t\2\2\u024d\u024e\7q\2\2\u024e\u024f\7p\2\2\u024f\u0250"+
|
||||||
"\2\u024f\u0250\7{\2\2\u0250\u0251\7p\2\2\u0251\u0252\7e\2\2\u0252\u0253"+
|
"\7k\2\2\u0250\u0251\7|\2\2\u0251\u0252\7g\2\2\u0252\u0253\7f\2\2\u0253"+
|
||||||
"\7j\2\2\u0253\u0254\7t\2\2\u0254\u0255\7q\2\2\u0255\u0256\7p\2\2\u0256"+
|
"V\3\2\2\2\u0254\u0255\7v\2\2\u0255\u0256\7j\2\2\u0256\u0257\7k\2\2\u0257"+
|
||||||
"\u0257\7k\2\2\u0257\u0258\7|\2\2\u0258\u0259\7g\2\2\u0259\u025a\7f\2\2"+
|
"\u0258\7u\2\2\u0258X\3\2\2\2\u0259\u025a\7v\2\2\u025a\u025b\7j\2\2\u025b"+
|
||||||
"\u025aX\3\2\2\2\u025b\u025c\7v\2\2\u025c\u025d\7j\2\2\u025d\u025e\7k\2"+
|
"\u025c\7t\2\2\u025c\u025d\7q\2\2\u025d\u025e\7y\2\2\u025eZ\3\2\2\2\u025f"+
|
||||||
"\2\u025e\u025f\7u\2\2\u025fZ\3\2\2\2\u0260\u0261\7v\2\2\u0261\u0262\7"+
|
"\u0260\7v\2\2\u0260\u0261\7j\2\2\u0261\u0262\7t\2\2\u0262\u0263\7q\2\2"+
|
||||||
"j\2\2\u0262\u0263\7t\2\2\u0263\u0264\7q\2\2\u0264\u0265\7y\2\2\u0265\\"+
|
"\u0263\u0264\7y\2\2\u0264\u0265\7u\2\2\u0265\\\3\2\2\2\u0266\u0267\7v"+
|
||||||
"\3\2\2\2\u0266\u0267\7v\2\2\u0267\u0268\7j\2\2\u0268\u0269\7t\2\2\u0269"+
|
"\2\2\u0267\u0268\7t\2\2\u0268\u0269\7c\2\2\u0269\u026a\7p\2\2\u026a\u026b"+
|
||||||
"\u026a\7q\2\2\u026a\u026b\7y\2\2\u026b\u026c\7u\2\2\u026c^\3\2\2\2\u026d"+
|
"\7u\2\2\u026b\u026c\7k\2\2\u026c\u026d\7g\2\2\u026d\u026e\7p\2\2\u026e"+
|
||||||
"\u026e\7v\2\2\u026e\u026f\7t\2\2\u026f\u0270\7c\2\2\u0270\u0271\7p\2\2"+
|
"\u026f\7v\2\2\u026f^\3\2\2\2\u0270\u0271\7v\2\2\u0271\u0272\7t\2\2\u0272"+
|
||||||
"\u0271\u0272\7u\2\2\u0272\u0273\7k\2\2\u0273\u0274\7g\2\2\u0274\u0275"+
|
"\u0273\7{\2\2\u0273`\3\2\2\2\u0274\u0275\7x\2\2\u0275\u0276\7q\2\2\u0276"+
|
||||||
"\7p\2\2\u0275\u0276\7v\2\2\u0276`\3\2\2\2\u0277\u0278\7v\2\2\u0278\u0279"+
|
"\u0277\7k\2\2\u0277\u0278\7f\2\2\u0278b\3\2\2\2\u0279\u027a\7x\2\2\u027a"+
|
||||||
"\7t\2\2\u0279\u027a\7{\2\2\u027ab\3\2\2\2\u027b\u027c\7x\2\2\u027c\u027d"+
|
"\u027b\7q\2\2\u027b\u027c\7n\2\2\u027c\u027d\7c\2\2\u027d\u027e\7v\2\2"+
|
||||||
"\7q\2\2\u027d\u027e\7k\2\2\u027e\u027f\7f\2\2\u027fd\3\2\2\2\u0280\u0281"+
|
"\u027e\u027f\7k\2\2\u027f\u0280\7n\2\2\u0280\u0281\7g\2\2\u0281d\3\2\2"+
|
||||||
"\7x\2\2\u0281\u0282\7q\2\2\u0282\u0283\7n\2\2\u0283\u0284\7c\2\2\u0284"+
|
"\2\u0282\u0283\7y\2\2\u0283\u0284\7j\2\2\u0284\u0285\7k\2\2\u0285\u0286"+
|
||||||
"\u0285\7v\2\2\u0285\u0286\7k\2\2\u0286\u0287\7n\2\2\u0287\u0288\7g\2\2"+
|
"\7n\2\2\u0286\u0287\7g\2\2\u0287f\3\2\2\2\u0288\u028d\5i\65\2\u0289\u028d"+
|
||||||
"\u0288f\3\2\2\2\u0289\u028a\7y\2\2\u028a\u028b\7j\2\2\u028b\u028c\7k\2"+
|
"\5k\66\2\u028a\u028d\5m\67\2\u028b\u028d\5o8\2\u028c\u0288\3\2\2\2\u028c"+
|
||||||
"\2\u028c\u028d\7n\2\2\u028d\u028e\7g\2\2\u028eh\3\2\2\2\u028f\u0294\5"+
|
"\u0289\3\2\2\2\u028c\u028a\3\2\2\2\u028c\u028b\3\2\2\2\u028dh\3\2\2\2"+
|
||||||
"k\66\2\u0290\u0294\5m\67\2\u0291\u0294\5o8\2\u0292\u0294\5q9\2\u0293\u028f"+
|
"\u028e\u0290\5s:\2\u028f\u0291\5q9\2\u0290\u028f\3\2\2\2\u0290\u0291\3"+
|
||||||
"\3\2\2\2\u0293\u0290\3\2\2\2\u0293\u0291\3\2\2\2\u0293\u0292\3\2\2\2\u0294"+
|
"\2\2\2\u0291j\3\2\2\2\u0292\u0294\5\u0081A\2\u0293\u0295\5q9\2\u0294\u0293"+
|
||||||
"j\3\2\2\2\u0295\u0297\5u;\2\u0296\u0298\5s:\2\u0297\u0296\3\2\2\2\u0297"+
|
"\3\2\2\2\u0294\u0295\3\2\2\2\u0295l\3\2\2\2\u0296\u0298\5\u008bF\2\u0297"+
|
||||||
"\u0298\3\2\2\2\u0298l\3\2\2\2\u0299\u029b\5\u0083B\2\u029a\u029c\5s:\2"+
|
"\u0299\5q9\2\u0298\u0297\3\2\2\2\u0298\u0299\3\2\2\2\u0299n\3\2\2\2\u029a"+
|
||||||
"\u029b\u029a\3\2\2\2\u029b\u029c\3\2\2\2\u029cn\3\2\2\2\u029d\u029f\5"+
|
"\u029c\5\u0095K\2\u029b\u029d\5q9\2\u029c\u029b\3\2\2\2\u029c\u029d\3"+
|
||||||
"\u008dG\2\u029e\u02a0\5s:\2\u029f\u029e\3\2\2\2\u029f\u02a0\3\2\2\2\u02a0"+
|
"\2\2\2\u029dp\3\2\2\2\u029e\u029f\t\2\2\2\u029fr\3\2\2\2\u02a0\u02ab\7"+
|
||||||
"p\3\2\2\2\u02a1\u02a3\5\u0097L\2\u02a2\u02a4\5s:\2\u02a3\u02a2\3\2\2\2"+
|
"\62\2\2\u02a1\u02a8\5y=\2\u02a2\u02a4\5u;\2\u02a3\u02a2\3\2\2\2\u02a3"+
|
||||||
"\u02a3\u02a4\3\2\2\2\u02a4r\3\2\2\2\u02a5\u02a6\t\2\2\2\u02a6t\3\2\2\2"+
|
"\u02a4\3\2\2\2\u02a4\u02a9\3\2\2\2\u02a5\u02a6\5\177@\2\u02a6\u02a7\5"+
|
||||||
"\u02a7\u02b2\7\62\2\2\u02a8\u02af\5{>\2\u02a9\u02ab\5w<\2\u02aa\u02a9"+
|
"u;\2\u02a7\u02a9\3\2\2\2\u02a8\u02a3\3\2\2\2\u02a8\u02a5\3\2\2\2\u02a9"+
|
||||||
"\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02b0\3\2\2\2\u02ac\u02ad\5\u0081A"+
|
"\u02ab\3\2\2\2\u02aa\u02a0\3\2\2\2\u02aa\u02a1\3\2\2\2\u02abt\3\2\2\2"+
|
||||||
"\2\u02ad\u02ae\5w<\2\u02ae\u02b0\3\2\2\2\u02af\u02aa\3\2\2\2\u02af\u02ac"+
|
"\u02ac\u02b1\5w<\2\u02ad\u02af\5{>\2\u02ae\u02ad\3\2\2\2\u02ae\u02af\3"+
|
||||||
"\3\2\2\2\u02b0\u02b2\3\2\2\2\u02b1\u02a7\3\2\2\2\u02b1\u02a8\3\2\2\2\u02b2"+
|
"\2\2\2\u02af\u02b0\3\2\2\2\u02b0\u02b2\5w<\2\u02b1\u02ae\3\2\2\2\u02b1"+
|
||||||
"v\3\2\2\2\u02b3\u02b8\5y=\2\u02b4\u02b6\5}?\2\u02b5\u02b4\3\2\2\2\u02b5"+
|
"\u02b2\3\2\2\2\u02b2v\3\2\2\2\u02b3\u02b6\7\62\2\2\u02b4\u02b6\5y=\2\u02b5"+
|
||||||
"\u02b6\3\2\2\2\u02b6\u02b7\3\2\2\2\u02b7\u02b9\5y=\2\u02b8\u02b5\3\2\2"+
|
"\u02b3\3\2\2\2\u02b5\u02b4\3\2\2\2\u02b6x\3\2\2\2\u02b7\u02b8\t\3\2\2"+
|
||||||
"\2\u02b8\u02b9\3\2\2\2\u02b9x\3\2\2\2\u02ba\u02bd\7\62\2\2\u02bb\u02bd"+
|
"\u02b8z\3\2\2\2\u02b9\u02bb\5}?\2\u02ba\u02b9\3\2\2\2\u02bb\u02bc\3\2"+
|
||||||
"\5{>\2\u02bc\u02ba\3\2\2\2\u02bc\u02bb\3\2\2\2\u02bdz\3\2\2\2\u02be\u02bf"+
|
"\2\2\u02bc\u02ba\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd|\3\2\2\2\u02be\u02c1"+
|
||||||
"\t\3\2\2\u02bf|\3\2\2\2\u02c0\u02c2\5\177@\2\u02c1\u02c0\3\2\2\2\u02c2"+
|
"\5w<\2\u02bf\u02c1\7a\2\2\u02c0\u02be\3\2\2\2\u02c0\u02bf\3\2\2\2\u02c1"+
|
||||||
"\u02c3\3\2\2\2\u02c3\u02c1\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4~\3\2\2\2"+
|
"~\3\2\2\2\u02c2\u02c4\7a\2\2\u02c3\u02c2\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5"+
|
||||||
"\u02c5\u02c8\5y=\2\u02c6\u02c8\7a\2\2\u02c7\u02c5\3\2\2\2\u02c7\u02c6"+
|
"\u02c3\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6\u0080\3\2\2\2\u02c7\u02c8\7\62"+
|
||||||
"\3\2\2\2\u02c8\u0080\3\2\2\2\u02c9\u02cb\7a\2\2\u02ca\u02c9\3\2\2\2\u02cb"+
|
"\2\2\u02c8\u02c9\t\4\2\2\u02c9\u02ca\5\u0083B\2\u02ca\u0082\3\2\2\2\u02cb"+
|
||||||
"\u02cc\3\2\2\2\u02cc\u02ca\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd\u0082\3\2"+
|
"\u02d0\5\u0085C\2\u02cc\u02ce\5\u0087D\2\u02cd\u02cc\3\2\2\2\u02cd\u02ce"+
|
||||||
"\2\2\u02ce\u02cf\7\62\2\2\u02cf\u02d0\t\4\2\2\u02d0\u02d1\5\u0085C\2\u02d1"+
|
"\3\2\2\2\u02ce\u02cf\3\2\2\2\u02cf\u02d1\5\u0085C\2\u02d0\u02cd\3\2\2"+
|
||||||
"\u0084\3\2\2\2\u02d2\u02d7\5\u0087D\2\u02d3\u02d5\5\u0089E\2\u02d4\u02d3"+
|
"\2\u02d0\u02d1\3\2\2\2\u02d1\u0084\3\2\2\2\u02d2\u02d3\t\5\2\2\u02d3\u0086"+
|
||||||
"\3\2\2\2\u02d4\u02d5\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6\u02d8\5\u0087D"+
|
"\3\2\2\2\u02d4\u02d6\5\u0089E\2\u02d5\u02d4\3\2\2\2\u02d6\u02d7\3\2\2"+
|
||||||
"\2\u02d7\u02d4\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8\u0086\3\2\2\2\u02d9\u02da"+
|
"\2\u02d7\u02d5\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8\u0088\3\2\2\2\u02d9\u02dc"+
|
||||||
"\t\5\2\2\u02da\u0088\3\2\2\2\u02db\u02dd\5\u008bF\2\u02dc\u02db\3\2\2"+
|
"\5\u0085C\2\u02da\u02dc\7a\2\2\u02db\u02d9\3\2\2\2\u02db\u02da\3\2\2\2"+
|
||||||
"\2\u02dd\u02de\3\2\2\2\u02de\u02dc\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u008a"+
|
"\u02dc\u008a\3\2\2\2\u02dd\u02df\7\62\2\2\u02de\u02e0\5\177@\2\u02df\u02de"+
|
||||||
"\3\2\2\2\u02e0\u02e3\5\u0087D\2\u02e1\u02e3\7a\2\2\u02e2\u02e0\3\2\2\2"+
|
"\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e1\3\2\2\2\u02e1\u02e2\5\u008dG"+
|
||||||
"\u02e2\u02e1\3\2\2\2\u02e3\u008c\3\2\2\2\u02e4\u02e6\7\62\2\2\u02e5\u02e7"+
|
"\2\u02e2\u008c\3\2\2\2\u02e3\u02e8\5\u008fH\2\u02e4\u02e6\5\u0091I\2\u02e5"+
|
||||||
"\5\u0081A\2\u02e6\u02e5\3\2\2\2\u02e6\u02e7\3\2\2\2\u02e7\u02e8\3\2\2"+
|
"\u02e4\3\2\2\2\u02e5\u02e6\3\2\2\2\u02e6\u02e7\3\2\2\2\u02e7\u02e9\5\u008f"+
|
||||||
"\2\u02e8\u02e9\5\u008fH\2\u02e9\u008e\3\2\2\2\u02ea\u02ef\5\u0091I\2\u02eb"+
|
"H\2\u02e8\u02e5\3\2\2\2\u02e8\u02e9\3\2\2\2\u02e9\u008e\3\2\2\2\u02ea"+
|
||||||
"\u02ed\5\u0093J\2\u02ec\u02eb\3\2\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02ee"+
|
"\u02eb\t\6\2\2\u02eb\u0090\3\2\2\2\u02ec\u02ee\5\u0093J\2\u02ed\u02ec"+
|
||||||
"\3\2\2\2\u02ee\u02f0\5\u0091I\2\u02ef\u02ec\3\2\2\2\u02ef\u02f0\3\2\2"+
|
"\3\2\2\2\u02ee\u02ef\3\2\2\2\u02ef\u02ed\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0"+
|
||||||
"\2\u02f0\u0090\3\2\2\2\u02f1\u02f2\t\6\2\2\u02f2\u0092\3\2\2\2\u02f3\u02f5"+
|
"\u0092\3\2\2\2\u02f1\u02f4\5\u008fH\2\u02f2\u02f4\7a\2\2\u02f3\u02f1\3"+
|
||||||
"\5\u0095K\2\u02f4\u02f3\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6\u02f4\3\2\2"+
|
"\2\2\2\u02f3\u02f2\3\2\2\2\u02f4\u0094\3\2\2\2\u02f5\u02f6\7\62\2\2\u02f6"+
|
||||||
"\2\u02f6\u02f7\3\2\2\2\u02f7\u0094\3\2\2\2\u02f8\u02fb\5\u0091I\2\u02f9"+
|
"\u02f7\t\7\2\2\u02f7\u02f8\5\u0097L\2\u02f8\u0096\3\2\2\2\u02f9\u02fe"+
|
||||||
"\u02fb\7a\2\2\u02fa\u02f8\3\2\2\2\u02fa\u02f9\3\2\2\2\u02fb\u0096\3\2"+
|
"\5\u0099M\2\u02fa\u02fc\5\u009bN\2\u02fb\u02fa\3\2\2\2\u02fb\u02fc\3\2"+
|
||||||
"\2\2\u02fc\u02fd\7\62\2\2\u02fd\u02fe\t\7\2\2\u02fe\u02ff\5\u0099M\2\u02ff"+
|
"\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02ff\5\u0099M\2\u02fe\u02fb\3\2\2\2\u02fe"+
|
||||||
"\u0098\3\2\2\2\u0300\u0305\5\u009bN\2\u0301\u0303\5\u009dO\2\u0302\u0301"+
|
"\u02ff\3\2\2\2\u02ff\u0098\3\2\2\2\u0300\u0301\t\b\2\2\u0301\u009a\3\2"+
|
||||||
"\3\2\2\2\u0302\u0303\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0306\5\u009bN"+
|
"\2\2\u0302\u0304\5\u009dO\2\u0303\u0302\3\2\2\2\u0304\u0305\3\2\2\2\u0305"+
|
||||||
"\2\u0305\u0302\3\2\2\2\u0305\u0306\3\2\2\2\u0306\u009a\3\2\2\2\u0307\u0308"+
|
"\u0303\3\2\2\2\u0305\u0306\3\2\2\2\u0306\u009c\3\2\2\2\u0307\u030a\5\u0099"+
|
||||||
"\t\b\2\2\u0308\u009c\3\2\2\2\u0309\u030b\5\u009fP\2\u030a\u0309\3\2\2"+
|
"M\2\u0308\u030a\7a\2\2\u0309\u0307\3\2\2\2\u0309\u0308\3\2\2\2\u030a\u009e"+
|
||||||
"\2\u030b\u030c\3\2\2\2\u030c\u030a\3\2\2\2\u030c\u030d\3\2\2\2\u030d\u009e"+
|
"\3\2\2\2\u030b\u030e\5\u00a1Q\2\u030c\u030e\5\u00adW\2\u030d\u030b\3\2"+
|
||||||
"\3\2\2\2\u030e\u0311\5\u009bN\2\u030f\u0311\7a\2\2\u0310\u030e\3\2\2\2"+
|
"\2\2\u030d\u030c\3\2\2\2\u030e\u00a0\3\2\2\2\u030f\u0310\5u;\2\u0310\u0312"+
|
||||||
"\u0310\u030f\3\2\2\2\u0311\u00a0\3\2\2\2\u0312\u0315\5\u00a3R\2\u0313"+
|
"\7\60\2\2\u0311\u0313\5u;\2\u0312\u0311\3\2\2\2\u0312\u0313\3\2\2\2\u0313"+
|
||||||
"\u0315\5\u00afX\2\u0314\u0312\3\2\2\2\u0314\u0313\3\2\2\2\u0315\u00a2"+
|
"\u0315\3\2\2\2\u0314\u0316\5\u00a3R\2\u0315\u0314\3\2\2\2\u0315\u0316"+
|
||||||
"\3\2\2\2\u0316\u0317\5w<\2\u0317\u0319\7\60\2\2\u0318\u031a\5w<\2\u0319"+
|
"\3\2\2\2\u0316\u0318\3\2\2\2\u0317\u0319\5\u00abV\2\u0318\u0317\3\2\2"+
|
||||||
"\u0318\3\2\2\2\u0319\u031a\3\2\2\2\u031a\u031c\3\2\2\2\u031b\u031d\5\u00a5"+
|
"\2\u0318\u0319\3\2\2\2\u0319\u032b\3\2\2\2\u031a\u031b\7\60\2\2\u031b"+
|
||||||
"S\2\u031c\u031b\3\2\2\2\u031c\u031d\3\2\2\2\u031d\u031f\3\2\2\2\u031e"+
|
"\u031d\5u;\2\u031c\u031e\5\u00a3R\2\u031d\u031c\3\2\2\2\u031d\u031e\3"+
|
||||||
"\u0320\5\u00adW\2\u031f\u031e\3\2\2\2\u031f\u0320\3\2\2\2\u0320\u0332"+
|
"\2\2\2\u031e\u0320\3\2\2\2\u031f\u0321\5\u00abV\2\u0320\u031f\3\2\2\2"+
|
||||||
"\3\2\2\2\u0321\u0322\7\60\2\2\u0322\u0324\5w<\2\u0323\u0325\5\u00a5S\2"+
|
"\u0320\u0321\3\2\2\2\u0321\u032b\3\2\2\2\u0322\u0323\5u;\2\u0323\u0325"+
|
||||||
"\u0324\u0323\3\2\2\2\u0324\u0325\3\2\2\2\u0325\u0327\3\2\2\2\u0326\u0328"+
|
"\5\u00a3R\2\u0324\u0326\5\u00abV\2\u0325\u0324\3\2\2\2\u0325\u0326\3\2"+
|
||||||
"\5\u00adW\2\u0327\u0326\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u0332\3\2\2"+
|
"\2\2\u0326\u032b\3\2\2\2\u0327\u0328\5u;\2\u0328\u0329\5\u00abV\2\u0329"+
|
||||||
"\2\u0329\u032a\5w<\2\u032a\u032c\5\u00a5S\2\u032b\u032d\5\u00adW\2\u032c"+
|
"\u032b\3\2\2\2\u032a\u030f\3\2\2\2\u032a\u031a\3\2\2\2\u032a\u0322\3\2"+
|
||||||
"\u032b\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u0332\3\2\2\2\u032e\u032f\5w"+
|
"\2\2\u032a\u0327\3\2\2\2\u032b\u00a2\3\2\2\2\u032c\u032d\5\u00a5S\2\u032d"+
|
||||||
"<\2\u032f\u0330\5\u00adW\2\u0330\u0332\3\2\2\2\u0331\u0316\3\2\2\2\u0331"+
|
"\u032e\5\u00a7T\2\u032e\u00a4\3\2\2\2\u032f\u0330\t\t\2\2\u0330\u00a6"+
|
||||||
"\u0321\3\2\2\2\u0331\u0329\3\2\2\2\u0331\u032e\3\2\2\2\u0332\u00a4\3\2"+
|
"\3\2\2\2\u0331\u0333\5\u00a9U\2\u0332\u0331\3\2\2\2\u0332\u0333\3\2\2"+
|
||||||
"\2\2\u0333\u0334\5\u00a7T\2\u0334\u0335\5\u00a9U\2\u0335\u00a6\3\2\2\2"+
|
"\2\u0333\u0334\3\2\2\2\u0334\u0335\5u;\2\u0335\u00a8\3\2\2\2\u0336\u0337"+
|
||||||
"\u0336\u0337\t\t\2\2\u0337\u00a8\3\2\2\2\u0338\u033a\5\u00abV\2\u0339"+
|
"\t\n\2\2\u0337\u00aa\3\2\2\2\u0338\u0339\t\13\2\2\u0339\u00ac\3\2\2\2"+
|
||||||
"\u0338\3\2\2\2\u0339\u033a\3\2\2\2\u033a\u033b\3\2\2\2\u033b\u033c\5w"+
|
"\u033a\u033b\5\u00afX\2\u033b\u033d\5\u00b1Y\2\u033c\u033e\5\u00abV\2"+
|
||||||
"<\2\u033c\u00aa\3\2\2\2\u033d\u033e\t\n\2\2\u033e\u00ac\3\2\2\2\u033f"+
|
"\u033d\u033c\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u00ae\3\2\2\2\u033f\u0341"+
|
||||||
"\u0340\t\13\2\2\u0340\u00ae\3\2\2\2\u0341\u0342\5\u00b1Y\2\u0342\u0344"+
|
"\5\u0081A\2\u0340\u0342\7\60\2\2\u0341\u0340\3\2\2\2\u0341\u0342\3\2\2"+
|
||||||
"\5\u00b3Z\2\u0343\u0345\5\u00adW\2\u0344\u0343\3\2\2\2\u0344\u0345\3\2"+
|
"\2\u0342\u034b\3\2\2\2\u0343\u0344\7\62\2\2\u0344\u0346\t\4\2\2\u0345"+
|
||||||
"\2\2\u0345\u00b0\3\2\2\2\u0346\u0348\5\u0083B\2\u0347\u0349\7\60\2\2\u0348"+
|
"\u0347\5\u0083B\2\u0346\u0345\3\2\2\2\u0346\u0347\3\2\2\2\u0347\u0348"+
|
||||||
"\u0347\3\2\2\2\u0348\u0349\3\2\2\2\u0349\u0352\3\2\2\2\u034a\u034b\7\62"+
|
"\3\2\2\2\u0348\u0349\7\60\2\2\u0349\u034b\5\u0083B\2\u034a\u033f\3\2\2"+
|
||||||
"\2\2\u034b\u034d\t\4\2\2\u034c\u034e\5\u0085C\2\u034d\u034c\3\2\2\2\u034d"+
|
"\2\u034a\u0343\3\2\2\2\u034b\u00b0\3\2\2\2\u034c\u034d\5\u00b3Z\2\u034d"+
|
||||||
"\u034e\3\2\2\2\u034e\u034f\3\2\2\2\u034f\u0350\7\60\2\2\u0350\u0352\5"+
|
"\u034e\5\u00a7T\2\u034e\u00b2\3\2\2\2\u034f\u0350\t\f\2\2\u0350\u00b4"+
|
||||||
"\u0085C\2\u0351\u0346\3\2\2\2\u0351\u034a\3\2\2\2\u0352\u00b2\3\2\2\2"+
|
"\3\2\2\2\u0351\u0352\7v\2\2\u0352\u0353\7t\2\2\u0353\u0354\7w\2\2\u0354"+
|
||||||
"\u0353\u0354\5\u00b5[\2\u0354\u0355\5\u00a9U\2\u0355\u00b4\3\2\2\2\u0356"+
|
"\u035b\7g\2\2\u0355\u0356\7h\2\2\u0356\u0357\7c\2\2\u0357\u0358\7n\2\2"+
|
||||||
"\u0357\t\f\2\2\u0357\u00b6\3\2\2\2\u0358\u0359\7v\2\2\u0359\u035a\7t\2"+
|
"\u0358\u0359\7u\2\2\u0359\u035b\7g\2\2\u035a\u0351\3\2\2\2\u035a\u0355"+
|
||||||
"\2\u035a\u035b\7w\2\2\u035b\u0362\7g\2\2\u035c\u035d\7h\2\2\u035d\u035e"+
|
"\3\2\2\2\u035b\u00b6\3\2\2\2\u035c\u035d\7)\2\2\u035d\u035e\5\u00b9]\2"+
|
||||||
"\7c\2\2\u035e\u035f\7n\2\2\u035f\u0360\7u\2\2\u0360\u0362\7g\2\2\u0361"+
|
"\u035e\u035f\7)\2\2\u035f\u0365\3\2\2\2\u0360\u0361\7)\2\2\u0361\u0362"+
|
||||||
"\u0358\3\2\2\2\u0361\u035c\3\2\2\2\u0362\u00b8\3\2\2\2\u0363\u0364\7)"+
|
"\5\u00c1a\2\u0362\u0363\7)\2\2\u0363\u0365\3\2\2\2\u0364\u035c\3\2\2\2"+
|
||||||
"\2\2\u0364\u0365\5\u00bb^\2\u0365\u0366\7)\2\2\u0366\u036c\3\2\2\2\u0367"+
|
"\u0364\u0360\3\2\2\2\u0365\u00b8\3\2\2\2\u0366\u0367\n\r\2\2\u0367\u00ba"+
|
||||||
"\u0368\7)\2\2\u0368\u0369\5\u00c3b\2\u0369\u036a\7)\2\2\u036a\u036c\3"+
|
"\3\2\2\2\u0368\u036a\7$\2\2\u0369\u036b\5\u00bd_\2\u036a\u0369\3\2\2\2"+
|
||||||
"\2\2\2\u036b\u0363\3\2\2\2\u036b\u0367\3\2\2\2\u036c\u00ba\3\2\2\2\u036d"+
|
"\u036a\u036b\3\2\2\2\u036b\u036c\3\2\2\2\u036c\u036d\7$\2\2\u036d\u00bc"+
|
||||||
"\u036e\n\r\2\2\u036e\u00bc\3\2\2\2\u036f\u0371\7$\2\2\u0370\u0372\5\u00bf"+
|
"\3\2\2\2\u036e\u0370\5\u00bf`\2\u036f\u036e\3\2\2\2\u0370\u0371\3\2\2"+
|
||||||
"`\2\u0371\u0370\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3\2\2\2\u0373"+
|
"\2\u0371\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u00be\3\2\2\2\u0373\u0376"+
|
||||||
"\u0374\7$\2\2\u0374\u00be\3\2\2\2\u0375\u0377\5\u00c1a\2\u0376\u0375\3"+
|
"\n\16\2\2\u0374\u0376\5\u00c1a\2\u0375\u0373\3\2\2\2\u0375\u0374\3\2\2"+
|
||||||
"\2\2\2\u0377\u0378\3\2\2\2\u0378\u0376\3\2\2\2\u0378\u0379\3\2\2\2\u0379"+
|
"\2\u0376\u00c0\3\2\2\2\u0377\u0378\7^\2\2\u0378\u037c\t\17\2\2\u0379\u037c"+
|
||||||
"\u00c0\3\2\2\2\u037a\u037d\n\16\2\2\u037b\u037d\5\u00c3b\2\u037c\u037a"+
|
"\5\u00c3b\2\u037a\u037c\5\u00c7d\2\u037b\u0377\3\2\2\2\u037b\u0379\3\2"+
|
||||||
"\3\2\2\2\u037c\u037b\3\2\2\2\u037d\u00c2\3\2\2\2\u037e\u037f\7^\2\2\u037f"+
|
"\2\2\u037b\u037a\3\2\2\2\u037c\u00c2\3\2\2\2\u037d\u037e\7^\2\2\u037e"+
|
||||||
"\u0383\t\17\2\2\u0380\u0383\5\u00c5c\2\u0381\u0383\5\u00c9e\2\u0382\u037e"+
|
"\u0389\5\u008fH\2\u037f\u0380\7^\2\2\u0380\u0381\5\u008fH\2\u0381\u0382"+
|
||||||
"\3\2\2\2\u0382\u0380\3\2\2\2\u0382\u0381\3\2\2\2\u0383\u00c4\3\2\2\2\u0384"+
|
"\5\u008fH\2\u0382\u0389\3\2\2\2\u0383\u0384\7^\2\2\u0384\u0385\5\u00c5"+
|
||||||
"\u0385\7^\2\2\u0385\u0390\5\u0091I\2\u0386\u0387\7^\2\2\u0387\u0388\5"+
|
"c\2\u0385\u0386\5\u008fH\2\u0386\u0387\5\u008fH\2\u0387\u0389\3\2\2\2"+
|
||||||
"\u0091I\2\u0388\u0389\5\u0091I\2\u0389\u0390\3\2\2\2\u038a\u038b\7^\2"+
|
"\u0388\u037d\3\2\2\2\u0388\u037f\3\2\2\2\u0388\u0383\3\2\2\2\u0389\u00c4"+
|
||||||
"\2\u038b\u038c\5\u00c7d\2\u038c\u038d\5\u0091I\2\u038d\u038e\5\u0091I"+
|
"\3\2\2\2\u038a\u038b\t\20\2\2\u038b\u00c6\3\2\2\2\u038c\u038d\7^\2\2\u038d"+
|
||||||
"\2\u038e\u0390\3\2\2\2\u038f\u0384\3\2\2\2\u038f\u0386\3\2\2\2\u038f\u038a"+
|
"\u038e\7w\2\2\u038e\u038f\5\u0085C\2\u038f\u0390\5\u0085C\2\u0390\u0391"+
|
||||||
"\3\2\2\2\u0390\u00c6\3\2\2\2\u0391\u0392\t\20\2\2\u0392\u00c8\3\2\2\2"+
|
"\5\u0085C\2\u0391\u0392\5\u0085C\2\u0392\u00c8\3\2\2\2\u0393\u0394\7p"+
|
||||||
"\u0393\u0394\7^\2\2\u0394\u0395\7w\2\2\u0395\u0396\5\u0087D\2\u0396\u0397"+
|
"\2\2\u0394\u0395\7w\2\2\u0395\u0396\7n\2\2\u0396\u0397\7n\2\2\u0397\u00ca"+
|
||||||
"\5\u0087D\2\u0397\u0398\5\u0087D\2\u0398\u0399\5\u0087D\2\u0399\u00ca"+
|
"\3\2\2\2\u0398\u0399\7*\2\2\u0399\u00cc\3\2\2\2\u039a\u039b\7+\2\2\u039b"+
|
||||||
"\3\2\2\2\u039a\u039b\7p\2\2\u039b\u039c\7w\2\2\u039c\u039d\7n\2\2\u039d"+
|
"\u00ce\3\2\2\2\u039c\u039d\7}\2\2\u039d\u00d0\3\2\2\2\u039e\u039f\7\177"+
|
||||||
"\u039e\7n\2\2\u039e\u00cc\3\2\2\2\u039f\u03a0\7*\2\2\u03a0\u00ce\3\2\2"+
|
"\2\2\u039f\u00d2\3\2\2\2\u03a0\u03a1\7]\2\2\u03a1\u00d4\3\2\2\2\u03a2"+
|
||||||
"\2\u03a1\u03a2\7+\2\2\u03a2\u00d0\3\2\2\2\u03a3\u03a4\7}\2\2\u03a4\u00d2"+
|
"\u03a3\7_\2\2\u03a3\u00d6\3\2\2\2\u03a4\u03a5\7=\2\2\u03a5\u00d8\3\2\2"+
|
||||||
"\3\2\2\2\u03a5\u03a6\7\177\2\2\u03a6\u00d4\3\2\2\2\u03a7\u03a8\7]\2\2"+
|
"\2\u03a6\u03a7\7.\2\2\u03a7\u00da\3\2\2\2\u03a8\u03a9\7\60\2\2\u03a9\u00dc"+
|
||||||
"\u03a8\u00d6\3\2\2\2\u03a9\u03aa\7_\2\2\u03aa\u00d8\3\2\2\2\u03ab\u03ac"+
|
"\3\2\2\2\u03aa\u03ab\7?\2\2\u03ab\u00de\3\2\2\2\u03ac\u03ad\7@\2\2\u03ad"+
|
||||||
"\7=\2\2\u03ac\u00da\3\2\2\2\u03ad\u03ae\7.\2\2\u03ae\u00dc\3\2\2\2\u03af"+
|
"\u00e0\3\2\2\2\u03ae\u03af\7>\2\2\u03af\u00e2\3\2\2\2\u03b0\u03b1\7#\2"+
|
||||||
"\u03b0\7\60\2\2\u03b0\u00de\3\2\2\2\u03b1\u03b2\7?\2\2\u03b2\u00e0\3\2"+
|
"\2\u03b1\u00e4\3\2\2\2\u03b2\u03b3\7\u0080\2\2\u03b3\u00e6\3\2\2\2\u03b4"+
|
||||||
"\2\2\u03b3\u03b4\7@\2\2\u03b4\u00e2\3\2\2\2\u03b5\u03b6\7>\2\2\u03b6\u00e4"+
|
"\u03b5\7A\2\2\u03b5\u00e8\3\2\2\2\u03b6\u03b7\7<\2\2\u03b7\u00ea\3\2\2"+
|
||||||
"\3\2\2\2\u03b7\u03b8\7#\2\2\u03b8\u00e6\3\2\2\2\u03b9\u03ba\7\u0080\2"+
|
"\2\u03b8\u03b9\7?\2\2\u03b9\u03ba\7?\2\2\u03ba\u00ec\3\2\2\2\u03bb\u03bc"+
|
||||||
"\2\u03ba\u00e8\3\2\2\2\u03bb\u03bc\7A\2\2\u03bc\u00ea\3\2\2\2\u03bd\u03be"+
|
"\7>\2\2\u03bc\u03bd\7?\2\2\u03bd\u00ee\3\2\2\2\u03be\u03bf\7@\2\2\u03bf"+
|
||||||
"\7<\2\2\u03be\u00ec\3\2\2\2\u03bf\u03c0\7?\2\2\u03c0\u03c1\7?\2\2\u03c1"+
|
"\u03c0\7?\2\2\u03c0\u00f0\3\2\2\2\u03c1\u03c2\7#\2\2\u03c2\u03c3\7?\2"+
|
||||||
"\u00ee\3\2\2\2\u03c2\u03c3\7>\2\2\u03c3\u03c4\7?\2\2\u03c4\u00f0\3\2\2"+
|
"\2\u03c3\u00f2\3\2\2\2\u03c4\u03c5\7(\2\2\u03c5\u03c6\7(\2\2\u03c6\u00f4"+
|
||||||
"\2\u03c5\u03c6\7@\2\2\u03c6\u03c7\7?\2\2\u03c7\u00f2\3\2\2\2\u03c8\u03c9"+
|
"\3\2\2\2\u03c7\u03c8\7~\2\2\u03c8\u03c9\7~\2\2\u03c9\u00f6\3\2\2\2\u03ca"+
|
||||||
"\7#\2\2\u03c9\u03ca\7?\2\2\u03ca\u00f4\3\2\2\2\u03cb\u03cc\7(\2\2\u03cc"+
|
"\u03cb\7-\2\2\u03cb\u03cc\7-\2\2\u03cc\u00f8\3\2\2\2\u03cd\u03ce\7/\2"+
|
||||||
"\u03cd\7(\2\2\u03cd\u00f6\3\2\2\2\u03ce\u03cf\7~\2\2\u03cf\u03d0\7~\2"+
|
"\2\u03ce\u03cf\7/\2\2\u03cf\u00fa\3\2\2\2\u03d0\u03d1\7-\2\2\u03d1\u00fc"+
|
||||||
"\2\u03d0\u00f8\3\2\2\2\u03d1\u03d2\7-\2\2\u03d2\u03d3\7-\2\2\u03d3\u00fa"+
|
"\3\2\2\2\u03d2\u03d3\7/\2\2\u03d3\u00fe\3\2\2\2\u03d4\u03d5\7,\2\2\u03d5"+
|
||||||
"\3\2\2\2\u03d4\u03d5\7/\2\2\u03d5\u03d6\7/\2\2\u03d6\u00fc\3\2\2\2\u03d7"+
|
"\u0100\3\2\2\2\u03d6\u03d7\7\61\2\2\u03d7\u0102\3\2\2\2\u03d8\u03d9\7"+
|
||||||
"\u03d8\7-\2\2\u03d8\u00fe\3\2\2\2\u03d9\u03da\7/\2\2\u03da\u0100\3\2\2"+
|
"(\2\2\u03d9\u0104\3\2\2\2\u03da\u03db\7~\2\2\u03db\u0106\3\2\2\2\u03dc"+
|
||||||
"\2\u03db\u03dc\7,\2\2\u03dc\u0102\3\2\2\2\u03dd\u03de\7\61\2\2\u03de\u0104"+
|
"\u03dd\7`\2\2\u03dd\u0108\3\2\2\2\u03de\u03df\7\'\2\2\u03df\u010a\3\2"+
|
||||||
"\3\2\2\2\u03df\u03e0\7(\2\2\u03e0\u0106\3\2\2\2\u03e1\u03e2\7~\2\2\u03e2"+
|
"\2\2\u03e0\u03e1\7/\2\2\u03e1\u03e2\7@\2\2\u03e2\u010c\3\2\2\2\u03e3\u03e4"+
|
||||||
"\u0108\3\2\2\2\u03e3\u03e4\7`\2\2\u03e4\u010a\3\2\2\2\u03e5\u03e6\7\'"+
|
"\7<\2\2\u03e4\u03e5\7<\2\2\u03e5\u010e\3\2\2\2\u03e6\u03e7\7-\2\2\u03e7"+
|
||||||
"\2\2\u03e6\u010c\3\2\2\2\u03e7\u03e8\7/\2\2\u03e8\u03e9\7@\2\2\u03e9\u010e"+
|
"\u03e8\7?\2\2\u03e8\u0110\3\2\2\2\u03e9\u03ea\7/\2\2\u03ea\u03eb\7?\2"+
|
||||||
"\3\2\2\2\u03ea\u03eb\7<\2\2\u03eb\u03ec\7<\2\2\u03ec\u0110\3\2\2\2\u03ed"+
|
"\2\u03eb\u0112\3\2\2\2\u03ec\u03ed\7,\2\2\u03ed\u03ee\7?\2\2\u03ee\u0114"+
|
||||||
"\u03ee\7-\2\2\u03ee\u03ef\7?\2\2\u03ef\u0112\3\2\2\2\u03f0\u03f1\7/\2"+
|
"\3\2\2\2\u03ef\u03f0\7\61\2\2\u03f0\u03f1\7?\2\2\u03f1\u0116\3\2\2\2\u03f2"+
|
||||||
"\2\u03f1\u03f2\7?\2\2\u03f2\u0114\3\2\2\2\u03f3\u03f4\7,\2\2\u03f4\u03f5"+
|
"\u03f3\7(\2\2\u03f3\u03f4\7?\2\2\u03f4\u0118\3\2\2\2\u03f5\u03f6\7~\2"+
|
||||||
"\7?\2\2\u03f5\u0116\3\2\2\2\u03f6\u03f7\7\61\2\2\u03f7\u03f8\7?\2\2\u03f8"+
|
"\2\u03f6\u03f7\7?\2\2\u03f7\u011a\3\2\2\2\u03f8\u03f9\7`\2\2\u03f9\u03fa"+
|
||||||
"\u0118\3\2\2\2\u03f9\u03fa\7(\2\2\u03fa\u03fb\7?\2\2\u03fb\u011a\3\2\2"+
|
"\7?\2\2\u03fa\u011c\3\2\2\2\u03fb\u03fc\7\'\2\2\u03fc\u03fd\7?\2\2\u03fd"+
|
||||||
"\2\u03fc\u03fd\7~\2\2\u03fd\u03fe\7?\2\2\u03fe\u011c\3\2\2\2\u03ff\u0400"+
|
"\u011e\3\2\2\2\u03fe\u03ff\7>\2\2\u03ff\u0400\7>\2\2\u0400\u0401\7?\2"+
|
||||||
"\7`\2\2\u0400\u0401\7?\2\2\u0401\u011e\3\2\2\2\u0402\u0403\7\'\2\2\u0403"+
|
"\2\u0401\u0120\3\2\2\2\u0402\u0403\7@\2\2\u0403\u0404\7@\2\2\u0404\u0405"+
|
||||||
"\u0404\7?\2\2\u0404\u0120\3\2\2\2\u0405\u0406\7>\2\2\u0406\u0407\7>\2"+
|
"\7?\2\2\u0405\u0122\3\2\2\2\u0406\u0407\7@\2\2\u0407\u0408\7@\2\2\u0408"+
|
||||||
"\2\u0407\u0408\7?\2\2\u0408\u0122\3\2\2\2\u0409\u040a\7@\2\2\u040a\u040b"+
|
"\u0409\7@\2\2\u0409\u040a\7?\2\2\u040a\u0124\3\2\2\2\u040b\u040f\5\u0127"+
|
||||||
"\7@\2\2\u040b\u040c\7?\2\2\u040c\u0124\3\2\2\2\u040d\u040e\7@\2\2\u040e"+
|
"\u0094\2\u040c\u040e\5\u0129\u0095\2\u040d\u040c\3\2\2\2\u040e\u0411\3"+
|
||||||
"\u040f\7@\2\2\u040f\u0410\7@\2\2\u0410\u0411\7?\2\2\u0411\u0126\3\2\2"+
|
"\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u0126\3\2\2\2\u0411"+
|
||||||
"\2\u0412\u0416\5\u0129\u0095\2\u0413\u0415\5\u012b\u0096\2\u0414\u0413"+
|
"\u040f\3\2\2\2\u0412\u0419\t\21\2\2\u0413\u0414\n\22\2\2\u0414\u0419\6"+
|
||||||
"\3\2\2\2\u0415\u0418\3\2\2\2\u0416\u0414\3\2\2\2\u0416\u0417\3\2\2\2\u0417"+
|
"\u0094\2\2\u0415\u0416\t\23\2\2\u0416\u0417\t\24\2\2\u0417\u0419\6\u0094"+
|
||||||
"\u0128\3\2\2\2\u0418\u0416\3\2\2\2\u0419\u0420\t\21\2\2\u041a\u041b\n"+
|
"\3\2\u0418\u0412\3\2\2\2\u0418\u0413\3\2\2\2\u0418\u0415\3\2\2\2\u0419"+
|
||||||
"\22\2\2\u041b\u0420\6\u0095\2\2\u041c\u041d\t\23\2\2\u041d\u041e\t\24"+
|
"\u0128\3\2\2\2\u041a\u0421\t\25\2\2\u041b\u041c\n\22\2\2\u041c\u0421\6"+
|
||||||
"\2\2\u041e\u0420\6\u0095\3\2\u041f\u0419\3\2\2\2\u041f\u041a\3\2\2\2\u041f"+
|
"\u0095\4\2\u041d\u041e\t\23\2\2\u041e\u041f\t\24\2\2\u041f\u0421\6\u0095"+
|
||||||
"\u041c\3\2\2\2\u0420\u012a\3\2\2\2\u0421\u0428\t\25\2\2\u0422\u0423\n"+
|
"\5\2\u0420\u041a\3\2\2\2\u0420\u041b\3\2\2\2\u0420\u041d\3\2\2\2\u0421"+
|
||||||
"\22\2\2\u0423\u0428\6\u0096\4\2\u0424\u0425\t\23\2\2\u0425\u0426\t\24"+
|
"\u012a\3\2\2\2\u0422\u0423\7B\2\2\u0423\u012c\3\2\2\2\u0424\u0425\7\60"+
|
||||||
"\2\2\u0426\u0428\6\u0096\5\2\u0427\u0421\3\2\2\2\u0427\u0422\3\2\2\2\u0427"+
|
"\2\2\u0425\u0426\7\60\2\2\u0426\u0427\7\60\2\2\u0427\u012e\3\2\2\2\u0428"+
|
||||||
"\u0424\3\2\2\2\u0428\u012c\3\2\2\2\u0429\u042a\7B\2\2\u042a\u012e\3\2"+
|
"\u042a\t\26\2\2\u0429\u0428\3\2\2\2\u042a\u042b\3\2\2\2\u042b\u0429\3"+
|
||||||
"\2\2\u042b\u042c\7\60\2\2\u042c\u042d\7\60\2\2\u042d\u042e\7\60\2\2\u042e"+
|
"\2\2\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2\2\2\u042d\u042e\b\u0098\2\2"+
|
||||||
"\u0130\3\2\2\2\u042f\u0431\t\26\2\2\u0430\u042f\3\2\2\2\u0431\u0432\3"+
|
"\u042e\u0130\3\2\2\2\u042f\u0430\7\61\2\2\u0430\u0431\7,\2\2\u0431\u0435"+
|
||||||
"\2\2\2\u0432\u0430\3\2\2\2\u0432\u0433\3\2\2\2\u0433\u0434\3\2\2\2\u0434"+
|
"\3\2\2\2\u0432\u0434\13\2\2\2\u0433\u0432\3\2\2\2\u0434\u0437\3\2\2\2"+
|
||||||
"\u0435\b\u0099\2\2\u0435\u0132\3\2\2\2\u0436\u0437\7\61\2\2\u0437\u0438"+
|
"\u0435\u0436\3\2\2\2\u0435\u0433\3\2\2\2\u0436\u0438\3\2\2\2\u0437\u0435"+
|
||||||
"\7,\2\2\u0438\u043c\3\2\2\2\u0439\u043b\13\2\2\2\u043a\u0439\3\2\2\2\u043b"+
|
"\3\2\2\2\u0438\u0439\7,\2\2\u0439\u043a\7\61\2\2\u043a\u043b\3\2\2\2\u043b"+
|
||||||
"\u043e\3\2\2\2\u043c\u043d\3\2\2\2\u043c\u043a\3\2\2\2\u043d\u043f\3\2"+
|
"\u043c\b\u0099\2\2\u043c\u0132\3\2\2\2\u043d\u043e\7\61\2\2\u043e\u043f"+
|
||||||
"\2\2\u043e\u043c\3\2\2\2\u043f\u0440\7,\2\2\u0440\u0441\7\61\2\2\u0441"+
|
"\7\61\2\2\u043f\u0443\3\2\2\2\u0440\u0442\n\27\2\2\u0441\u0440\3\2\2\2"+
|
||||||
"\u0442\3\2\2\2\u0442\u0443\b\u009a\2\2\u0443\u0134\3\2\2\2\u0444\u0445"+
|
"\u0442\u0445\3\2\2\2\u0443\u0441\3\2\2\2\u0443\u0444\3\2\2\2\u0444\u0446"+
|
||||||
"\7\61\2\2\u0445\u0446\7\61\2\2\u0446\u044a\3\2\2\2\u0447\u0449\n\27\2"+
|
"\3\2\2\2\u0445\u0443\3\2\2\2\u0446\u0447\b\u009a\2\2\u0447\u0134\3\2\2"+
|
||||||
"\2\u0448\u0447\3\2\2\2\u0449\u044c\3\2\2\2\u044a\u0448\3\2\2\2\u044a\u044b"+
|
"\28\2\u028c\u0290\u0294\u0298\u029c\u02a3\u02a8\u02aa\u02ae\u02b1\u02b5"+
|
||||||
"\3\2\2\2\u044b\u044d\3\2\2\2\u044c\u044a\3\2\2\2\u044d\u044e\b\u009b\2"+
|
"\u02bc\u02c0\u02c5\u02cd\u02d0\u02d7\u02db\u02df\u02e5\u02e8\u02ef\u02f3"+
|
||||||
"\2\u044e\u0136\3\2\2\28\2\u0293\u0297\u029b\u029f\u02a3\u02aa\u02af\u02b1"+
|
"\u02fb\u02fe\u0305\u0309\u030d\u0312\u0315\u0318\u031d\u0320\u0325\u032a"+
|
||||||
"\u02b5\u02b8\u02bc\u02c3\u02c7\u02cc\u02d4\u02d7\u02de\u02e2\u02e6\u02ec"+
|
"\u0332\u033d\u0341\u0346\u034a\u035a\u0364\u036a\u0371\u0375\u037b\u0388"+
|
||||||
"\u02ef\u02f6\u02fa\u0302\u0305\u030c\u0310\u0314\u0319\u031c\u031f\u0324"+
|
"\u040f\u0418\u0420\u042b\u0435\u0443\3\b\2\2";
|
||||||
"\u0327\u032c\u0331\u0339\u0344\u0348\u034d\u0351\u0361\u036b\u0371\u0378"+
|
|
||||||
"\u037c\u0382\u038f\u0416\u041f\u0427\u0432\u043c\u044a\3\b\2\2";
|
|
||||||
public static final ATN _ATN =
|
public static final ATN _ATN =
|
||||||
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
|
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
|
||||||
static {
|
static {
|
||||||
|
@ -1,207 +1,205 @@
|
|||||||
T__0=1
|
ABSTRACT=1
|
||||||
ABSTRACT=2
|
ASSERT=2
|
||||||
ASSERT=3
|
BOOLEAN=3
|
||||||
BOOLEAN=4
|
BREAK=4
|
||||||
BREAK=5
|
BYTE=5
|
||||||
BYTE=6
|
CASE=6
|
||||||
CASE=7
|
CATCH=7
|
||||||
CATCH=8
|
CHAR=8
|
||||||
CHAR=9
|
CLASS=9
|
||||||
CLASS=10
|
CONST=10
|
||||||
CONST=11
|
CONTINUE=11
|
||||||
CONTINUE=12
|
DEFAULT=12
|
||||||
DEFAULT=13
|
DO=13
|
||||||
DO=14
|
DOUBLE=14
|
||||||
DOUBLE=15
|
ELSE=15
|
||||||
ELSE=16
|
ENUM=16
|
||||||
ENUM=17
|
EXTENDS=17
|
||||||
EXTENDS=18
|
FINAL=18
|
||||||
FINAL=19
|
FINALLY=19
|
||||||
FINALLY=20
|
FLOAT=20
|
||||||
FLOAT=21
|
FOR=21
|
||||||
FOR=22
|
IF=22
|
||||||
IF=23
|
GOTO=23
|
||||||
GOTO=24
|
IMPLEMENTS=24
|
||||||
IMPLEMENTS=25
|
IMPORT=25
|
||||||
IMPORT=26
|
INSTANCEOF=26
|
||||||
INSTANCEOF=27
|
INT=27
|
||||||
INT=28
|
INTERFACE=28
|
||||||
INTERFACE=29
|
LONG=29
|
||||||
LONG=30
|
NATIVE=30
|
||||||
NATIVE=31
|
NEW=31
|
||||||
NEW=32
|
PACKAGE=32
|
||||||
PACKAGE=33
|
PRIVATE=33
|
||||||
PRIVATE=34
|
PROTECTED=34
|
||||||
PROTECTED=35
|
PUBLIC=35
|
||||||
PUBLIC=36
|
RETURN=36
|
||||||
RETURN=37
|
SHORT=37
|
||||||
SHORT=38
|
STATIC=38
|
||||||
STATIC=39
|
STRICTFP=39
|
||||||
STRICTFP=40
|
SUPER=40
|
||||||
SUPER=41
|
SWITCH=41
|
||||||
SWITCH=42
|
SYNCHRONIZED=42
|
||||||
SYNCHRONIZED=43
|
THIS=43
|
||||||
THIS=44
|
THROW=44
|
||||||
THROW=45
|
THROWS=45
|
||||||
THROWS=46
|
TRANSIENT=46
|
||||||
TRANSIENT=47
|
TRY=47
|
||||||
TRY=48
|
VOID=48
|
||||||
VOID=49
|
VOLATILE=49
|
||||||
VOLATILE=50
|
WHILE=50
|
||||||
WHILE=51
|
IntegerLiteral=51
|
||||||
IntegerLiteral=52
|
FloatingPointLiteral=52
|
||||||
FloatingPointLiteral=53
|
BooleanLiteral=53
|
||||||
BooleanLiteral=54
|
CharacterLiteral=54
|
||||||
CharacterLiteral=55
|
StringLiteral=55
|
||||||
StringLiteral=56
|
NullLiteral=56
|
||||||
NullLiteral=57
|
LPAREN=57
|
||||||
LPAREN=58
|
RPAREN=58
|
||||||
RPAREN=59
|
LBRACE=59
|
||||||
LBRACE=60
|
RBRACE=60
|
||||||
RBRACE=61
|
LBRACK=61
|
||||||
LBRACK=62
|
RBRACK=62
|
||||||
RBRACK=63
|
SEMI=63
|
||||||
SEMI=64
|
COMMA=64
|
||||||
COMMA=65
|
DOT=65
|
||||||
DOT=66
|
ASSIGN=66
|
||||||
ASSIGN=67
|
GT=67
|
||||||
GT=68
|
LT=68
|
||||||
LT=69
|
BANG=69
|
||||||
BANG=70
|
TILDE=70
|
||||||
TILDE=71
|
QUESTION=71
|
||||||
QUESTION=72
|
COLON=72
|
||||||
COLON=73
|
EQUAL=73
|
||||||
EQUAL=74
|
LE=74
|
||||||
LE=75
|
GE=75
|
||||||
GE=76
|
NOTEQUAL=76
|
||||||
NOTEQUAL=77
|
AND=77
|
||||||
AND=78
|
OR=78
|
||||||
OR=79
|
INC=79
|
||||||
INC=80
|
DEC=80
|
||||||
DEC=81
|
ADD=81
|
||||||
ADD=82
|
SUB=82
|
||||||
SUB=83
|
MUL=83
|
||||||
MUL=84
|
DIV=84
|
||||||
DIV=85
|
BITAND=85
|
||||||
BITAND=86
|
BITOR=86
|
||||||
BITOR=87
|
CARET=87
|
||||||
CARET=88
|
MOD=88
|
||||||
MOD=89
|
ARROW=89
|
||||||
ARROW=90
|
COLONCOLON=90
|
||||||
COLONCOLON=91
|
ADD_ASSIGN=91
|
||||||
ADD_ASSIGN=92
|
SUB_ASSIGN=92
|
||||||
SUB_ASSIGN=93
|
MUL_ASSIGN=93
|
||||||
MUL_ASSIGN=94
|
DIV_ASSIGN=94
|
||||||
DIV_ASSIGN=95
|
AND_ASSIGN=95
|
||||||
AND_ASSIGN=96
|
OR_ASSIGN=96
|
||||||
OR_ASSIGN=97
|
XOR_ASSIGN=97
|
||||||
XOR_ASSIGN=98
|
MOD_ASSIGN=98
|
||||||
MOD_ASSIGN=99
|
LSHIFT_ASSIGN=99
|
||||||
LSHIFT_ASSIGN=100
|
RSHIFT_ASSIGN=100
|
||||||
RSHIFT_ASSIGN=101
|
URSHIFT_ASSIGN=101
|
||||||
URSHIFT_ASSIGN=102
|
Identifier=102
|
||||||
Identifier=103
|
AT=103
|
||||||
AT=104
|
ELLIPSIS=104
|
||||||
ELLIPSIS=105
|
WS=105
|
||||||
WS=106
|
COMMENT=106
|
||||||
COMMENT=107
|
LINE_COMMENT=107
|
||||||
LINE_COMMENT=108
|
'abstract'=1
|
||||||
'auto'=1
|
'assert'=2
|
||||||
'abstract'=2
|
'boolean'=3
|
||||||
'assert'=3
|
'break'=4
|
||||||
'boolean'=4
|
'byte'=5
|
||||||
'break'=5
|
'case'=6
|
||||||
'byte'=6
|
'catch'=7
|
||||||
'case'=7
|
'char'=8
|
||||||
'catch'=8
|
'class'=9
|
||||||
'char'=9
|
'const'=10
|
||||||
'class'=10
|
'continue'=11
|
||||||
'const'=11
|
'default'=12
|
||||||
'continue'=12
|
'do'=13
|
||||||
'default'=13
|
'double'=14
|
||||||
'do'=14
|
'else'=15
|
||||||
'double'=15
|
'enum'=16
|
||||||
'else'=16
|
'extends'=17
|
||||||
'enum'=17
|
'final'=18
|
||||||
'extends'=18
|
'finally'=19
|
||||||
'final'=19
|
'float'=20
|
||||||
'finally'=20
|
'for'=21
|
||||||
'float'=21
|
'if'=22
|
||||||
'for'=22
|
'goto'=23
|
||||||
'if'=23
|
'implements'=24
|
||||||
'goto'=24
|
'import'=25
|
||||||
'implements'=25
|
'instanceof'=26
|
||||||
'import'=26
|
'int'=27
|
||||||
'instanceof'=27
|
'interface'=28
|
||||||
'int'=28
|
'long'=29
|
||||||
'interface'=29
|
'native'=30
|
||||||
'long'=30
|
'new'=31
|
||||||
'native'=31
|
'package'=32
|
||||||
'new'=32
|
'private'=33
|
||||||
'package'=33
|
'protected'=34
|
||||||
'private'=34
|
'public'=35
|
||||||
'protected'=35
|
'return'=36
|
||||||
'public'=36
|
'short'=37
|
||||||
'return'=37
|
'static'=38
|
||||||
'short'=38
|
'strictfp'=39
|
||||||
'static'=39
|
'super'=40
|
||||||
'strictfp'=40
|
'switch'=41
|
||||||
'super'=41
|
'synchronized'=42
|
||||||
'switch'=42
|
'this'=43
|
||||||
'synchronized'=43
|
'throw'=44
|
||||||
'this'=44
|
'throws'=45
|
||||||
'throw'=45
|
'transient'=46
|
||||||
'throws'=46
|
'try'=47
|
||||||
'transient'=47
|
'void'=48
|
||||||
'try'=48
|
'volatile'=49
|
||||||
'void'=49
|
'while'=50
|
||||||
'volatile'=50
|
'null'=56
|
||||||
'while'=51
|
'('=57
|
||||||
'null'=57
|
')'=58
|
||||||
'('=58
|
'{'=59
|
||||||
')'=59
|
'}'=60
|
||||||
'{'=60
|
'['=61
|
||||||
'}'=61
|
']'=62
|
||||||
'['=62
|
';'=63
|
||||||
']'=63
|
','=64
|
||||||
';'=64
|
'.'=65
|
||||||
','=65
|
'='=66
|
||||||
'.'=66
|
'>'=67
|
||||||
'='=67
|
'<'=68
|
||||||
'>'=68
|
'!'=69
|
||||||
'<'=69
|
'~'=70
|
||||||
'!'=70
|
'?'=71
|
||||||
'~'=71
|
':'=72
|
||||||
'?'=72
|
'=='=73
|
||||||
':'=73
|
'<='=74
|
||||||
'=='=74
|
'>='=75
|
||||||
'<='=75
|
'!='=76
|
||||||
'>='=76
|
'&&'=77
|
||||||
'!='=77
|
'||'=78
|
||||||
'&&'=78
|
'++'=79
|
||||||
'||'=79
|
'--'=80
|
||||||
'++'=80
|
'+'=81
|
||||||
'--'=81
|
'-'=82
|
||||||
'+'=82
|
'*'=83
|
||||||
'-'=83
|
'/'=84
|
||||||
'*'=84
|
'&'=85
|
||||||
'/'=85
|
'|'=86
|
||||||
'&'=86
|
'^'=87
|
||||||
'|'=87
|
'%'=88
|
||||||
'^'=88
|
'->'=89
|
||||||
'%'=89
|
'::'=90
|
||||||
'->'=90
|
'+='=91
|
||||||
'::'=91
|
'-='=92
|
||||||
'+='=92
|
'*='=93
|
||||||
'-='=93
|
'/='=94
|
||||||
'*='=94
|
'&='=95
|
||||||
'/='=95
|
'|='=96
|
||||||
'&='=96
|
'^='=97
|
||||||
'|='=97
|
'%='=98
|
||||||
'^='=98
|
'<<='=99
|
||||||
'%='=99
|
'>>='=100
|
||||||
'<<='=100
|
'>>>='=101
|
||||||
'>>='=101
|
'@'=103
|
||||||
'>>>='=102
|
'...'=104
|
||||||
'@'=104
|
|
||||||
'...'=105
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Generated from Java8.g4 by ANTLR 4.5.3
|
// Generated from Java8.g4 by ANTLR 4.7
|
||||||
package de.dhbwstuttgart.parser.antlr;
|
package de.dhbwstuttgart.parser.antlr;
|
||||||
import org.antlr.v4.runtime.tree.ParseTreeListener;
|
import org.antlr.v4.runtime.tree.ParseTreeListener;
|
||||||
|
|
||||||
@ -1307,6 +1307,16 @@ public interface Java8Listener extends ParseTreeListener {
|
|||||||
* @param ctx the parse tree
|
* @param ctx the parse tree
|
||||||
*/
|
*/
|
||||||
void exitLocalVariableDeclarationStatement(Java8Parser.LocalVariableDeclarationStatementContext ctx);
|
void exitLocalVariableDeclarationStatement(Java8Parser.LocalVariableDeclarationStatementContext ctx);
|
||||||
|
/**
|
||||||
|
* Enter a parse tree produced by {@link Java8Parser#unannTypeOrAuto}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
*/
|
||||||
|
void enterUnannTypeOrAuto(Java8Parser.UnannTypeOrAutoContext ctx);
|
||||||
|
/**
|
||||||
|
* Exit a parse tree produced by {@link Java8Parser#unannTypeOrAuto}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
*/
|
||||||
|
void exitUnannTypeOrAuto(Java8Parser.UnannTypeOrAutoContext ctx);
|
||||||
/**
|
/**
|
||||||
* Enter a parse tree produced by {@link Java8Parser#localVariableDeclaration}.
|
* Enter a parse tree produced by {@link Java8Parser#localVariableDeclaration}.
|
||||||
* @param ctx the parse tree
|
* @param ctx the parse tree
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,13 @@
|
|||||||
package de.dhbwstuttgart.parser.scope;
|
package de.dhbwstuttgart.parser.scope;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.antlr.Java8BaseListener;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.AbstractASTWalker;
|
||||||
|
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
|
||||||
import org.antlr.v4.runtime.tree.TerminalNode;
|
import org.antlr.v4.runtime.tree.TerminalNode;
|
||||||
|
|
||||||
import de.dhbwstuttgart.environment.PackageCrawler;
|
import de.dhbwstuttgart.environment.PackageCrawler;
|
||||||
@ -10,19 +15,8 @@ import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
|||||||
|
|
||||||
public class GatherNames {
|
public class GatherNames {
|
||||||
|
|
||||||
private static String getPackageName(Java8Parser.CompilationUnitContext ctx){
|
public static Map<String, Integer> getNames(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages) throws ClassNotFoundException{
|
||||||
String pkgName = "";
|
Map<String, Integer> ret = new HashMap<>();
|
||||||
if(ctx.packageDeclaration() != null){
|
|
||||||
for(TerminalNode t : ctx.packageDeclaration().Identifier()){
|
|
||||||
pkgName = pkgName + "." + t.toString();
|
|
||||||
}
|
|
||||||
pkgName = pkgName.substring(1);
|
|
||||||
}
|
|
||||||
return pkgName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<String> getNames(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages) throws ClassNotFoundException{
|
|
||||||
List<String> ret = new ArrayList<>();
|
|
||||||
String pkgName = getPackageName(ctx);
|
String pkgName = getPackageName(ctx);
|
||||||
String nameString = "";
|
String nameString = "";
|
||||||
for (Java8Parser.TypeDeclarationContext typeDecl : ctx.typeDeclaration()){
|
for (Java8Parser.TypeDeclarationContext typeDecl : ctx.typeDeclaration()){
|
||||||
@ -34,6 +28,8 @@ public class GatherNames {
|
|||||||
else{
|
else{
|
||||||
nameString = typeDecl.interfaceDeclaration().normalInterfaceDeclaration().Identifier().toString();
|
nameString = typeDecl.interfaceDeclaration().normalInterfaceDeclaration().Identifier().toString();
|
||||||
}
|
}
|
||||||
|
int numGenerics = typeDecl.interfaceDeclaration().normalInterfaceDeclaration().typeParameters()!=null?
|
||||||
|
typeDecl.interfaceDeclaration().normalInterfaceDeclaration().typeParameters().typeParameterList().typeParameter().size():0;
|
||||||
//Die Generic TypeParameter Definitionen Nicht! an die JavaClassName-Registry anfügen:
|
//Die Generic TypeParameter Definitionen Nicht! an die JavaClassName-Registry anfügen:
|
||||||
/* //Diese gelängen dadurch in den globalen Scope, was sie schließlich nicht sind
|
/* //Diese gelängen dadurch in den globalen Scope, was sie schließlich nicht sind
|
||||||
if(typeDecl.classDeclaration().normalClassDeclaration().typeParameters() != null){
|
if(typeDecl.classDeclaration().normalClassDeclaration().typeParameters() != null){
|
||||||
@ -42,7 +38,7 @@ public class GatherNames {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
ret.add(nameString);
|
ret.put(nameString, numGenerics);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -61,31 +57,49 @@ public class GatherNames {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
ret.add(nameString);
|
int numGenerics = typeDecl.classDeclaration().normalClassDeclaration().typeParameters()!=null?
|
||||||
|
typeDecl.classDeclaration().normalClassDeclaration().typeParameters().typeParameterList().typeParameter().size():0;
|
||||||
|
|
||||||
|
ret.put(nameString, numGenerics);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret.addAll(getImports(ctx, packages));
|
ret.putAll(getImports(ctx, packages));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static List<String> getImports(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages) throws ClassNotFoundException {
|
public static Map<String, Integer> getImports(Java8Parser.CompilationUnitContext ctx, PackageCrawler packages) throws ClassNotFoundException {
|
||||||
List<String> ret = new ArrayList();
|
Map<String, Integer> ret = new HashMap<>();
|
||||||
for(Java8Parser.ImportDeclarationContext importDeclCtx : ctx.importDeclaration()){
|
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
|
||||||
|
ret.putAll(packages.getClassNames("java.lang"));
|
||||||
|
for(Java8Parser.ImportDeclarationContext importDeclCtx : ctx.importDeclaration()){
|
||||||
if(importDeclCtx.singleTypeImportDeclaration() != null){
|
if(importDeclCtx.singleTypeImportDeclaration() != null){
|
||||||
ret.add(importDeclCtx.singleTypeImportDeclaration().typeName().getText());
|
Class cl = classLoader.loadClass(importDeclCtx.singleTypeImportDeclaration().typeName().getText());
|
||||||
|
ret.put(cl.getName(), cl.getTypeParameters().length);
|
||||||
}
|
}
|
||||||
else if(importDeclCtx.typeImportOnDemandDeclaration() != null){
|
else if(importDeclCtx.typeImportOnDemandDeclaration() != null){
|
||||||
ret.addAll(packages.getClassNames(importDeclCtx.typeImportOnDemandDeclaration().packageOrTypeName().getText()));
|
ret.putAll(packages.getClassNames(importDeclCtx.typeImportOnDemandDeclaration().packageOrTypeName().getText()));
|
||||||
}
|
}
|
||||||
else if(importDeclCtx.singleStaticImportDeclaration() != null){
|
else if(importDeclCtx.singleStaticImportDeclaration() != null){
|
||||||
ret.add(importDeclCtx.singleStaticImportDeclaration().typeName().getText()+"."+importDeclCtx.singleStaticImportDeclaration().Identifier().getText());
|
Class cl = classLoader.loadClass(importDeclCtx.singleStaticImportDeclaration().typeName().getText()+"."+importDeclCtx.singleStaticImportDeclaration().Identifier().getText());
|
||||||
}
|
ret.put(cl.getName(), cl.getTypeParameters().length);
|
||||||
|
}
|
||||||
else{
|
else{
|
||||||
ret.addAll(packages.getClassNames(importDeclCtx.staticImportOnDemandDeclaration().typeName().getText()));
|
ret.putAll(packages.getClassNames(importDeclCtx.staticImportOnDemandDeclaration().typeName().getText()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private static String getPackageName(Java8Parser.CompilationUnitContext ctx){
|
||||||
|
String pkgName = "";
|
||||||
|
if(ctx.packageDeclaration() != null){
|
||||||
|
for(TerminalNode t : ctx.packageDeclaration().Identifier()){
|
||||||
|
pkgName = pkgName + "." + t.toString();
|
||||||
|
}
|
||||||
|
pkgName = pkgName.substring(1);
|
||||||
|
}
|
||||||
|
return pkgName;
|
||||||
|
}
|
||||||
|
}
|
@ -19,4 +19,8 @@ public class GenericTypeName extends JavaClassName {
|
|||||||
+ DELIMITER + methodName
|
+ DELIMITER + methodName
|
||||||
+ DELIMITER + super.toString();
|
+ DELIMITER + super.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JavaClassName getParentClass() {
|
||||||
|
return parentClass;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
50
src/de/dhbwstuttgart/parser/scope/GenericsRegistry.java
Normal file
50
src/de/dhbwstuttgart/parser/scope/GenericsRegistry.java
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package de.dhbwstuttgart.parser.scope;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.GenericContext;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class GenericsRegistry {
|
||||||
|
private final List<GenericVariable> registry = new ArrayList<>();
|
||||||
|
public final GenericsRegistry globalRegistry;
|
||||||
|
|
||||||
|
public GenericsRegistry(GenericsRegistry globalRegistry){
|
||||||
|
this.globalRegistry = globalRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void put(String name, GenericContext genericContext){
|
||||||
|
registry.add(new GenericVariable(genericContext,name));
|
||||||
|
if(globalRegistry != null)globalRegistry.put(name, genericContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(String name) {
|
||||||
|
Optional<Boolean> ret = registry.stream().<Boolean>map(((GenericVariable genericVariable) -> genericVariable.name.equals(name)))
|
||||||
|
.reduce(((a, b) -> a || b));
|
||||||
|
if(ret.isPresent())
|
||||||
|
return ret.get();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GenericContext get(String name) {
|
||||||
|
return registry.stream()
|
||||||
|
.filter((genericVariable -> genericVariable.name.equals(name))).findAny().get().context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void putAll(GenericsRegistry generics) {
|
||||||
|
for(GenericVariable generic : generics.registry){
|
||||||
|
this.put(generic.name, generic.context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class GenericVariable{
|
||||||
|
final GenericContext context;
|
||||||
|
final String name;
|
||||||
|
|
||||||
|
GenericVariable(GenericContext context, String name){
|
||||||
|
this.context = context;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package de.dhbwstuttgart.parser.scope;
|
package de.dhbwstuttgart.parser.scope;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -35,7 +36,7 @@ public class JavaClassName {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gibt von einem Klassennamen nur den Namen der Klasse zurück
|
* Gibt von einem Klassennamen nur den Namen der Klasse zur<EFBFBD>ck
|
||||||
* Beispiel:
|
* Beispiel:
|
||||||
* java.lang.Object wird zu: Object
|
* java.lang.Object wird zu: Object
|
||||||
*/
|
*/
|
||||||
@ -48,8 +49,10 @@ public class JavaClassName {
|
|||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||||
|
/*
|
||||||
result = prime * result
|
result = prime * result
|
||||||
+ ((packageName == null) ? 0 : packageName.hashCode()); //PackageName does not infect hashCode
|
+ ((packageName == null) ? 0 : packageName.hashCode()); //PackageName does not infect hashCode
|
||||||
|
*/
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,35 +1,26 @@
|
|||||||
package de.dhbwstuttgart.parser.scope;
|
package de.dhbwstuttgart.parser.scope;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Speichert die Klassen für einen bestimmten Projektscope
|
* Speichert die Klassen f<EFBFBD>r einen bestimmten Projektscope
|
||||||
*/
|
*/
|
||||||
public class JavaClassRegistry {
|
public class JavaClassRegistry {
|
||||||
final List<JavaClassName> existingClasses = new ArrayList<>();
|
final Map<JavaClassName, Integer> existingClasses = new HashMap<>();
|
||||||
final List<String> importedPackages = new ArrayList<>();
|
|
||||||
|
|
||||||
public JavaClassRegistry(List<String> initialNames){
|
public JavaClassRegistry(Map<String, Integer> initialNames){
|
||||||
for(String name : initialNames){
|
for(String name : initialNames.keySet()){
|
||||||
existingClasses.add(new JavaClassName(name));
|
existingClasses.put(new JavaClassName(name), initialNames.get(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(String className){
|
|
||||||
existingClasses.add(new JavaClassName(className));
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassName getName(String className) {
|
public JavaClassName getName(String className) {
|
||||||
for(JavaClassName name : existingClasses){
|
for(JavaClassName name : existingClasses.keySet()){
|
||||||
if(name.equals(new JavaClassName(className)))return name;
|
if(name.equals(new JavaClassName(className)))return name;
|
||||||
}
|
}
|
||||||
//Jetzt noch alle importierten Packages durchsuchen:
|
throw new NotImplementedException();
|
||||||
JavaClassName ret = getClassFromImportedPackages(className);
|
|
||||||
if(ret == null){
|
|
||||||
throw new TypeNotPresentException(className, new Throwable());
|
|
||||||
}else{
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -37,35 +28,22 @@ public class JavaClassRegistry {
|
|||||||
return existingClasses.toString();
|
return existingClasses.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<JavaClassName> getAllFromPackage(String packageName) {
|
||||||
|
List<JavaClassName> ret = new ArrayList<>();
|
||||||
|
for(JavaClassName className : this.existingClasses.keySet()){
|
||||||
|
JavaClassName toCompare = new JavaClassName(packageName + "." + JavaClassName.stripClassName(className.toString()));
|
||||||
|
if(toCompare.toString().equals(className.toString())){
|
||||||
|
ret.add(className);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean contains(String whole) {
|
public boolean contains(String whole) {
|
||||||
boolean ret = existingClasses.contains(new JavaClassName(whole));
|
return existingClasses.containsKey(new JavaClassName(whole));
|
||||||
if(ret == false){
|
|
||||||
JavaClassName imported = getClassFromImportedPackages(whole);
|
|
||||||
if(imported != null){
|
|
||||||
existingClasses.add(imported);
|
|
||||||
return true;
|
|
||||||
}else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private JavaClassName getClassFromImportedPackages(String className){
|
public int getNumberOfGenerics(String name) {
|
||||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
return existingClasses.get(new JavaClassName(name));
|
||||||
String shortName = JavaClassName.stripClassName(className);
|
|
||||||
for(String packageName : importedPackages) {
|
|
||||||
try {
|
|
||||||
loader.loadClass(packageName+"."+shortName);
|
|
||||||
//Keine Exception! Die Klasse existiert:
|
|
||||||
JavaClassName ret = new JavaClassName(packageName+"."+shortName);
|
|
||||||
if(ret.equals(new JavaClassName(className)))return ret;
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
//Die Klasse wurde nicht gefunden!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
8
src/de/dhbwstuttgart/sat/CNF/CNF.java
Normal file
8
src/de/dhbwstuttgart/sat/CNF/CNF.java
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package de.dhbwstuttgart.sat.CNF;
|
||||||
|
|
||||||
|
public class CNF {
|
||||||
|
/*
|
||||||
|
Baut die CNF Datei.
|
||||||
|
Hier muss man überlegen, in welchem Form die Constraints gebaut werden
|
||||||
|
*/
|
||||||
|
}
|
12
src/de/dhbwstuttgart/sat/CNF/Writer.java
Normal file
12
src/de/dhbwstuttgart/sat/CNF/Writer.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package de.dhbwstuttgart.sat.CNF;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schreibt CNFs in eine Datei im DIMACS CNF Format
|
||||||
|
*/
|
||||||
|
public class Writer {
|
||||||
|
public Writer(FileWriter output){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
115
src/de/dhbwstuttgart/sat/asp/ASPGenerator.java
Normal file
115
src/de/dhbwstuttgart/sat/asp/ASPGenerator.java
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.exceptions.DebugException;
|
||||||
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
import de.dhbwstuttgart.sat.asp.model.*;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.*;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
|
||||||
|
|
||||||
|
import java.sql.Ref;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class ASPGenerator {
|
||||||
|
ASPWriter writer = new ASPWriter();
|
||||||
|
private final String asp;
|
||||||
|
|
||||||
|
public ASPGenerator(ConstraintSet<Pair> constraints, Collection<ClassOrInterface> fcClasses){
|
||||||
|
List<Constraint<Pair>> constraints1 = constraints.cartesianProduct().iterator().next();
|
||||||
|
List<Pair> constraintPairs = new ArrayList<>();
|
||||||
|
for(Constraint<Pair> constraint : constraints1){
|
||||||
|
System.out.println(UnifyTypeFactory.convert(constraint));
|
||||||
|
constraintPairs.addAll(constraint);
|
||||||
|
}
|
||||||
|
asp = toASP(constraintPairs, fcClasses);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getASP(){
|
||||||
|
return asp;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String toASP(List<Pair> constraintSet, Collection<ClassOrInterface> fcClasses){
|
||||||
|
TypeConverter converter = new TypeConverter();
|
||||||
|
for(ClassOrInterface cl : fcClasses){
|
||||||
|
ASPType superClass = cl.getSuperClass().acceptTV(converter);
|
||||||
|
ASPPairSmaller fcEntry = new ASPPairSmaller(convert(cl), superClass);
|
||||||
|
writer.add(new ASPStatement(fcEntry.toASP()));
|
||||||
|
}
|
||||||
|
for(Pair cons : constraintSet){
|
||||||
|
writer.add(new ASPStatement(convert(cons).toASP()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return writer.getASPFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ASPPair convert(Pair pair){
|
||||||
|
TypeConverter converter = new TypeConverter();
|
||||||
|
ASPType ls = pair.TA1.acceptTV(converter);
|
||||||
|
ASPType rs = pair.TA2.acceptTV(converter);
|
||||||
|
if(pair.OperatorEqual()){
|
||||||
|
return new ASPPairEquals(ls, rs);
|
||||||
|
}else if(pair.OperatorSmallerDot()){
|
||||||
|
return new ASPPairSmallerDot(ls, rs);
|
||||||
|
}else throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ASPType convert(ClassOrInterface cl){
|
||||||
|
List<ASPType> paramList = new ArrayList<>();
|
||||||
|
for(GenericTypeVar gtv : cl.getGenerics()){
|
||||||
|
paramList.add(new ASPGenericType(toConstant(gtv.getName())));
|
||||||
|
}
|
||||||
|
ASPParameterList params = new ASPParameterList(paramList, writer);
|
||||||
|
return new ASPRefType(toConstant(cl.getClassName()), params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toConstant(JavaClassName name){
|
||||||
|
return toConstant(name.toString().replace(".", "_"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toConstant(String name){
|
||||||
|
return "c" + name.toString().replace(".", "_");
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TypeConverter implements TypeVisitor<ASPType>{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ASPType visit(RefType type) {
|
||||||
|
List<ASPType> paramList = new ArrayList<>();
|
||||||
|
for(RefTypeOrTPHOrWildcardOrGeneric gtv : type.getParaList()){
|
||||||
|
paramList.add(gtv.acceptTV(this));
|
||||||
|
}
|
||||||
|
ASPParameterList params = new ASPParameterList(paramList, writer);
|
||||||
|
return new ASPRefType(toConstant(type.getName()), params);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ASPType visit(SuperWildcardType superWildcardType) {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ASPType visit(TypePlaceholder typePlaceholder) {
|
||||||
|
return new ASPTypeVar(toConstant(typePlaceholder.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ASPType visit(ExtendsWildcardType extendsWildcardType) {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ASPType visit(GenericRefType genericRefType) {
|
||||||
|
return new ASPRefType(toConstant(genericRefType.getName()),
|
||||||
|
new ASPParameterList(new ArrayList<>(), writer));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
src/de/dhbwstuttgart/sat/asp/ASPWriter.java
Normal file
24
src/de/dhbwstuttgart/sat/asp/ASPWriter.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.sat.asp.model.ASPRefType;
|
||||||
|
import de.dhbwstuttgart.sat.asp.model.ASPStatement;
|
||||||
|
import de.dhbwstuttgart.sat.asp.model.ASPType;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
public class ASPWriter {
|
||||||
|
|
||||||
|
private HashSet<ASPStatement> content = new HashSet<>();
|
||||||
|
|
||||||
|
public void add(ASPStatement stmt){
|
||||||
|
content.add(stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getASPFile(){
|
||||||
|
String ret = "";
|
||||||
|
for(ASPStatement statement : content){
|
||||||
|
ret += statement.getASP() + ".\n";
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
14
src/de/dhbwstuttgart/sat/asp/model/ASPGenericType.java
Normal file
14
src/de/dhbwstuttgart/sat/asp/model/ASPGenericType.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public class ASPGenericType implements ASPType{
|
||||||
|
public static final String ASP_GENERIC_TYPE_NAME = "genericType";
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
public ASPGenericType(String name){
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return ASP_GENERIC_TYPE_NAME + "(" + name + ")";
|
||||||
|
}
|
||||||
|
}
|
21
src/de/dhbwstuttgart/sat/asp/model/ASPPair.java
Normal file
21
src/de/dhbwstuttgart/sat/asp/model/ASPPair.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public abstract class ASPPair {
|
||||||
|
public final ASPType leftSide;
|
||||||
|
public final ASPType rightSide;
|
||||||
|
|
||||||
|
public ASPPair(ASPType ls, ASPType rs){
|
||||||
|
this.leftSide = ls;
|
||||||
|
this.rightSide = rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toASP(){
|
||||||
|
return this.getRuleName() + "(" + leftSide + ","+ rightSide + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return toASP();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract String getRuleName();
|
||||||
|
}
|
13
src/de/dhbwstuttgart/sat/asp/model/ASPPairEquals.java
Normal file
13
src/de/dhbwstuttgart/sat/asp/model/ASPPairEquals.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public class ASPPairEquals extends ASPPair{
|
||||||
|
private final static String ASP_PAIR_EQUALS_NAME = "equals";
|
||||||
|
public ASPPairEquals(ASPType ls, ASPType rs){
|
||||||
|
super(ls, rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getRuleName() {
|
||||||
|
return ASP_PAIR_EQUALS_NAME;
|
||||||
|
}
|
||||||
|
}
|
13
src/de/dhbwstuttgart/sat/asp/model/ASPPairSmaller.java
Normal file
13
src/de/dhbwstuttgart/sat/asp/model/ASPPairSmaller.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public class ASPPairSmaller extends ASPPair{
|
||||||
|
private final static String ASP_PAIR_SMALLER_NAME = "smaller";
|
||||||
|
public ASPPairSmaller(ASPType ls, ASPType rs){
|
||||||
|
super(ls, rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getRuleName() {
|
||||||
|
return ASP_PAIR_SMALLER_NAME;
|
||||||
|
}
|
||||||
|
}
|
13
src/de/dhbwstuttgart/sat/asp/model/ASPPairSmallerDot.java
Normal file
13
src/de/dhbwstuttgart/sat/asp/model/ASPPairSmallerDot.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public class ASPPairSmallerDot extends ASPPair{
|
||||||
|
private final static String ASP_PAIR_SMALLER_NAME = "smallerDot";
|
||||||
|
public ASPPairSmallerDot(ASPType ls, ASPType rs){
|
||||||
|
super(ls, rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getRuleName() {
|
||||||
|
return ASP_PAIR_SMALLER_NAME;
|
||||||
|
}
|
||||||
|
}
|
45
src/de/dhbwstuttgart/sat/asp/model/ASPParameterList.java
Normal file
45
src/de/dhbwstuttgart/sat/asp/model/ASPParameterList.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.sat.asp.ASPGenerator;
|
||||||
|
import de.dhbwstuttgart.sat.asp.ASPWriter;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ASPParameterList {
|
||||||
|
private final static String ASP_PARAMLIST_NAME = "param";
|
||||||
|
private final static String ASP_PARAMLIST_END_POINTER = "null";
|
||||||
|
public final String name;
|
||||||
|
private final List<ASPType> types;
|
||||||
|
|
||||||
|
public ASPParameterList(List<ASPType> types, ASPWriter writer){
|
||||||
|
this.types = types;
|
||||||
|
if(types.size() == 0){
|
||||||
|
name = ASP_PARAMLIST_END_POINTER;
|
||||||
|
}else{
|
||||||
|
name = newName();
|
||||||
|
String nextPointer = name;
|
||||||
|
Iterator<ASPType> it = types.iterator();
|
||||||
|
while(it.hasNext()){
|
||||||
|
ASPType t = it.next();
|
||||||
|
String param = nextPointer + "," + t.toString() + ",";
|
||||||
|
nextPointer = newName();
|
||||||
|
if(! it.hasNext())nextPointer = ASP_PARAMLIST_END_POINTER;
|
||||||
|
param += nextPointer;
|
||||||
|
writer.add(new ASPStatement(ASP_PARAMLIST_NAME + "(" + param + ")"));
|
||||||
|
//paramDefinitions.add(new ASPStatement(ASP_PARAMLIST_NAME + "(" + param + ")"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String newName() {
|
||||||
|
return ASPGenerator.toConstant(NameGenerator.makeNewName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
20
src/de/dhbwstuttgart/sat/asp/model/ASPRefType.java
Normal file
20
src/de/dhbwstuttgart/sat/asp/model/ASPRefType.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public class ASPRefType implements ASPType {
|
||||||
|
public static final String ASP_TYPE = "type";
|
||||||
|
private final ASPParameterList params;
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
public ASPRefType(String name, ASPParameterList params){
|
||||||
|
this.name = name;
|
||||||
|
this.params = params;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ASPParameterList getParams() {
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return ASP_TYPE + "(" + name +"," + params.name + ")";
|
||||||
|
}
|
||||||
|
}
|
27
src/de/dhbwstuttgart/sat/asp/model/ASPStatement.java
Normal file
27
src/de/dhbwstuttgart/sat/asp/model/ASPStatement.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public class ASPStatement {
|
||||||
|
private final String stmt;
|
||||||
|
public ASPStatement(String stmt) {
|
||||||
|
this.stmt = stmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return stmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return stmt.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if(obj instanceof ASPStatement)return stmt.equals(((ASPStatement) obj).stmt);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getASP() {
|
||||||
|
return stmt;
|
||||||
|
}
|
||||||
|
}
|
4
src/de/dhbwstuttgart/sat/asp/model/ASPType.java
Normal file
4
src/de/dhbwstuttgart/sat/asp/model/ASPType.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public interface ASPType {
|
||||||
|
}
|
14
src/de/dhbwstuttgart/sat/asp/model/ASPTypeVar.java
Normal file
14
src/de/dhbwstuttgart/sat/asp/model/ASPTypeVar.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package de.dhbwstuttgart.sat.asp.model;
|
||||||
|
|
||||||
|
public class ASPTypeVar implements ASPType{
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
public ASPTypeVar(String name){
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "typeVar("+ name +")";
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,8 @@ import de.dhbwstuttgart.syntaxtree.statement.literal.Null;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.*;
|
import de.dhbwstuttgart.syntaxtree.type.*;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
|
||||||
public interface ASTVisitor extends StatementVisitor{
|
public interface ASTVisitor extends StatementVisitor{
|
||||||
|
|
||||||
void visit(SourceFile sourceFile);
|
void visit(SourceFile sourceFile);
|
||||||
|
@ -37,7 +37,7 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(FormalParameter formalParameter) {
|
public void visit(FormalParameter formalParameter) {
|
||||||
formalParameter.getType().accept(this);
|
formalParameter.getType().accept((ASTVisitor) this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -105,7 +105,6 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(TypePlaceholder typePlaceholder) {
|
public void visit(TypePlaceholder typePlaceholder) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -115,7 +114,6 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(GenericRefType genericRefType) {
|
public void visit(GenericRefType genericRefType) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -200,7 +198,7 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Receiver receiver) {
|
public void visit(ExpressionReceiver receiver) {
|
||||||
receiver.expr.accept(this);
|
receiver.expr.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
31
src/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java
Executable file → Normal file
31
src/de/dhbwstuttgart/syntaxtree/ClassOrInterface.java
Executable file → Normal file
@ -1,8 +1,10 @@
|
|||||||
package de.dhbwstuttgart.syntaxtree;
|
package de.dhbwstuttgart.syntaxtree;
|
||||||
|
|
||||||
import de.dhbwstuttgart.core.IItemWithOffset;
|
import de.dhbwstuttgart.core.IItemWithOffset;
|
||||||
|
import de.dhbwstuttgart.exceptions.DebugException;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
import de.dhbwstuttgart.syntaxtree.visual.ASTPrinter;
|
import de.dhbwstuttgart.syntaxtree.visual.ASTPrinter;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
@ -16,19 +18,19 @@ import java.util.List;
|
|||||||
/**
|
/**
|
||||||
* Stellt jede Art von Klasse dar. Auch abstrakte Klassen und Interfaces
|
* Stellt jede Art von Klasse dar. Auch abstrakte Klassen und Interfaces
|
||||||
*/
|
*/
|
||||||
public class ClassOrInterface extends SyntaxTreeNode {
|
public class ClassOrInterface extends SyntaxTreeNode implements TypeScope{
|
||||||
protected int modifiers;
|
protected int modifiers;
|
||||||
protected JavaClassName name;
|
protected JavaClassName name;
|
||||||
private List<Field> fields = new ArrayList<>();
|
private List<Field> fields = new ArrayList<>();
|
||||||
private List<Method> methods = new ArrayList<>();
|
private List<Method> methods = new ArrayList<>();
|
||||||
private GenericDeclarationList genericClassParameters;
|
private GenericDeclarationList genericClassParameters;
|
||||||
private RefTypeOrTPHOrWildcardOrGeneric superClass;
|
private RefType superClass;
|
||||||
protected boolean isInterface;
|
protected boolean isInterface;
|
||||||
private List<? extends RefTypeOrTPHOrWildcardOrGeneric> implementedInterfaces;
|
private List<? extends RefTypeOrTPHOrWildcardOrGeneric> implementedInterfaces;
|
||||||
private List<Constructor> constructors;
|
private List<Constructor> constructors;
|
||||||
|
|
||||||
public ClassOrInterface(int modifiers, JavaClassName name, List<Field> fielddecl, List<Method> methods, List<Constructor> constructors, GenericDeclarationList genericClassParameters,
|
public ClassOrInterface(int modifiers, JavaClassName name, List<Field> fielddecl, List<Method> methods, List<Constructor> constructors, GenericDeclarationList genericClassParameters,
|
||||||
RefTypeOrTPHOrWildcardOrGeneric superClass, Boolean isInterface, List<? extends RefTypeOrTPHOrWildcardOrGeneric> implementedInterfaces, Token offset){
|
RefType superClass, Boolean isInterface, List<? extends RefTypeOrTPHOrWildcardOrGeneric> implementedInterfaces, Token offset){
|
||||||
super(offset);
|
super(offset);
|
||||||
this.modifiers = modifiers;
|
this.modifiers = modifiers;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@ -58,15 +60,27 @@ public class ClassOrInterface extends SyntaxTreeNode {
|
|||||||
return this.methods;
|
return this.methods;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
public RefType getType() {
|
public RefType getType() {
|
||||||
return generateTypeOfClass(this.getClassName(), this.getGenerics(), this.getOffset());
|
return generateTypeOfClass(this.getClassName(), this.getGenerics(), this.getOffset());
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
//TODO: Das hier ist ein Problem. Je nach Kontext wird hier ein anderer Typ benötigt
|
||||||
public static RefType generateTypeOfClass(JavaClassName name, GenericDeclarationList genericsOfClass ,Token offset){
|
public static RefType generateTypeOfClass(JavaClassName name, GenericDeclarationList genericsOfClass ,Token offset){
|
||||||
return new RefType(name, offset);
|
//Hier wird immer ein generischer Typ generiert, also mit Type placeholdern
|
||||||
|
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
||||||
|
for(GenericTypeVar genericTypeVar : genericsOfClass){
|
||||||
|
//params.add(genericTypeVar.getTypePlaceholder());
|
||||||
|
params.add(TypePlaceholder.fresh(offset));
|
||||||
|
}
|
||||||
|
return new RefType(name, params, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RefTypeOrTPHOrWildcardOrGeneric getSuperClass() {
|
/**
|
||||||
|
* Die Superklasse im Kontext dieser ClassOrInterface
|
||||||
|
* Das bedeutet, dass generische Variablen als GenericRefTypes dargestellt sind
|
||||||
|
*/
|
||||||
|
public RefType getSuperClass() {
|
||||||
return superClass;
|
return superClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,6 +88,11 @@ public class ClassOrInterface extends SyntaxTreeNode {
|
|||||||
return this.genericClassParameters;
|
return this.genericClassParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RefTypeOrTPHOrWildcardOrGeneric getReturnType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public List<Constructor> getConstructors() {
|
public List<Constructor> getConstructors() {
|
||||||
return constructors;
|
return constructors;
|
||||||
}
|
}
|
||||||
|
@ -14,9 +14,9 @@ public class Constructor extends Method {
|
|||||||
|
|
||||||
|
|
||||||
//TODO: Constructor braucht ein super-Statement
|
//TODO: Constructor braucht ein super-Statement
|
||||||
public Constructor(String name, RefTypeOrTPHOrWildcardOrGeneric returnType, int modifiers, ParameterList parameterList, Block codeInsideConstructor,
|
public Constructor(int modifier, String name, RefTypeOrTPHOrWildcardOrGeneric returnType, int modifiers, ParameterList parameterList, Block codeInsideConstructor,
|
||||||
GenericDeclarationList gtvDeclarations, Token offset, List<Statement> fieldInitializations, RefType superClass) {
|
GenericDeclarationList gtvDeclarations, Token offset, List<Statement> fieldInitializations) {
|
||||||
super(name, returnType, modifiers, parameterList, prepareBlock(codeInsideConstructor,fieldInitializations, superClass), gtvDeclarations, offset);
|
super(modifier, name, returnType, modifiers, parameterList, prepareBlock(codeInsideConstructor,fieldInitializations), gtvDeclarations, offset);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ public class Constructor extends Method {
|
|||||||
* welche die Felder der zugehörigen Klasse dieses
|
* welche die Felder der zugehörigen Klasse dieses
|
||||||
* Konstruktor initialisieren
|
* Konstruktor initialisieren
|
||||||
*/
|
*/
|
||||||
protected static Block prepareBlock(Block constructorBlock, List<Statement> fieldInitializations, RefType superClass){
|
protected static Block prepareBlock(Block constructorBlock, List<Statement> fieldInitializations){
|
||||||
List<Statement> statements = constructorBlock.getStatements();
|
List<Statement> statements = constructorBlock.getStatements();
|
||||||
statements.add(0, new SuperCall(constructorBlock.getOffset()));
|
statements.add(0, new SuperCall(constructorBlock.getOffset()));
|
||||||
return new Block(statements, constructorBlock.getOffset());
|
return new Block(statements, constructorBlock.getOffset());
|
||||||
|
0
src/de/dhbwstuttgart/syntaxtree/ExceptionList.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/ExceptionList.java
Executable file → Normal file
@ -3,13 +3,12 @@ package de.dhbwstuttgart.syntaxtree;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
public class Field extends SyntaxTreeNode{
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class Field extends SyntaxTreeNode implements TypeScope{
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private RefTypeOrTPHOrWildcardOrGeneric type;
|
private RefTypeOrTPHOrWildcardOrGeneric type;
|
||||||
|
|
||||||
|
|
||||||
private GenericDeclarationList genericParameters;
|
|
||||||
|
|
||||||
public Field(String name, RefTypeOrTPHOrWildcardOrGeneric type, int modifier, Token offset){
|
public Field(String name, RefTypeOrTPHOrWildcardOrGeneric type, int modifier, Token offset){
|
||||||
super(offset);
|
super(offset);
|
||||||
@ -29,5 +28,15 @@ public class Field extends SyntaxTreeNode{
|
|||||||
public void accept(ASTVisitor visitor) {
|
public void accept(ASTVisitor visitor) {
|
||||||
visitor.visit(this);
|
visitor.visit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<? extends GenericTypeVar> getGenerics() {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RefTypeOrTPHOrWildcardOrGeneric getReturnType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
0
src/de/dhbwstuttgart/syntaxtree/FormalParameter.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/FormalParameter.java
Executable file → Normal file
9
src/de/dhbwstuttgart/syntaxtree/GenericTypeVar.java
Executable file → Normal file
9
src/de/dhbwstuttgart/syntaxtree/GenericTypeVar.java
Executable file → Normal file
@ -1,6 +1,7 @@
|
|||||||
package de.dhbwstuttgart.syntaxtree;
|
package de.dhbwstuttgart.syntaxtree;
|
||||||
|
|
||||||
import de.dhbwstuttgart.parser.scope.GenericTypeName;
|
import de.dhbwstuttgart.parser.scope.GenericTypeName;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
@ -53,6 +54,14 @@ public class GenericTypeVar extends SyntaxTreeNode
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getParsedName(){
|
||||||
|
return name.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JavaClassName definingClass(){
|
||||||
|
return name.getParentClass();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ASTVisitor visitor) {
|
public void accept(ASTVisitor visitor) {
|
||||||
visitor.visit(this);
|
visitor.visit(this);
|
||||||
|
4
src/de/dhbwstuttgart/syntaxtree/Method.java
Executable file → Normal file
4
src/de/dhbwstuttgart/syntaxtree/Method.java
Executable file → Normal file
@ -22,14 +22,14 @@ import de.dhbwstuttgart.syntaxtree.statement.Block;
|
|||||||
* @author janulrich
|
* @author janulrich
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class Method extends Field implements IItemWithOffset, TypeScope
|
public class Method extends Field implements IItemWithOffset
|
||||||
{
|
{
|
||||||
public final Block block;
|
public final Block block;
|
||||||
private ParameterList parameterlist = new ParameterList(new ArrayList<>(), new NullToken());
|
private ParameterList parameterlist = new ParameterList(new ArrayList<>(), new NullToken());
|
||||||
private ExceptionList exceptionlist;
|
private ExceptionList exceptionlist;
|
||||||
private GenericDeclarationList generics;
|
private GenericDeclarationList generics;
|
||||||
|
|
||||||
public Method(String name, RefTypeOrTPHOrWildcardOrGeneric returnType, int modifiers, ParameterList parameterList, Block block,
|
public Method(int modifier, String name, RefTypeOrTPHOrWildcardOrGeneric returnType, int modifiers, ParameterList parameterList, Block block,
|
||||||
GenericDeclarationList gtvDeclarations, Token offset) {
|
GenericDeclarationList gtvDeclarations, Token offset) {
|
||||||
super(name, returnType, modifiers, offset);
|
super(name, returnType, modifiers, offset);
|
||||||
this.parameterlist = parameterList;
|
this.parameterlist = parameterList;
|
||||||
|
0
src/de/dhbwstuttgart/syntaxtree/ParameterList.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/ParameterList.java
Executable file → Normal file
6
src/de/dhbwstuttgart/syntaxtree/SourceFile.java
Executable file → Normal file
6
src/de/dhbwstuttgart/syntaxtree/SourceFile.java
Executable file → Normal file
@ -13,13 +13,13 @@ public class SourceFile extends SyntaxTreeNode{
|
|||||||
private String pkgName;
|
private String pkgName;
|
||||||
|
|
||||||
public final List<ClassOrInterface> KlassenVektor;
|
public final List<ClassOrInterface> KlassenVektor;
|
||||||
public final List<JavaClassName> imports;
|
public final Set<JavaClassName> imports;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Die SourceFile repräsntiert eine zu einem Syntaxbaum eingelesene Java-Datei.
|
* Die SourceFile repräsntiert eine zu einem Syntaxbaum eingelesene Java-Datei.
|
||||||
* SourceFile stellt dabei den Wurzelknoten des Syntaxbaumes dar.
|
* SourceFile stellt dabei den Wurzelknoten des Syntaxbaumes dar.
|
||||||
*/
|
*/
|
||||||
public SourceFile(String pkgName, List<ClassOrInterface> classDefinitions, List<JavaClassName> imports){
|
public SourceFile(String pkgName, List<ClassOrInterface> classDefinitions, Set<JavaClassName> imports){
|
||||||
super(new NullToken());
|
super(new NullToken());
|
||||||
this.KlassenVektor = classDefinitions;
|
this.KlassenVektor = classDefinitions;
|
||||||
this.pkgName = pkgName;
|
this.pkgName = pkgName;
|
||||||
@ -31,7 +31,7 @@ public class SourceFile extends SyntaxTreeNode{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get imports (to test implementation)
|
// Get imports (to test implementation)
|
||||||
public List<JavaClassName> getImports(){
|
public Set<JavaClassName> getImports(){
|
||||||
return this.imports;
|
return this.imports;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,8 +40,6 @@ public interface StatementVisitor {
|
|||||||
|
|
||||||
void visit(NewArray newArray);
|
void visit(NewArray newArray);
|
||||||
|
|
||||||
void visit(Receiver receiver);
|
|
||||||
|
|
||||||
void visit(Return aReturn);
|
void visit(Return aReturn);
|
||||||
|
|
||||||
void visit(ReturnVoid aReturn);
|
void visit(ReturnVoid aReturn);
|
||||||
@ -67,4 +65,6 @@ public interface StatementVisitor {
|
|||||||
void visit(AssignToLocal assignLeftSide);
|
void visit(AssignToLocal assignLeftSide);
|
||||||
|
|
||||||
void visit(SuperCall superCall);
|
void visit(SuperCall superCall);
|
||||||
|
|
||||||
|
void visit(ExpressionReceiver expressionReceiver);
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@ package de.dhbwstuttgart.syntaxtree;
|
|||||||
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
|
||||||
public interface TypeScope {
|
public interface TypeScope {
|
||||||
Iterable<? extends GenericTypeVar> getGenerics();
|
Iterable<? extends GenericTypeVar> getGenerics();
|
||||||
|
@ -5,6 +5,7 @@ import java.lang.reflect.Constructor;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.GenericContext;
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.GenericContext;
|
||||||
import de.dhbwstuttgart.parser.scope.GenericTypeName;
|
import de.dhbwstuttgart.parser.scope.GenericTypeName;
|
||||||
@ -45,7 +46,11 @@ public class ASTFactory {
|
|||||||
java.lang.Class superjreClass = jreClass.getSuperclass();
|
java.lang.Class superjreClass = jreClass.getSuperclass();
|
||||||
RefType superClass;
|
RefType superClass;
|
||||||
if(superjreClass != null){
|
if(superjreClass != null){
|
||||||
superClass = (RefType) createType(superjreClass, name, "");
|
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
||||||
|
for(TypeVariable tv : superjreClass.getTypeParameters()){
|
||||||
|
params.add(new RefType(new GenericTypeName(new GenericContext( name, null),tv.getName()), new NullToken()));
|
||||||
|
}
|
||||||
|
superClass = new RefType(new JavaClassName(superjreClass.getName()), params, new NullToken());
|
||||||
}else{//Jede Klasse und jedes Interface erbt von Object: (auch Object selbst!)
|
}else{//Jede Klasse und jedes Interface erbt von Object: (auch Object selbst!)
|
||||||
superClass = (RefType) createType(java.lang.Object.class, name, "");
|
superClass = (RefType) createType(java.lang.Object.class, name, "");
|
||||||
}
|
}
|
||||||
@ -83,13 +88,12 @@ public class ASTFactory {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new de.dhbwstuttgart.syntaxtree.Constructor(name,returnType, modifier, parameterList, block, gtvDeclarations, offset, new ArrayList<>(),
|
return new de.dhbwstuttgart.syntaxtree.Constructor(constructor.getModifiers(), name,returnType, modifier, parameterList, block, gtvDeclarations, offset, new ArrayList<>());
|
||||||
createType(inClass.getSuperclass()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static RefType createType(Class classType) {
|
//private static RefType createType(Class classType) {
|
||||||
return createClass(classType).getType();
|
// return createClass(classType).getType();
|
||||||
}
|
//}
|
||||||
|
|
||||||
public static Method createMethod(java.lang.reflect.Method jreMethod, java.lang.Class inClass){
|
public static Method createMethod(java.lang.reflect.Method jreMethod, java.lang.Class inClass){
|
||||||
String name = jreMethod.getName();
|
String name = jreMethod.getName();
|
||||||
@ -107,7 +111,7 @@ public class ASTFactory {
|
|||||||
Token offset = new NullToken();
|
Token offset = new NullToken();
|
||||||
int modifier = jreMethod.getModifiers();
|
int modifier = jreMethod.getModifiers();
|
||||||
|
|
||||||
return new Method(name,returnType, modifier, parameterList, block, gtvDeclarations, offset);
|
return new Method(jreMethod.getModifiers(), name,returnType, modifier, parameterList, block, gtvDeclarations, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GenericDeclarationList createGenerics(TypeVariable[] typeParameters, Class context, String methodName){
|
public static GenericDeclarationList createGenerics(TypeVariable[] typeParameters, Class context, String methodName){
|
||||||
@ -182,6 +186,9 @@ public class ASTFactory {
|
|||||||
public static ClassOrInterface createObjectClass() {
|
public static ClassOrInterface createObjectClass() {
|
||||||
return createClass(Object.class);
|
return createClass(Object.class);
|
||||||
}
|
}
|
||||||
|
public static RefType createObjectType() {
|
||||||
|
return new RefType(createClass(Object.class).getClassName(), new NullToken());
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public Constructor createEmptyConstructor(Class parent){
|
public Constructor createEmptyConstructor(Class parent){
|
||||||
|
@ -3,41 +3,91 @@ package de.dhbwstuttgart.syntaxtree.factory;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.exceptions.DebugException;
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.GenericTypeVar;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.*;
|
import de.dhbwstuttgart.syntaxtree.type.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.Void;
|
import de.dhbwstuttgart.syntaxtree.type.Void;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.WildcardType;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
||||||
import de.dhbwstuttgart.typeinference.result.PairTPHequalRefType;
|
import de.dhbwstuttgart.typeinference.result.PairTPHEqualTPH;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.PairTPHequalRefTypeOrWildcardType;
|
||||||
import de.dhbwstuttgart.typeinference.result.PairTPHsmallerTPH;
|
import de.dhbwstuttgart.typeinference.result.PairTPHsmallerTPH;
|
||||||
import de.dhbwstuttgart.typeinference.result.ResultPair;
|
import de.dhbwstuttgart.typeinference.result.ResultPair;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
|
import de.dhbwstuttgart.typeinference.unify.model.*;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
|
|
||||||
|
|
||||||
|
|
||||||
public class UnifyTypeFactory {
|
public class UnifyTypeFactory {
|
||||||
|
|
||||||
public static FiniteClosure generateFC(List<ClassOrInterface> fromAvailableClasses){
|
public static FiniteClosure generateFC(List<ClassOrInterface> fromClasses) throws ClassNotFoundException {
|
||||||
|
/*
|
||||||
|
TODO: Generics werden zu TPHs
|
||||||
|
Die transitive Hülle muss funktionieren.
|
||||||
|
Man darf schreiben List<A> extends AL<A>
|
||||||
|
und Vector<B> extends List<B>
|
||||||
|
hier muss dann aber dennoch die Vererbung V < L < AL
|
||||||
|
hergestellt werden.
|
||||||
|
In einem solchen Vererbungsbaum dürfen die TPH auch die gleichen Namen haben.
|
||||||
|
Generell dürfen sie immer die gleichen Namen haben.
|
||||||
|
TODO: die transitive Hülle bilden
|
||||||
|
*/
|
||||||
HashSet<UnifyPair> pairs = new HashSet<>();
|
HashSet<UnifyPair> pairs = new HashSet<>();
|
||||||
for(ClassOrInterface cl : fromAvailableClasses){
|
for(ClassOrInterface cly : fromClasses){
|
||||||
UnifyType t1 = UnifyTypeFactory.convert(cl.getType());
|
pairs.addAll(getSuperTypes(cly, fromClasses));
|
||||||
UnifyType t2 = UnifyTypeFactory.convert(cl.getSuperClass());
|
|
||||||
pairs.add(generateSmallerPair(t1, t2));
|
|
||||||
}
|
}
|
||||||
return new FiniteClosure(pairs);
|
return new FiniteClosure(pairs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bildet eine Kette vom übergebenen Typ bis hin zum höchsten bekannten Typ
|
||||||
|
* Als Generics werden TPHs benutzt, welche der Unifikationsalgorithmus korrekt interpretieren muss.
|
||||||
|
* Die verwendeten TPHs werden in der Kette nach oben gereicht, so erhält der selbe GTV immer den selben TPH
|
||||||
|
* @param forType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static List<UnifyPair> getSuperTypes(ClassOrInterface forType, List<ClassOrInterface> availableClasses) throws ClassNotFoundException {
|
||||||
|
return getSuperTypes(forType, availableClasses, new HashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<UnifyPair> getSuperTypes(ClassOrInterface forType, List<ClassOrInterface> availableClasses, HashMap<String, PlaceholderType> gtvs) throws ClassNotFoundException {
|
||||||
|
List<UnifyType> params = new ArrayList<>();
|
||||||
|
//Generics mit gleichem Namen müssen den selben TPH bekommen
|
||||||
|
for(GenericTypeVar gtv : forType.getGenerics()){
|
||||||
|
if(!gtvs.containsKey(gtv.getParsedName()))
|
||||||
|
gtvs.put(gtv.getParsedName(), PlaceholderType.freshPlaceholder());
|
||||||
|
params.add(gtvs.get(gtv.getParsedName()));
|
||||||
|
}
|
||||||
|
Optional<ClassOrInterface> hasSuperclass = availableClasses.stream().filter(cl -> forType.getSuperClass().getName().equals(cl.getClassName())).findAny();
|
||||||
|
ClassOrInterface superClass;
|
||||||
|
if(!hasSuperclass.isPresent()) //TODO: Wenn es die Object-Klasse ist, dann ist es in Ordnung, ansonsten Fehler ausgeben:
|
||||||
|
{
|
||||||
|
superClass = ASTFactory.createClass(ClassLoader.getSystemClassLoader().loadClass(forType.getSuperClass().getName().toString()));
|
||||||
|
}else{
|
||||||
|
superClass = hasSuperclass.get();
|
||||||
|
}
|
||||||
|
List<UnifyPair> superTypes;
|
||||||
|
if(superClass.getClassName().equals(ASTFactory.createObjectClass().getClassName())){
|
||||||
|
superTypes = Arrays.asList(generateSmallerPair(convert(ASTFactory.createObjectType()), convert(ASTFactory.createObjectType())));
|
||||||
|
}else{
|
||||||
|
superTypes = getSuperTypes(superClass, availableClasses, gtvs);
|
||||||
|
}
|
||||||
|
|
||||||
|
TypeParams paramList = new TypeParams(params);
|
||||||
|
UnifyType t1 = new ReferenceType(forType.getClassName().toString(), paramList);
|
||||||
|
UnifyType t2 = superTypes.get(0).getLhsType();
|
||||||
|
|
||||||
|
UnifyPair ret = generateSmallerPair(t1, t2);
|
||||||
|
List<UnifyPair> retList = new ArrayList<>();
|
||||||
|
retList.add(ret);
|
||||||
|
retList.addAll(superTypes);
|
||||||
|
|
||||||
|
return retList;
|
||||||
|
}
|
||||||
|
|
||||||
public static UnifyPair generateSmallerPair(UnifyType tl, UnifyType tr){
|
public static UnifyPair generateSmallerPair(UnifyType tl, UnifyType tr){
|
||||||
return new UnifyPair(tl, tr, PairOperator.SMALLER);
|
return new UnifyPair(tl, tr, PairOperator.SMALLER);
|
||||||
}
|
}
|
||||||
@ -104,7 +154,7 @@ public class UnifyTypeFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static UnifyType convert(GenericRefType t){
|
public static UnifyType convert(GenericRefType t){
|
||||||
return new ReferenceType(t.getUniqueIdentifier());
|
return new ReferenceType(t.getParsedName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UnifyType convert(WildcardType t){
|
public static UnifyType convert(WildcardType t){
|
||||||
@ -120,6 +170,10 @@ public class UnifyTypeFactory {
|
|||||||
return constraints.map(UnifyTypeFactory::convert);
|
return constraints.map(UnifyTypeFactory::convert);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Constraint<UnifyPair> convert(Constraint<Pair> constraint){
|
||||||
|
return constraint.stream().map(UnifyTypeFactory::convert).collect(Collectors.toCollection(Constraint::new));
|
||||||
|
}
|
||||||
|
|
||||||
public static UnifyPair convert(Pair p) {
|
public static UnifyPair convert(Pair p) {
|
||||||
if(p.GetOperator().equals(PairOperator.SMALLERDOT)) {
|
if(p.GetOperator().equals(PairOperator.SMALLERDOT)) {
|
||||||
UnifyPair ret = generateSmallerDotPair(UnifyTypeFactory.convert(p.TA1)
|
UnifyPair ret = generateSmallerDotPair(UnifyTypeFactory.convert(p.TA1)
|
||||||
@ -146,8 +200,20 @@ public class UnifyTypeFactory {
|
|||||||
RefTypeOrTPHOrWildcardOrGeneric tl = UnifyTypeFactory.convert(mp.getLhsType(), tphs);
|
RefTypeOrTPHOrWildcardOrGeneric tl = UnifyTypeFactory.convert(mp.getLhsType(), tphs);
|
||||||
RefTypeOrTPHOrWildcardOrGeneric tr = UnifyTypeFactory.convert(mp.getRhsType(), tphs);
|
RefTypeOrTPHOrWildcardOrGeneric tr = UnifyTypeFactory.convert(mp.getRhsType(), tphs);
|
||||||
if(tl instanceof TypePlaceholder){
|
if(tl instanceof TypePlaceholder){
|
||||||
if(tr instanceof TypePlaceholder) return new PairTPHsmallerTPH((TypePlaceholder)tl, (TypePlaceholder)tr);
|
if(tr instanceof TypePlaceholder) {
|
||||||
return new PairTPHequalRefType((TypePlaceholder)tl, tr);
|
|
||||||
|
if(mp.getPairOp().equals(PairOperator.EQUALSDOT)) {
|
||||||
|
return new PairTPHEqualTPH((TypePlaceholder)tl, (TypePlaceholder)tr);
|
||||||
|
//Einfach ignorieren TODO: Das hier muss ausgebessert werden:
|
||||||
|
//return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder)tl, ASTFactory.createObjectType());
|
||||||
|
}else{
|
||||||
|
return new PairTPHsmallerTPH((TypePlaceholder)tl, (TypePlaceholder)tr);
|
||||||
|
}
|
||||||
|
}else if(tr instanceof RefType){
|
||||||
|
return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder)tl, (RefType) tr);
|
||||||
|
}else if(tr instanceof WildcardType){
|
||||||
|
return new PairTPHequalRefTypeOrWildcardType((TypePlaceholder)tl, (WildcardType) tr);
|
||||||
|
}else throw new NotImplementedException();
|
||||||
}else throw new NotImplementedException();
|
}else throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
src/de/dhbwstuttgart/syntaxtree/statement/ArgumentList.java
Executable file → Normal file
6
src/de/dhbwstuttgart/syntaxtree/statement/ArgumentList.java
Executable file → Normal file
@ -2,6 +2,7 @@ package de.dhbwstuttgart.syntaxtree.statement;
|
|||||||
|
|
||||||
|
|
||||||
import de.dhbwstuttgart.syntaxtree.ASTVisitor;
|
import de.dhbwstuttgart.syntaxtree.ASTVisitor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
|
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
@ -20,8 +21,13 @@ public class ArgumentList extends SyntaxTreeNode
|
|||||||
return expr;
|
return expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ASTVisitor visitor) {
|
public void accept(ASTVisitor visitor) {
|
||||||
visitor.visit(this);
|
visitor.visit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void accept(StatementVisitor visitor) {
|
||||||
|
visitor.visit(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
1
src/de/dhbwstuttgart/syntaxtree/statement/Assign.java
Executable file → Normal file
1
src/de/dhbwstuttgart/syntaxtree/statement/Assign.java
Executable file → Normal file
@ -4,7 +4,6 @@ package de.dhbwstuttgart.syntaxtree.statement;
|
|||||||
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintsFactory;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
|
0
src/de/dhbwstuttgart/syntaxtree/statement/Binary.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/Binary.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/BinaryExpr.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/BinaryExpr.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/Block.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/Block.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/CastExpr.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/CastExpr.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/EmptyStmt.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/EmptyStmt.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/Expression.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/Expression.java
Executable file → Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package de.dhbwstuttgart.syntaxtree.statement;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
|
public class ExpressionReceiver extends Receiver
|
||||||
|
{
|
||||||
|
public final Expression expr;
|
||||||
|
|
||||||
|
public ExpressionReceiver(Expression expr)
|
||||||
|
{
|
||||||
|
super(expr.getType(), expr.getOffset());
|
||||||
|
this.expr = expr;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(StatementVisitor visitor) {
|
||||||
|
visitor.visit(this);
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,6 @@ import de.dhbwstuttgart.typeinference.assumptions.FieldAssumption;
|
|||||||
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintsFactory;
|
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
|
0
src/de/dhbwstuttgart/syntaxtree/statement/ForStmt.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/ForStmt.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/IfStmt.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/IfStmt.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/InstanceOf.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/InstanceOf.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/LambdaExpression.java
Executable file → Normal file
0
src/de/dhbwstuttgart/syntaxtree/statement/LambdaExpression.java
Executable file → Normal file
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user