diff --git a/.idea/.gitignore b/.idea/.gitignore index ebde8d0..2767a57 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -2,4 +2,5 @@ /shelf/ /workspace.xml -.idea/ \ No newline at end of file +.idea/# GitHub Copilot persisted chat sessions +/copilot/chatSessions diff --git a/src/main/java/Compiler.java b/src/main/java/Compiler.java index 8d3fd73..56fb082 100644 --- a/src/main/java/Compiler.java +++ b/src/main/java/Compiler.java @@ -9,6 +9,7 @@ import abstractSyntaxTree.Statement.IStatement; import abstractSyntaxTree.Statement.LocalVarDecl; import abstractSyntaxTree.Statement.ReturnStatement; import abstractSyntaxTree.StatementExpression.AssignStatementExpression; +import astGenerator.ASTGenerator; import gen.DecafLexer; import gen.DecafParser; import org.antlr.v4.runtime.CharStream; @@ -90,15 +91,6 @@ public class Compiler { // System.out.println(refType.name); // } - abstractSyntaxTree.classes.get(1).methodDecls.get(0).codeBlock.returnType = "int"; - List statementsList = abstractSyntaxTree.classes.get(1).methodDecls.get(0).codeBlock.statements; - statementsList.add(new LocalVarDecl("int", "localInt")); - statementsList.add(new LocalVarDecl("bool", "localBool")); - statementsList.add(new LocalVarDecl("char", "localChar")); - statementsList.add(new AssignStatementExpression("=", new LocalVarIdentifier("localInt"), new UnaryExpression("", new IntDatatype()))); - //statementsList.add(new AssignStatementExpression("=", new InstVarExpression(abstractSyntaxTree.classes.get(1)), new UnaryExpression("instVarBool", new BoolDatatype()))); - - abstractSyntaxTree.classes.get(1).methodDecls.get(0).codeBlock.statements.add(new ReturnStatement(new UnaryExpression("", new IntDatatype()))); abstractSyntaxTree.typeCheck(); abstractSyntaxTree.codeGen(); diff --git a/src/main/java/abstractSyntaxTree/Class/MethodDecl.java b/src/main/java/abstractSyntaxTree/Class/MethodDecl.java index 9348e38..3517283 100644 --- a/src/main/java/abstractSyntaxTree/Class/MethodDecl.java +++ b/src/main/java/abstractSyntaxTree/Class/MethodDecl.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Map; import java.util.Stack; -public class MethodDecl implements Node { +public class MethodDecl implements IClass, Node { //Class Name public String classThatContainsMethod; @@ -45,7 +45,10 @@ public class MethodDecl implements Node { return result; } - public void codeGen(ClassWriter cw) throws Exception { + + //Need to get the returnType of the method if it is an object + // methodContext (class, (returnType, (identifier, parameter))) + public void codeGen(ClassWriter cw, HashMap>> methodContext) throws Exception { localVars.put("this", classThatContainsMethod); for (Parameter param : parameters.parameterList) { @@ -54,36 +57,49 @@ public class MethodDecl implements Node { // check if the method is a constructor if (classThatContainsMethod.equals(name) && returnType == null) { - MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", getMethodDescriptor(), null, null); + String descriptor = getMethodDescriptor(methodContext); + + MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", descriptor, null, null); //Call the superclass constructor mv.visitVarInsn(Opcodes.ALOAD, 0); - mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V", false); + + //Load the parameters onto the stack + int localVarIndex = 1; + for (Parameter param : parameters.parameterList) { + String paramType = param.type; + switch(paramType) { + case "int", "boolean", "char" -> mv.visitVarInsn(Opcodes.ILOAD, localVarIndex); + default -> mv.visitVarInsn(Opcodes.ALOAD, localVarIndex); + } + localVarIndex++; + } + mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", descriptor, false); mv.visitCode(); - codeBlock.codeGen(mv, localVars); //TODO: pass the local vars? --> codeGen for block not yet implemented + codeBlock.codeGen(mv, localVars); mv.visitInsn(Opcodes.RETURN); //automatically computed max stack and max locals mv.visitMaxs(0, 0); - mv.visitEnd(); - } else if (name.equals("main")) { //TODO: Check how we distinguish the main method + + } else if (name.equals("main")) { int access = Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC; MethodVisitor mv = cw.visitMethod(access, name, "([Ljava/lang/String;)V", null, null); mv.visitCode(); - codeBlock.codeGen(mv, localVars); //TODO: pass the local vars? --> codeGen for block not yet implemented + codeBlock.codeGen(mv, localVars); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } else { - MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, name, getMethodDescriptor(), null, null); + MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, name, getMethodDescriptor(methodContext), null, null); mv.visitCode(); - codeBlock.codeGen(mv, localVars); //TODO: pass the local vars? --> codeGen for block not yet implemented + codeBlock.codeGen(mv, localVars); // We have to check the return type to get the return opcode // For methods which return an actual value, the return opcode is created in the method body to ensure the @@ -95,7 +111,7 @@ public class MethodDecl implements Node { } } - private String getMethodDescriptor() { + private String getMethodDescriptor(HashMap>> methodContext) { // get the method descriptor StringBuilder descriptor = new StringBuilder("("); @@ -106,17 +122,18 @@ public class MethodDecl implements Node { case "boolean" -> descriptor.append("Z"); case "char" -> descriptor.append("C"); case "void" -> descriptor.append("V"); - default -> + default -> { // object - //TODO: This is not finished - descriptor.append("L").append(param.type).append(";"); + //TODO: This is not finished for objects --> classes and methods + if (returnType != null) descriptor.append("L").append(returnType).append(";"); + } } } descriptor.append(")"); // Get the return type - // If the return type is null, it is a constructor and we need to append V + // If the return type is null, it is a constructor, and we need to append V if (returnType == null) { descriptor.append("V"); } else { @@ -125,12 +142,20 @@ public class MethodDecl implements Node { case "boolean" -> descriptor.append("Z"); case "char" -> descriptor.append("C"); case "void" -> descriptor.append("V"); - - //TODO: This is not finished --> we need to append the fully qualified name of the object - // Need to make sure what we get - default -> + default -> { // object - descriptor.append("L").append(returnType).append(";"); + HashMap> classMethods = methodContext.get(classThatContainsMethod); + HashMap methodDetails = classMethods.get(name); + + String fullReturnType = null; + for (Map.Entry entry : methodDetails.entrySet()) { + fullReturnType = entry.getKey(); + } + // If it is a class reference replace the "." with "/" and return it + if (returnType.contains(".")) fullReturnType = fullReturnType.replaceAll("\\.", "/"); + + if (fullReturnType != null) descriptor.append("L").append(fullReturnType).append(";"); + } } } return descriptor.toString(); diff --git a/src/main/java/abstractSyntaxTree/Class/RefType.java b/src/main/java/abstractSyntaxTree/Class/RefType.java index 83ef3a2..68b139c 100644 --- a/src/main/java/abstractSyntaxTree/Class/RefType.java +++ b/src/main/java/abstractSyntaxTree/Class/RefType.java @@ -3,7 +3,6 @@ package abstractSyntaxTree.Class; import TypeCheck.AbstractType; import TypeCheck.TypeCheckResult; import abstractSyntaxTree.Node; -import abstractSyntaxTree.Parameter.ParameterList; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; @@ -30,7 +29,7 @@ public class RefType extends AbstractType implements Node { this.hasMain = hasMain; } - public TypeCheckResult typeCheck(HashMap>> methodContext, + public TypeCheckResult typeCheck(HashMap>>> methodContext, HashMap> typeContext) throws Exception { TypeCheckResult result = new TypeCheckResult(); @@ -74,7 +73,7 @@ public class RefType extends AbstractType implements Node { // Method for code generation which iterates over all the field declarations // and method declarations and calls their CodeGen methods - public void codeGen(ClassWriter cw) throws Exception { + public void codeGen(ClassWriter cw, HashMap>> methodContext) throws Exception { cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, "java/lang/Object", null); diff --git a/src/main/java/abstractSyntaxTree/Program.java b/src/main/java/abstractSyntaxTree/Program.java index 95ba437..e09bac6 100644 --- a/src/main/java/abstractSyntaxTree/Program.java +++ b/src/main/java/abstractSyntaxTree/Program.java @@ -20,7 +20,7 @@ import java.util.jar.JarOutputStream; public class Program implements Node { public List classes; public HashMap> typeContext; // (class, (type, identifier)) - public HashMap>> methodContext; // (class, (returntype, (identifier, parameter))) + public HashMap>> methodContext; // (class, (returntype, (identifier, parameterList))) public Program(List classes){ this.classes = classes; @@ -41,11 +41,11 @@ public class Program implements Node { typeContext.put(oneClass.name, classVars); // build method context - HashMap methodIdentifierAndParameter = new HashMap<>(); - HashMap> returnTypeAndMethod = new HashMap<>(); + HashMap> methodIdentifierAndParameter = new HashMap<>(); + HashMap>> returnTypeAndMethod = new HashMap<>(); for (MethodDecl methodDecl : oneClass.methodDecls){ - methodIdentifierAndParameter.put(methodDecl.name, methodDecl.parameters); + methodIdentifierAndParameter.put(methodDecl.name, (List) methodDecl.parameters); returnTypeAndMethod.put(methodDecl.returnType, methodIdentifierAndParameter); } methodContext.put(oneClass.name, returnTypeAndMethod); @@ -66,7 +66,7 @@ public class Program implements Node { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, oneClass.name, null, "java/lang/Object", null); - oneClass.codeGen(cw); + oneClass.codeGen(cw, methodContext); cw.visitEnd(); byte[] bytecode = cw.toByteArray(); diff --git a/src/main/java/ASTGenerator.java b/src/main/java/astGenerator/ASTGenerator.java similarity index 73% rename from src/main/java/ASTGenerator.java rename to src/main/java/astGenerator/ASTGenerator.java index 8629671..24e582f 100644 --- a/src/main/java/ASTGenerator.java +++ b/src/main/java/astGenerator/ASTGenerator.java @@ -1,3 +1,5 @@ +package astGenerator; + import abstractSyntaxTree.Class.FieldDecl; import abstractSyntaxTree.Class.MethodDecl; import abstractSyntaxTree.Class.RefType; @@ -7,6 +9,7 @@ import abstractSyntaxTree.Parameter.Parameter; import abstractSyntaxTree.Parameter.ParameterList; import abstractSyntaxTree.Program; import abstractSyntaxTree.Statement.*; +import abstractSyntaxTree.StatementExpression.AssignStatementExpression; import gen.DecafBaseVisitor; import gen.DecafParser; @@ -31,6 +34,7 @@ public class ASTGenerator extends DecafBaseVisitor { boolean hasMain; if(ctx.MainMethodDecl() != null) { hasMain = true; + MethodDecl mainMethod = new MethodDecl(name, "void", "main", new ParameterList(new ArrayList<>()), new BlockStatement(new ArrayList<>(), "void")); } else { hasMain = false; } @@ -66,13 +70,14 @@ public class ASTGenerator extends DecafBaseVisitor { public Node visitMethodDecl(DecafParser.MethodDeclContext ctx) { String type; String name = ctx.Identifier().getText(); + BlockStatement block = (BlockStatement) visitBlock(ctx.block()); ParameterList parameterList = (ParameterList) visit(ctx.parameterList()); if (ctx.Void() != null) { type = "void"; } else { type = ctx.type().getText(); } - return new MethodDecl("", type , name, parameterList, new BlockStatement(new ArrayList<>(), "void")); + return new MethodDecl("", type , name, parameterList, block); } @Override @@ -101,6 +106,8 @@ public class ASTGenerator extends DecafBaseVisitor { return visitBlock(ctx.block()); } else if (ctx.stmtExpr() != null) { return visitStmtExpr(ctx.stmtExpr()); + } else if (ctx.emptyStatement() != null) { + return visitEmptyStatement(ctx.emptyStatement()); } return null; } @@ -110,6 +117,16 @@ public class ASTGenerator extends DecafBaseVisitor { return new ReturnStatement(new BinaryExpression()); } + @Override + public Node visitBlock(DecafParser.BlockContext ctx) { + List stmts = new ArrayList<>(); + for (DecafParser.StatementContext stmt: ctx.statement()) { + Node statement = visitStatement(stmt); + stmts.add((IStatement) statement); + } + return new BlockStatement(stmts, "void"); + } + @Override public Node visitIfElseStmt(DecafParser.IfElseStmtContext ctx) { if (ctx.elseStmt() != null) { @@ -132,4 +149,37 @@ public class ASTGenerator extends DecafBaseVisitor { Node statement = visitStatement(ctx.statement()); return new WhileStatement(new BinaryExpression(), (IStatement) statement); } + + @Override + public Node visitEmptyStatement(DecafParser.EmptyStatementContext ctx) { + return new EmptyStatement(); + } + + @Override + public Node visitStmtExpr(DecafParser.StmtExprContext ctx) { + if (ctx.assign() != null) { + return visitAssign(ctx.assign()); + } else if (ctx.methodCall() != null) { + return visitMethodCall(ctx.methodCall()); + } else if (ctx.newDecl() != null) { + return visitNewDecl(ctx.newDecl()); + } + return null; + } + + + @Override + public Node visitAssign(DecafParser.AssignContext ctx) { + return new AssignStatementExpression(); + } + + @Override + public Node visitMethodCall(DecafParser.MethodCallContext ctx) { + return super.visitMethodCall(ctx); + } + + @Override + public Node visitNewDecl(DecafParser.NewDeclContext ctx) { + return super.visitNewDecl(ctx); + } } diff --git a/src/main/java/gen/Decaf.interp b/src/main/java/gen/Decaf.interp index 216c5a2..7e784ba 100644 --- a/src/main/java/gen/Decaf.interp +++ b/src/main/java/gen/Decaf.interp @@ -127,9 +127,10 @@ assign newDecl receiver receivingMethod +emptyStatement type value atn: -[4, 1, 45, 327, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 1, 0, 4, 0, 70, 8, 0, 11, 0, 12, 0, 71, 1, 1, 3, 1, 75, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 83, 8, 1, 10, 1, 12, 1, 86, 9, 1, 1, 1, 1, 1, 3, 1, 90, 8, 1, 1, 1, 1, 1, 1, 2, 3, 2, 95, 8, 2, 1, 2, 1, 2, 1, 2, 3, 2, 100, 8, 2, 1, 2, 1, 2, 1, 2, 1, 3, 3, 3, 106, 8, 3, 1, 3, 1, 3, 3, 3, 110, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 115, 8, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 5, 4, 123, 8, 4, 10, 4, 12, 4, 126, 9, 4, 1, 5, 1, 5, 1, 5, 1, 6, 3, 6, 132, 8, 6, 1, 6, 1, 6, 1, 6, 4, 6, 137, 8, 6, 11, 6, 12, 6, 138, 3, 6, 141, 8, 6, 1, 7, 1, 7, 3, 7, 145, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 154, 8, 8, 1, 9, 3, 9, 157, 8, 9, 1, 9, 5, 9, 160, 8, 9, 10, 9, 12, 9, 163, 9, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 182, 8, 10, 1, 11, 1, 11, 1, 11, 3, 11, 187, 8, 11, 1, 12, 1, 12, 3, 12, 191, 8, 12, 1, 13, 1, 13, 1, 13, 3, 13, 196, 8, 13, 1, 13, 1, 13, 1, 14, 3, 14, 201, 8, 14, 1, 14, 5, 14, 204, 8, 14, 10, 14, 12, 14, 207, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 216, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 224, 8, 16, 10, 16, 12, 16, 227, 9, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 235, 8, 17, 10, 17, 12, 17, 238, 9, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 248, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 258, 8, 21, 1, 22, 3, 22, 261, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 267, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 5, 23, 273, 8, 23, 10, 23, 12, 23, 276, 9, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 288, 8, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 313, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 0, 2, 32, 34, 34, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 0, 3, 1, 0, 11, 12, 2, 0, 6, 8, 44, 44, 2, 0, 1, 2, 42, 43, 342, 0, 69, 1, 0, 0, 0, 2, 74, 1, 0, 0, 0, 4, 94, 1, 0, 0, 0, 6, 105, 1, 0, 0, 0, 8, 119, 1, 0, 0, 0, 10, 127, 1, 0, 0, 0, 12, 140, 1, 0, 0, 0, 14, 144, 1, 0, 0, 0, 16, 153, 1, 0, 0, 0, 18, 156, 1, 0, 0, 0, 20, 181, 1, 0, 0, 0, 22, 186, 1, 0, 0, 0, 24, 190, 1, 0, 0, 0, 26, 195, 1, 0, 0, 0, 28, 200, 1, 0, 0, 0, 30, 215, 1, 0, 0, 0, 32, 217, 1, 0, 0, 0, 34, 228, 1, 0, 0, 0, 36, 247, 1, 0, 0, 0, 38, 249, 1, 0, 0, 0, 40, 253, 1, 0, 0, 0, 42, 255, 1, 0, 0, 0, 44, 260, 1, 0, 0, 0, 46, 270, 1, 0, 0, 0, 48, 279, 1, 0, 0, 0, 50, 285, 1, 0, 0, 0, 52, 289, 1, 0, 0, 0, 54, 295, 1, 0, 0, 0, 56, 298, 1, 0, 0, 0, 58, 302, 1, 0, 0, 0, 60, 312, 1, 0, 0, 0, 62, 316, 1, 0, 0, 0, 64, 322, 1, 0, 0, 0, 66, 324, 1, 0, 0, 0, 68, 70, 3, 2, 1, 0, 69, 68, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 69, 1, 0, 0, 0, 71, 72, 1, 0, 0, 0, 72, 1, 1, 0, 0, 0, 73, 75, 5, 3, 0, 0, 74, 73, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 1, 0, 0, 0, 76, 77, 5, 35, 0, 0, 77, 78, 5, 44, 0, 0, 78, 84, 5, 31, 0, 0, 79, 83, 3, 4, 2, 0, 80, 83, 3, 44, 22, 0, 81, 83, 3, 6, 3, 0, 82, 79, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 81, 1, 0, 0, 0, 83, 86, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 84, 85, 1, 0, 0, 0, 85, 89, 1, 0, 0, 0, 86, 84, 1, 0, 0, 0, 87, 88, 5, 4, 0, 0, 88, 90, 3, 46, 23, 0, 89, 87, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 91, 1, 0, 0, 0, 91, 92, 5, 32, 0, 0, 92, 3, 1, 0, 0, 0, 93, 95, 5, 3, 0, 0, 94, 93, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 97, 5, 44, 0, 0, 97, 99, 5, 29, 0, 0, 98, 100, 3, 8, 4, 0, 99, 98, 1, 0, 0, 0, 99, 100, 1, 0, 0, 0, 100, 101, 1, 0, 0, 0, 101, 102, 5, 30, 0, 0, 102, 103, 3, 46, 23, 0, 103, 5, 1, 0, 0, 0, 104, 106, 5, 3, 0, 0, 105, 104, 1, 0, 0, 0, 105, 106, 1, 0, 0, 0, 106, 109, 1, 0, 0, 0, 107, 110, 3, 64, 32, 0, 108, 110, 5, 5, 0, 0, 109, 107, 1, 0, 0, 0, 109, 108, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 112, 5, 44, 0, 0, 112, 114, 5, 29, 0, 0, 113, 115, 3, 8, 4, 0, 114, 113, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 5, 30, 0, 0, 117, 118, 3, 46, 23, 0, 118, 7, 1, 0, 0, 0, 119, 124, 3, 10, 5, 0, 120, 121, 5, 34, 0, 0, 121, 123, 3, 10, 5, 0, 122, 120, 1, 0, 0, 0, 123, 126, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 9, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 127, 128, 3, 64, 32, 0, 128, 129, 5, 44, 0, 0, 129, 11, 1, 0, 0, 0, 130, 132, 3, 14, 7, 0, 131, 130, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 141, 1, 0, 0, 0, 133, 136, 3, 14, 7, 0, 134, 135, 5, 34, 0, 0, 135, 137, 3, 14, 7, 0, 136, 134, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 141, 1, 0, 0, 0, 140, 131, 1, 0, 0, 0, 140, 133, 1, 0, 0, 0, 141, 13, 1, 0, 0, 0, 142, 145, 3, 16, 8, 0, 143, 145, 3, 30, 15, 0, 144, 142, 1, 0, 0, 0, 144, 143, 1, 0, 0, 0, 145, 15, 1, 0, 0, 0, 146, 154, 5, 36, 0, 0, 147, 154, 3, 24, 12, 0, 148, 154, 3, 22, 11, 0, 149, 150, 5, 29, 0, 0, 150, 151, 3, 16, 8, 0, 151, 152, 5, 30, 0, 0, 152, 154, 1, 0, 0, 0, 153, 146, 1, 0, 0, 0, 153, 147, 1, 0, 0, 0, 153, 148, 1, 0, 0, 0, 153, 149, 1, 0, 0, 0, 154, 17, 1, 0, 0, 0, 155, 157, 3, 60, 30, 0, 156, 155, 1, 0, 0, 0, 156, 157, 1, 0, 0, 0, 157, 161, 1, 0, 0, 0, 158, 160, 3, 62, 31, 0, 159, 158, 1, 0, 0, 0, 160, 163, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 164, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 164, 165, 5, 44, 0, 0, 165, 166, 5, 29, 0, 0, 166, 167, 3, 12, 6, 0, 167, 168, 5, 30, 0, 0, 168, 19, 1, 0, 0, 0, 169, 170, 3, 42, 21, 0, 170, 171, 5, 33, 0, 0, 171, 182, 1, 0, 0, 0, 172, 173, 3, 44, 22, 0, 173, 174, 5, 33, 0, 0, 174, 182, 1, 0, 0, 0, 175, 182, 3, 46, 23, 0, 176, 182, 3, 48, 24, 0, 177, 182, 3, 50, 25, 0, 178, 179, 3, 22, 11, 0, 179, 180, 5, 33, 0, 0, 180, 182, 1, 0, 0, 0, 181, 169, 1, 0, 0, 0, 181, 172, 1, 0, 0, 0, 181, 175, 1, 0, 0, 0, 181, 176, 1, 0, 0, 0, 181, 177, 1, 0, 0, 0, 181, 178, 1, 0, 0, 0, 182, 21, 1, 0, 0, 0, 183, 187, 3, 56, 28, 0, 184, 187, 3, 58, 29, 0, 185, 187, 3, 18, 9, 0, 186, 183, 1, 0, 0, 0, 186, 184, 1, 0, 0, 0, 186, 185, 1, 0, 0, 0, 187, 23, 1, 0, 0, 0, 188, 191, 5, 44, 0, 0, 189, 191, 3, 28, 14, 0, 190, 188, 1, 0, 0, 0, 190, 189, 1, 0, 0, 0, 191, 25, 1, 0, 0, 0, 192, 196, 5, 36, 0, 0, 193, 196, 3, 58, 29, 0, 194, 196, 5, 44, 0, 0, 195, 192, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 195, 194, 1, 0, 0, 0, 196, 197, 1, 0, 0, 0, 197, 198, 5, 28, 0, 0, 198, 27, 1, 0, 0, 0, 199, 201, 3, 26, 13, 0, 200, 199, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 205, 1, 0, 0, 0, 202, 204, 3, 62, 31, 0, 203, 202, 1, 0, 0, 0, 204, 207, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 208, 1, 0, 0, 0, 207, 205, 1, 0, 0, 0, 208, 209, 5, 44, 0, 0, 209, 29, 1, 0, 0, 0, 210, 216, 3, 32, 16, 0, 211, 216, 3, 38, 19, 0, 212, 216, 3, 66, 33, 0, 213, 214, 5, 25, 0, 0, 214, 216, 3, 30, 15, 0, 215, 210, 1, 0, 0, 0, 215, 211, 1, 0, 0, 0, 215, 212, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 216, 31, 1, 0, 0, 0, 217, 218, 6, 16, -1, 0, 218, 219, 3, 34, 17, 0, 219, 225, 1, 0, 0, 0, 220, 221, 10, 2, 0, 0, 221, 222, 5, 10, 0, 0, 222, 224, 3, 34, 17, 0, 223, 220, 1, 0, 0, 0, 224, 227, 1, 0, 0, 0, 225, 223, 1, 0, 0, 0, 225, 226, 1, 0, 0, 0, 226, 33, 1, 0, 0, 0, 227, 225, 1, 0, 0, 0, 228, 229, 6, 17, -1, 0, 229, 230, 3, 36, 18, 0, 230, 236, 1, 0, 0, 0, 231, 232, 10, 2, 0, 0, 232, 233, 5, 9, 0, 0, 233, 235, 3, 36, 18, 0, 234, 231, 1, 0, 0, 0, 235, 238, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 35, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 239, 248, 5, 42, 0, 0, 240, 248, 5, 44, 0, 0, 241, 248, 3, 28, 14, 0, 242, 248, 3, 18, 9, 0, 243, 244, 5, 29, 0, 0, 244, 245, 3, 32, 16, 0, 245, 246, 5, 30, 0, 0, 246, 248, 1, 0, 0, 0, 247, 239, 1, 0, 0, 0, 247, 240, 1, 0, 0, 0, 247, 241, 1, 0, 0, 0, 247, 242, 1, 0, 0, 0, 247, 243, 1, 0, 0, 0, 248, 37, 1, 0, 0, 0, 249, 250, 3, 16, 8, 0, 250, 251, 3, 40, 20, 0, 251, 252, 3, 14, 7, 0, 252, 39, 1, 0, 0, 0, 253, 254, 7, 0, 0, 0, 254, 41, 1, 0, 0, 0, 255, 257, 5, 40, 0, 0, 256, 258, 3, 14, 7, 0, 257, 256, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 43, 1, 0, 0, 0, 259, 261, 5, 3, 0, 0, 260, 259, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 263, 3, 64, 32, 0, 263, 266, 5, 44, 0, 0, 264, 265, 5, 13, 0, 0, 265, 267, 3, 14, 7, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 269, 5, 33, 0, 0, 269, 45, 1, 0, 0, 0, 270, 274, 5, 31, 0, 0, 271, 273, 3, 20, 10, 0, 272, 271, 1, 0, 0, 0, 273, 276, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 277, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 277, 278, 5, 32, 0, 0, 278, 47, 1, 0, 0, 0, 279, 280, 5, 37, 0, 0, 280, 281, 5, 29, 0, 0, 281, 282, 3, 14, 7, 0, 282, 283, 5, 30, 0, 0, 283, 284, 3, 20, 10, 0, 284, 49, 1, 0, 0, 0, 285, 287, 3, 52, 26, 0, 286, 288, 3, 54, 27, 0, 287, 286, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 51, 1, 0, 0, 0, 289, 290, 5, 38, 0, 0, 290, 291, 5, 29, 0, 0, 291, 292, 3, 14, 7, 0, 292, 293, 5, 30, 0, 0, 293, 294, 3, 20, 10, 0, 294, 53, 1, 0, 0, 0, 295, 296, 5, 39, 0, 0, 296, 297, 3, 20, 10, 0, 297, 55, 1, 0, 0, 0, 298, 299, 3, 24, 12, 0, 299, 300, 5, 13, 0, 0, 300, 301, 3, 14, 7, 0, 301, 57, 1, 0, 0, 0, 302, 303, 5, 41, 0, 0, 303, 304, 5, 44, 0, 0, 304, 305, 5, 29, 0, 0, 305, 306, 3, 12, 6, 0, 306, 307, 5, 30, 0, 0, 307, 59, 1, 0, 0, 0, 308, 313, 5, 36, 0, 0, 309, 313, 3, 28, 14, 0, 310, 313, 3, 58, 29, 0, 311, 313, 5, 44, 0, 0, 312, 308, 1, 0, 0, 0, 312, 309, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 312, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 315, 5, 28, 0, 0, 315, 61, 1, 0, 0, 0, 316, 317, 5, 44, 0, 0, 317, 318, 5, 29, 0, 0, 318, 319, 3, 12, 6, 0, 319, 320, 5, 30, 0, 0, 320, 321, 5, 28, 0, 0, 321, 63, 1, 0, 0, 0, 322, 323, 7, 1, 0, 0, 323, 65, 1, 0, 0, 0, 324, 325, 7, 2, 0, 0, 325, 67, 1, 0, 0, 0, 34, 71, 74, 82, 84, 89, 94, 99, 105, 109, 114, 124, 131, 138, 140, 144, 153, 156, 161, 181, 186, 190, 195, 200, 205, 215, 225, 236, 247, 257, 260, 266, 274, 287, 312] \ No newline at end of file +[4, 1, 45, 332, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 1, 0, 4, 0, 72, 8, 0, 11, 0, 12, 0, 73, 1, 1, 3, 1, 77, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 85, 8, 1, 10, 1, 12, 1, 88, 9, 1, 1, 1, 1, 1, 3, 1, 92, 8, 1, 1, 1, 1, 1, 1, 2, 3, 2, 97, 8, 2, 1, 2, 1, 2, 1, 2, 3, 2, 102, 8, 2, 1, 2, 1, 2, 1, 2, 1, 3, 3, 3, 108, 8, 3, 1, 3, 1, 3, 3, 3, 112, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 117, 8, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 5, 4, 125, 8, 4, 10, 4, 12, 4, 128, 9, 4, 1, 5, 1, 5, 1, 5, 1, 6, 3, 6, 134, 8, 6, 1, 6, 1, 6, 1, 6, 4, 6, 139, 8, 6, 11, 6, 12, 6, 140, 3, 6, 143, 8, 6, 1, 7, 1, 7, 3, 7, 147, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 156, 8, 8, 1, 9, 3, 9, 159, 8, 9, 1, 9, 5, 9, 162, 8, 9, 10, 9, 12, 9, 165, 9, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 183, 8, 10, 1, 11, 1, 11, 1, 11, 3, 11, 188, 8, 11, 1, 12, 1, 12, 3, 12, 192, 8, 12, 1, 13, 1, 13, 1, 13, 3, 13, 197, 8, 13, 1, 13, 1, 13, 1, 14, 4, 14, 202, 8, 14, 11, 14, 12, 14, 203, 1, 14, 5, 14, 207, 8, 14, 10, 14, 12, 14, 210, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 219, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 227, 8, 16, 10, 16, 12, 16, 230, 9, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 238, 8, 17, 10, 17, 12, 17, 241, 9, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 251, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 261, 8, 21, 1, 22, 3, 22, 264, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 270, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 5, 23, 276, 8, 23, 10, 23, 12, 23, 279, 9, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 291, 8, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 316, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 0, 2, 32, 34, 35, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 0, 3, 1, 0, 11, 12, 2, 0, 6, 8, 44, 44, 2, 0, 1, 2, 42, 43, 347, 0, 71, 1, 0, 0, 0, 2, 76, 1, 0, 0, 0, 4, 96, 1, 0, 0, 0, 6, 107, 1, 0, 0, 0, 8, 121, 1, 0, 0, 0, 10, 129, 1, 0, 0, 0, 12, 142, 1, 0, 0, 0, 14, 146, 1, 0, 0, 0, 16, 155, 1, 0, 0, 0, 18, 158, 1, 0, 0, 0, 20, 182, 1, 0, 0, 0, 22, 187, 1, 0, 0, 0, 24, 191, 1, 0, 0, 0, 26, 196, 1, 0, 0, 0, 28, 201, 1, 0, 0, 0, 30, 218, 1, 0, 0, 0, 32, 220, 1, 0, 0, 0, 34, 231, 1, 0, 0, 0, 36, 250, 1, 0, 0, 0, 38, 252, 1, 0, 0, 0, 40, 256, 1, 0, 0, 0, 42, 258, 1, 0, 0, 0, 44, 263, 1, 0, 0, 0, 46, 273, 1, 0, 0, 0, 48, 282, 1, 0, 0, 0, 50, 288, 1, 0, 0, 0, 52, 292, 1, 0, 0, 0, 54, 298, 1, 0, 0, 0, 56, 301, 1, 0, 0, 0, 58, 305, 1, 0, 0, 0, 60, 315, 1, 0, 0, 0, 62, 319, 1, 0, 0, 0, 64, 325, 1, 0, 0, 0, 66, 327, 1, 0, 0, 0, 68, 329, 1, 0, 0, 0, 70, 72, 3, 2, 1, 0, 71, 70, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 71, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 1, 1, 0, 0, 0, 75, 77, 5, 3, 0, 0, 76, 75, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 79, 5, 35, 0, 0, 79, 80, 5, 44, 0, 0, 80, 86, 5, 31, 0, 0, 81, 85, 3, 4, 2, 0, 82, 85, 3, 44, 22, 0, 83, 85, 3, 6, 3, 0, 84, 81, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 84, 83, 1, 0, 0, 0, 85, 88, 1, 0, 0, 0, 86, 84, 1, 0, 0, 0, 86, 87, 1, 0, 0, 0, 87, 91, 1, 0, 0, 0, 88, 86, 1, 0, 0, 0, 89, 90, 5, 4, 0, 0, 90, 92, 3, 46, 23, 0, 91, 89, 1, 0, 0, 0, 91, 92, 1, 0, 0, 0, 92, 93, 1, 0, 0, 0, 93, 94, 5, 32, 0, 0, 94, 3, 1, 0, 0, 0, 95, 97, 5, 3, 0, 0, 96, 95, 1, 0, 0, 0, 96, 97, 1, 0, 0, 0, 97, 98, 1, 0, 0, 0, 98, 99, 5, 44, 0, 0, 99, 101, 5, 29, 0, 0, 100, 102, 3, 8, 4, 0, 101, 100, 1, 0, 0, 0, 101, 102, 1, 0, 0, 0, 102, 103, 1, 0, 0, 0, 103, 104, 5, 30, 0, 0, 104, 105, 3, 46, 23, 0, 105, 5, 1, 0, 0, 0, 106, 108, 5, 3, 0, 0, 107, 106, 1, 0, 0, 0, 107, 108, 1, 0, 0, 0, 108, 111, 1, 0, 0, 0, 109, 112, 3, 66, 33, 0, 110, 112, 5, 5, 0, 0, 111, 109, 1, 0, 0, 0, 111, 110, 1, 0, 0, 0, 112, 113, 1, 0, 0, 0, 113, 114, 5, 44, 0, 0, 114, 116, 5, 29, 0, 0, 115, 117, 3, 8, 4, 0, 116, 115, 1, 0, 0, 0, 116, 117, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 119, 5, 30, 0, 0, 119, 120, 3, 46, 23, 0, 120, 7, 1, 0, 0, 0, 121, 126, 3, 10, 5, 0, 122, 123, 5, 34, 0, 0, 123, 125, 3, 10, 5, 0, 124, 122, 1, 0, 0, 0, 125, 128, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 126, 127, 1, 0, 0, 0, 127, 9, 1, 0, 0, 0, 128, 126, 1, 0, 0, 0, 129, 130, 3, 66, 33, 0, 130, 131, 5, 44, 0, 0, 131, 11, 1, 0, 0, 0, 132, 134, 3, 14, 7, 0, 133, 132, 1, 0, 0, 0, 133, 134, 1, 0, 0, 0, 134, 143, 1, 0, 0, 0, 135, 138, 3, 14, 7, 0, 136, 137, 5, 34, 0, 0, 137, 139, 3, 14, 7, 0, 138, 136, 1, 0, 0, 0, 139, 140, 1, 0, 0, 0, 140, 138, 1, 0, 0, 0, 140, 141, 1, 0, 0, 0, 141, 143, 1, 0, 0, 0, 142, 133, 1, 0, 0, 0, 142, 135, 1, 0, 0, 0, 143, 13, 1, 0, 0, 0, 144, 147, 3, 16, 8, 0, 145, 147, 3, 30, 15, 0, 146, 144, 1, 0, 0, 0, 146, 145, 1, 0, 0, 0, 147, 15, 1, 0, 0, 0, 148, 156, 5, 36, 0, 0, 149, 156, 3, 24, 12, 0, 150, 156, 3, 22, 11, 0, 151, 152, 5, 29, 0, 0, 152, 153, 3, 16, 8, 0, 153, 154, 5, 30, 0, 0, 154, 156, 1, 0, 0, 0, 155, 148, 1, 0, 0, 0, 155, 149, 1, 0, 0, 0, 155, 150, 1, 0, 0, 0, 155, 151, 1, 0, 0, 0, 156, 17, 1, 0, 0, 0, 157, 159, 3, 60, 30, 0, 158, 157, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 163, 1, 0, 0, 0, 160, 162, 3, 62, 31, 0, 161, 160, 1, 0, 0, 0, 162, 165, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 163, 164, 1, 0, 0, 0, 164, 166, 1, 0, 0, 0, 165, 163, 1, 0, 0, 0, 166, 167, 5, 44, 0, 0, 167, 168, 5, 29, 0, 0, 168, 169, 3, 12, 6, 0, 169, 170, 5, 30, 0, 0, 170, 19, 1, 0, 0, 0, 171, 172, 3, 42, 21, 0, 172, 173, 5, 33, 0, 0, 173, 183, 1, 0, 0, 0, 174, 183, 3, 44, 22, 0, 175, 183, 3, 46, 23, 0, 176, 183, 3, 48, 24, 0, 177, 183, 3, 50, 25, 0, 178, 179, 3, 22, 11, 0, 179, 180, 5, 33, 0, 0, 180, 183, 1, 0, 0, 0, 181, 183, 3, 64, 32, 0, 182, 171, 1, 0, 0, 0, 182, 174, 1, 0, 0, 0, 182, 175, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 177, 1, 0, 0, 0, 182, 178, 1, 0, 0, 0, 182, 181, 1, 0, 0, 0, 183, 21, 1, 0, 0, 0, 184, 188, 3, 56, 28, 0, 185, 188, 3, 58, 29, 0, 186, 188, 3, 18, 9, 0, 187, 184, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 187, 186, 1, 0, 0, 0, 188, 23, 1, 0, 0, 0, 189, 192, 5, 44, 0, 0, 190, 192, 3, 28, 14, 0, 191, 189, 1, 0, 0, 0, 191, 190, 1, 0, 0, 0, 192, 25, 1, 0, 0, 0, 193, 197, 5, 36, 0, 0, 194, 197, 3, 58, 29, 0, 195, 197, 5, 44, 0, 0, 196, 193, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 196, 195, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 199, 5, 28, 0, 0, 199, 27, 1, 0, 0, 0, 200, 202, 3, 26, 13, 0, 201, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 208, 1, 0, 0, 0, 205, 207, 3, 62, 31, 0, 206, 205, 1, 0, 0, 0, 207, 210, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 211, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 211, 212, 5, 44, 0, 0, 212, 29, 1, 0, 0, 0, 213, 219, 3, 32, 16, 0, 214, 219, 3, 38, 19, 0, 215, 219, 3, 68, 34, 0, 216, 217, 5, 25, 0, 0, 217, 219, 3, 30, 15, 0, 218, 213, 1, 0, 0, 0, 218, 214, 1, 0, 0, 0, 218, 215, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 219, 31, 1, 0, 0, 0, 220, 221, 6, 16, -1, 0, 221, 222, 3, 34, 17, 0, 222, 228, 1, 0, 0, 0, 223, 224, 10, 2, 0, 0, 224, 225, 5, 10, 0, 0, 225, 227, 3, 34, 17, 0, 226, 223, 1, 0, 0, 0, 227, 230, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 33, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 232, 6, 17, -1, 0, 232, 233, 3, 36, 18, 0, 233, 239, 1, 0, 0, 0, 234, 235, 10, 2, 0, 0, 235, 236, 5, 9, 0, 0, 236, 238, 3, 36, 18, 0, 237, 234, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 35, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 251, 5, 42, 0, 0, 243, 251, 5, 44, 0, 0, 244, 251, 3, 28, 14, 0, 245, 251, 3, 18, 9, 0, 246, 247, 5, 29, 0, 0, 247, 248, 3, 32, 16, 0, 248, 249, 5, 30, 0, 0, 249, 251, 1, 0, 0, 0, 250, 242, 1, 0, 0, 0, 250, 243, 1, 0, 0, 0, 250, 244, 1, 0, 0, 0, 250, 245, 1, 0, 0, 0, 250, 246, 1, 0, 0, 0, 251, 37, 1, 0, 0, 0, 252, 253, 3, 16, 8, 0, 253, 254, 3, 40, 20, 0, 254, 255, 3, 14, 7, 0, 255, 39, 1, 0, 0, 0, 256, 257, 7, 0, 0, 0, 257, 41, 1, 0, 0, 0, 258, 260, 5, 40, 0, 0, 259, 261, 3, 14, 7, 0, 260, 259, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 43, 1, 0, 0, 0, 262, 264, 5, 3, 0, 0, 263, 262, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 3, 66, 33, 0, 266, 269, 5, 44, 0, 0, 267, 268, 5, 13, 0, 0, 268, 270, 3, 14, 7, 0, 269, 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 272, 5, 33, 0, 0, 272, 45, 1, 0, 0, 0, 273, 277, 5, 31, 0, 0, 274, 276, 3, 20, 10, 0, 275, 274, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 32, 0, 0, 281, 47, 1, 0, 0, 0, 282, 283, 5, 37, 0, 0, 283, 284, 5, 29, 0, 0, 284, 285, 3, 14, 7, 0, 285, 286, 5, 30, 0, 0, 286, 287, 3, 20, 10, 0, 287, 49, 1, 0, 0, 0, 288, 290, 3, 52, 26, 0, 289, 291, 3, 54, 27, 0, 290, 289, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 51, 1, 0, 0, 0, 292, 293, 5, 38, 0, 0, 293, 294, 5, 29, 0, 0, 294, 295, 3, 14, 7, 0, 295, 296, 5, 30, 0, 0, 296, 297, 3, 20, 10, 0, 297, 53, 1, 0, 0, 0, 298, 299, 5, 39, 0, 0, 299, 300, 3, 20, 10, 0, 300, 55, 1, 0, 0, 0, 301, 302, 3, 24, 12, 0, 302, 303, 5, 13, 0, 0, 303, 304, 3, 14, 7, 0, 304, 57, 1, 0, 0, 0, 305, 306, 5, 41, 0, 0, 306, 307, 5, 44, 0, 0, 307, 308, 5, 29, 0, 0, 308, 309, 3, 12, 6, 0, 309, 310, 5, 30, 0, 0, 310, 59, 1, 0, 0, 0, 311, 316, 5, 36, 0, 0, 312, 316, 3, 28, 14, 0, 313, 316, 3, 58, 29, 0, 314, 316, 5, 44, 0, 0, 315, 311, 1, 0, 0, 0, 315, 312, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 314, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 318, 5, 28, 0, 0, 318, 61, 1, 0, 0, 0, 319, 320, 5, 44, 0, 0, 320, 321, 5, 29, 0, 0, 321, 322, 3, 12, 6, 0, 322, 323, 5, 30, 0, 0, 323, 324, 5, 28, 0, 0, 324, 63, 1, 0, 0, 0, 325, 326, 5, 33, 0, 0, 326, 65, 1, 0, 0, 0, 327, 328, 7, 1, 0, 0, 328, 67, 1, 0, 0, 0, 329, 330, 7, 2, 0, 0, 330, 69, 1, 0, 0, 0, 34, 73, 76, 84, 86, 91, 96, 101, 107, 111, 116, 126, 133, 140, 142, 146, 155, 158, 163, 182, 187, 191, 196, 203, 208, 218, 228, 239, 250, 260, 263, 269, 277, 290, 315] \ No newline at end of file diff --git a/src/main/java/gen/DecafBaseListener.java b/src/main/java/gen/DecafBaseListener.java index 8fe7173..b7e94df 100644 --- a/src/main/java/gen/DecafBaseListener.java +++ b/src/main/java/gen/DecafBaseListener.java @@ -396,6 +396,18 @@ public class DecafBaseListener implements DecafListener { *

The default implementation does nothing.

*/ @Override public void exitReceivingMethod(DecafParser.ReceivingMethodContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEmptyStatement(DecafParser.EmptyStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEmptyStatement(DecafParser.EmptyStatementContext ctx) { } /** * {@inheritDoc} * diff --git a/src/main/java/gen/DecafBaseVisitor.java b/src/main/java/gen/DecafBaseVisitor.java index 7af57fe..938151d 100644 --- a/src/main/java/gen/DecafBaseVisitor.java +++ b/src/main/java/gen/DecafBaseVisitor.java @@ -236,6 +236,13 @@ public class DecafBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitReceivingMethod(DecafParser.ReceivingMethodContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitEmptyStatement(DecafParser.EmptyStatementContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/gen/DecafListener.java b/src/main/java/gen/DecafListener.java index 5e24f01..1009cd4 100644 --- a/src/main/java/gen/DecafListener.java +++ b/src/main/java/gen/DecafListener.java @@ -327,6 +327,16 @@ public interface DecafListener extends ParseTreeListener { * @param ctx the parse tree */ void exitReceivingMethod(DecafParser.ReceivingMethodContext ctx); + /** + * Enter a parse tree produced by {@link DecafParser#emptyStatement}. + * @param ctx the parse tree + */ + void enterEmptyStatement(DecafParser.EmptyStatementContext ctx); + /** + * Exit a parse tree produced by {@link DecafParser#emptyStatement}. + * @param ctx the parse tree + */ + void exitEmptyStatement(DecafParser.EmptyStatementContext ctx); /** * Enter a parse tree produced by {@link DecafParser#type}. * @param ctx the parse tree diff --git a/src/main/java/gen/DecafParser.java b/src/main/java/gen/DecafParser.java index 240e011..e95bd8f 100644 --- a/src/main/java/gen/DecafParser.java +++ b/src/main/java/gen/DecafParser.java @@ -34,7 +34,7 @@ public class DecafParser extends Parser { RULE_nonCalcOperator = 20, RULE_returnStmt = 21, RULE_localVarDecl = 22, RULE_block = 23, RULE_whileStmt = 24, RULE_ifElseStmt = 25, RULE_ifStmt = 26, RULE_elseStmt = 27, RULE_assign = 28, RULE_newDecl = 29, RULE_receiver = 30, - RULE_receivingMethod = 31, RULE_type = 32, RULE_value = 33; + RULE_receivingMethod = 31, RULE_emptyStatement = 32, RULE_type = 33, RULE_value = 34; private static String[] makeRuleNames() { return new String[] { "program", "classdecl", "constuctorDecl", "methodDecl", "parameterList", @@ -42,8 +42,8 @@ public class DecafParser extends Parser { "statement", "stmtExpr", "assignableExpr", "subReceiver", "instVar", "binaryExpr", "calcExpr", "dotExpr", "dotSubExpr", "nonCalcExpr", "nonCalcOperator", "returnStmt", "localVarDecl", "block", "whileStmt", "ifElseStmt", "ifStmt", - "elseStmt", "assign", "newDecl", "receiver", "receivingMethod", "type", - "value" + "elseStmt", "assign", "newDecl", "receiver", "receivingMethod", "emptyStatement", + "type", "value" }; } public static final String[] ruleNames = makeRuleNames(); @@ -156,17 +156,17 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(69); + setState(71); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(68); + setState(70); classdecl(); } } - setState(71); + setState(73); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==AccessModifierPublic || _la==Class ); @@ -238,67 +238,67 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(74); + setState(76); _errHandler.sync(this); _la = _input.LA(1); if (_la==AccessModifierPublic) { { - setState(73); + setState(75); match(AccessModifierPublic); } } - setState(76); - match(Class); - setState(77); - match(Identifier); setState(78); + match(Class); + setState(79); + match(Identifier); + setState(80); match(OpenCurlyBracket); - setState(84); + setState(86); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 17592186044904L) != 0)) { { - setState(82); + setState(84); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: { - setState(79); + setState(81); constuctorDecl(); } break; case 2: { - setState(80); + setState(82); localVarDecl(); } break; case 3: { - setState(81); + setState(83); methodDecl(); } break; } } - setState(86); + setState(88); _errHandler.sync(this); _la = _input.LA(1); } - setState(89); + setState(91); _errHandler.sync(this); _la = _input.LA(1); if (_la==MainMethodDecl) { { - setState(87); + setState(89); match(MainMethodDecl); - setState(88); + setState(90); block(); } } - setState(91); + setState(93); match(ClosedCurlyBracket); } } @@ -351,33 +351,33 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(94); + setState(96); _errHandler.sync(this); _la = _input.LA(1); if (_la==AccessModifierPublic) { { - setState(93); + setState(95); match(AccessModifierPublic); } } - setState(96); + setState(98); match(Identifier); - setState(97); - match(OpenRoundBracket); setState(99); + match(OpenRoundBracket); + setState(101); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 17592186044864L) != 0)) { { - setState(98); + setState(100); parameterList(); } } - setState(101); + setState(103); match(ClosedRoundBracket); - setState(102); + setState(104); block(); } } @@ -434,17 +434,17 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(105); + setState(107); _errHandler.sync(this); _la = _input.LA(1); if (_la==AccessModifierPublic) { { - setState(104); + setState(106); match(AccessModifierPublic); } } - setState(109); + setState(111); _errHandler.sync(this); switch (_input.LA(1)) { case Int: @@ -452,36 +452,36 @@ public class DecafParser extends Parser { case Char: case Identifier: { - setState(107); + setState(109); type(); } break; case Void: { - setState(108); + setState(110); match(Void); } break; default: throw new NoViableAltException(this); } - setState(111); + setState(113); match(Identifier); - setState(112); - match(OpenRoundBracket); setState(114); + match(OpenRoundBracket); + setState(116); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 17592186044864L) != 0)) { { - setState(113); + setState(115); parameterList(); } } - setState(116); + setState(118); match(ClosedRoundBracket); - setState(117); + setState(119); block(); } } @@ -534,21 +534,21 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(119); + setState(121); parameter(); - setState(124); + setState(126); _errHandler.sync(this); _la = _input.LA(1); while (_la==Comma) { { { - setState(120); + setState(122); match(Comma); - setState(121); + setState(123); parameter(); } } - setState(126); + setState(128); _errHandler.sync(this); _la = _input.LA(1); } @@ -596,9 +596,9 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(127); + setState(129); type(); - setState(128); + setState(130); match(Identifier); } } @@ -649,18 +649,18 @@ public class DecafParser extends Parser { enterRule(_localctx, 12, RULE_argumentList); int _la; try { - setState(140); + setState(142); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(131); + setState(133); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 33054638735366L) != 0)) { { - setState(130); + setState(132); expression(); } } @@ -670,21 +670,21 @@ public class DecafParser extends Parser { case 2: enterOuterAlt(_localctx, 2); { - setState(133); + setState(135); expression(); - setState(136); + setState(138); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(134); + setState(136); match(Comma); - setState(135); + setState(137); expression(); } } - setState(138); + setState(140); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Comma ); @@ -734,20 +734,20 @@ public class DecafParser extends Parser { ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); enterRule(_localctx, 14, RULE_expression); try { - setState(144); + setState(146); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(142); + setState(144); subExpression(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(143); + setState(145); binaryExpr(); } break; @@ -801,38 +801,38 @@ public class DecafParser extends Parser { SubExpressionContext _localctx = new SubExpressionContext(_ctx, getState()); enterRule(_localctx, 16, RULE_subExpression); try { - setState(153); + setState(155); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(146); + setState(148); match(This); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(147); + setState(149); assignableExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(148); + setState(150); stmtExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(149); - match(OpenRoundBracket); - setState(150); - subExpression(); setState(151); + match(OpenRoundBracket); + setState(152); + subExpression(); + setState(153); match(ClosedRoundBracket); } break; @@ -892,39 +892,39 @@ public class DecafParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(156); + setState(158); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: { - setState(155); + setState(157); receiver(); } break; } - setState(161); + setState(163); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(158); + setState(160); receivingMethod(); } } } - setState(163); + setState(165); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } - setState(164); - match(Identifier); - setState(165); - match(OpenRoundBracket); setState(166); - argumentList(); + match(Identifier); setState(167); + match(OpenRoundBracket); + setState(168); + argumentList(); + setState(169); match(ClosedRoundBracket); } } @@ -960,6 +960,9 @@ public class DecafParser extends Parser { public StmtExprContext stmtExpr() { return getRuleContext(StmtExprContext.class,0); } + public EmptyStatementContext emptyStatement() { + return getRuleContext(EmptyStatementContext.class,0); + } public StatementContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -983,25 +986,23 @@ public class DecafParser extends Parser { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 20, RULE_statement); try { - setState(181); + setState(182); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(169); + setState(171); returnStmt(); - setState(170); + setState(172); match(Semicolon); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(172); + setState(174); localVarDecl(); - setState(173); - match(Semicolon); } break; case 3: @@ -1034,6 +1035,13 @@ public class DecafParser extends Parser { match(Semicolon); } break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(181); + emptyStatement(); + } + break; } } catch (RecognitionException re) { @@ -1081,27 +1089,27 @@ public class DecafParser extends Parser { StmtExprContext _localctx = new StmtExprContext(_ctx, getState()); enterRule(_localctx, 22, RULE_stmtExpr); try { - setState(186); + setState(187); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(183); + setState(184); assign(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(184); + setState(185); newDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(185); + setState(186); methodCall(); } break; @@ -1147,20 +1155,20 @@ public class DecafParser extends Parser { AssignableExprContext _localctx = new AssignableExprContext(_ctx, getState()); enterRule(_localctx, 24, RULE_assignableExpr); try { - setState(190); + setState(191); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(188); + setState(189); match(Identifier); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(189); + setState(190); instVar(); } break; @@ -1211,31 +1219,31 @@ public class DecafParser extends Parser { enterOuterAlt(_localctx, 1); { { - setState(195); + setState(196); _errHandler.sync(this); switch (_input.LA(1)) { case This: { - setState(192); + setState(193); match(This); } break; case New: { - setState(193); + setState(194); newDecl(); } break; case Identifier: { - setState(194); + setState(195); match(Identifier); } break; default: throw new NoViableAltException(this); } - setState(197); + setState(198); match(Dot); } } @@ -1254,8 +1262,11 @@ public class DecafParser extends Parser { @SuppressWarnings("CheckReturnValue") public static class InstVarContext extends ParserRuleContext { public TerminalNode Identifier() { return getToken(DecafParser.Identifier, 0); } - public SubReceiverContext subReceiver() { - return getRuleContext(SubReceiverContext.class,0); + public List subReceiver() { + return getRuleContexts(SubReceiverContext.class); + } + public SubReceiverContext subReceiver(int i) { + return getRuleContext(SubReceiverContext.class,i); } public List receivingMethod() { return getRuleContexts(ReceivingMethodContext.class); @@ -1289,33 +1300,43 @@ public class DecafParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(200); + setState(201); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { - case 1: - { - setState(199); - subReceiver(); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(200); + subReceiver(); + } + } + break; + default: + throw new NoViableAltException(this); } - break; - } - setState(205); + setState(203); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,22,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + setState(208); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(202); + setState(205); receivingMethod(); } } } - setState(207); + setState(210); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } - setState(208); + setState(211); match(Identifier); } } @@ -1368,36 +1389,36 @@ public class DecafParser extends Parser { BinaryExprContext _localctx = new BinaryExprContext(_ctx, getState()); enterRule(_localctx, 30, RULE_binaryExpr); try { - setState(215); + setState(218); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(210); + setState(213); calcExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(211); + setState(214); nonCalcExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(212); + setState(215); value(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(213); + setState(216); match(Not); - setState(214); + setState(217); binaryExpr(); } break; @@ -1458,11 +1479,11 @@ public class DecafParser extends Parser { enterOuterAlt(_localctx, 1); { { - setState(218); + setState(221); dotExpr(0); } _ctx.stop = _input.LT(-1); - setState(225); + setState(228); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,25,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1473,16 +1494,16 @@ public class DecafParser extends Parser { { _localctx = new CalcExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_calcExpr); - setState(220); + setState(223); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(221); + setState(224); match(LineOperator); - setState(222); + setState(225); dotExpr(0); } } } - setState(227); + setState(230); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,25,_ctx); } @@ -1543,11 +1564,11 @@ public class DecafParser extends Parser { enterOuterAlt(_localctx, 1); { { - setState(229); + setState(232); dotSubExpr(); } _ctx.stop = _input.LT(-1); - setState(236); + setState(239); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,26,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1558,16 +1579,16 @@ public class DecafParser extends Parser { { _localctx = new DotExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_dotExpr); - setState(231); + setState(234); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(232); + setState(235); match(DotOperator); - setState(233); + setState(236); dotSubExpr(); } } } - setState(238); + setState(241); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,26,_ctx); } @@ -1622,45 +1643,45 @@ public class DecafParser extends Parser { DotSubExprContext _localctx = new DotSubExprContext(_ctx, getState()); enterRule(_localctx, 36, RULE_dotSubExpr); try { - setState(247); + setState(250); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(239); + setState(242); match(IntValue); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(240); + setState(243); match(Identifier); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(241); + setState(244); instVar(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(242); + setState(245); methodCall(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(243); + setState(246); match(OpenRoundBracket); - setState(244); + setState(247); calcExpr(0); - setState(245); + setState(248); match(ClosedRoundBracket); } break; @@ -1713,11 +1734,11 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(249); + setState(252); subExpression(); - setState(250); + setState(253); nonCalcOperator(); - setState(251); + setState(254); expression(); } } @@ -1762,7 +1783,7 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(253); + setState(256); _la = _input.LA(1); if ( !(_la==ComparisonOperator || _la==LogicalOpertor) ) { _errHandler.recoverInline(this); @@ -1817,14 +1838,14 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(255); + setState(258); match(Return); - setState(257); + setState(260); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 33054638735366L) != 0)) { { - setState(256); + setState(259); expression(); } } @@ -1880,33 +1901,33 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(260); + setState(263); _errHandler.sync(this); _la = _input.LA(1); if (_la==AccessModifierPublic) { { - setState(259); + setState(262); match(AccessModifierPublic); } } - setState(262); + setState(265); type(); - setState(263); - match(Identifier); setState(266); + match(Identifier); + setState(269); _errHandler.sync(this); _la = _input.LA(1); if (_la==Assign) { { - setState(264); + setState(267); match(Assign); - setState(265); + setState(268); expression(); } } - setState(268); + setState(271); match(Semicolon); } } @@ -1957,23 +1978,23 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(270); + setState(273); match(OpenCurlyBracket); - setState(274); + setState(277); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 21373904749000L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 21382494683592L) != 0)) { { { - setState(271); + setState(274); statement(); } } - setState(276); + setState(279); _errHandler.sync(this); _la = _input.LA(1); } - setState(277); + setState(280); match(ClosedCurlyBracket); } } @@ -2024,15 +2045,15 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(279); - match(While); - setState(280); - match(OpenRoundBracket); - setState(281); - expression(); setState(282); - match(ClosedRoundBracket); + match(While); setState(283); + match(OpenRoundBracket); + setState(284); + expression(); + setState(285); + match(ClosedRoundBracket); + setState(286); statement(); } } @@ -2080,14 +2101,14 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(285); + setState(288); ifStmt(); - setState(287); + setState(290); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(286); + setState(289); elseStmt(); } break; @@ -2141,15 +2162,15 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(289); - match(If); - setState(290); - match(OpenRoundBracket); - setState(291); - expression(); setState(292); - match(ClosedRoundBracket); + match(If); setState(293); + match(OpenRoundBracket); + setState(294); + expression(); + setState(295); + match(ClosedRoundBracket); + setState(296); statement(); } } @@ -2195,9 +2216,9 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(295); + setState(298); match(Else); - setState(296); + setState(299); statement(); } } @@ -2246,11 +2267,11 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(298); + setState(301); assignableExpr(); - setState(299); + setState(302); match(Assign); - setState(300); + setState(303); expression(); } } @@ -2299,15 +2320,15 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(302); - match(New); - setState(303); - match(Identifier); - setState(304); - match(OpenRoundBracket); setState(305); - argumentList(); + match(New); setState(306); + match(Identifier); + setState(307); + match(OpenRoundBracket); + setState(308); + argumentList(); + setState(309); match(ClosedRoundBracket); } } @@ -2359,35 +2380,35 @@ public class DecafParser extends Parser { enterOuterAlt(_localctx, 1); { { - setState(312); + setState(315); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { case 1: { - setState(308); + setState(311); match(This); } break; case 2: { - setState(309); + setState(312); instVar(); } break; case 3: { - setState(310); + setState(313); newDecl(); } break; case 4: { - setState(311); + setState(314); match(Identifier); } break; } - setState(314); + setState(317); match(Dot); } } @@ -2437,15 +2458,15 @@ public class DecafParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(316); - match(Identifier); - setState(317); - match(OpenRoundBracket); - setState(318); - argumentList(); setState(319); - match(ClosedRoundBracket); + match(Identifier); setState(320); + match(OpenRoundBracket); + setState(321); + argumentList(); + setState(322); + match(ClosedRoundBracket); + setState(323); match(Dot); } } @@ -2460,6 +2481,49 @@ public class DecafParser extends Parser { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class EmptyStatementContext extends ParserRuleContext { + public TerminalNode Semicolon() { return getToken(DecafParser.Semicolon, 0); } + public EmptyStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_emptyStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DecafListener ) ((DecafListener)listener).enterEmptyStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DecafListener ) ((DecafListener)listener).exitEmptyStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DecafVisitor ) return ((DecafVisitor)visitor).visitEmptyStatement(this); + else return visitor.visitChildren(this); + } + } + + public final EmptyStatementContext emptyStatement() throws RecognitionException { + EmptyStatementContext _localctx = new EmptyStatementContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_emptyStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(325); + match(Semicolon); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class TypeContext extends ParserRuleContext { public TerminalNode Int() { return getToken(DecafParser.Int, 0); } @@ -2487,12 +2551,12 @@ public class DecafParser extends Parser { public final TypeContext type() throws RecognitionException { TypeContext _localctx = new TypeContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_type); + enterRule(_localctx, 66, RULE_type); int _la; try { enterOuterAlt(_localctx, 1); { - setState(322); + setState(327); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 17592186044864L) != 0)) ) { _errHandler.recoverInline(this); @@ -2542,12 +2606,12 @@ public class DecafParser extends Parser { public final ValueContext value() throws RecognitionException { ValueContext _localctx = new ValueContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_value); + enterRule(_localctx, 68, RULE_value); int _la; try { enterOuterAlt(_localctx, 1); { - setState(324); + setState(329); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 13194139533318L) != 0)) ) { _errHandler.recoverInline(this); @@ -2595,7 +2659,7 @@ public class DecafParser extends Parser { } public static final String _serializedATN = - "\u0004\u0001-\u0147\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001-\u014c\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -2605,204 +2669,207 @@ public class DecafParser extends Parser { "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ - "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0001\u0000\u0004"+ - "\u0000F\b\u0000\u000b\u0000\f\u0000G\u0001\u0001\u0003\u0001K\b\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0005\u0001S\b\u0001\n\u0001\f\u0001V\t\u0001\u0001\u0001\u0001\u0001"+ - "\u0003\u0001Z\b\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0003\u0002"+ - "_\b\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002d\b\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0003\u0003j\b\u0003\u0001"+ - "\u0003\u0001\u0003\u0003\u0003n\b\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0003\u0003s\b\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0005\u0004{\b\u0004\n\u0004\f\u0004~\t"+ - "\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0003\u0006\u0084"+ - "\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0004\u0006\u0089\b\u0006"+ - "\u000b\u0006\f\u0006\u008a\u0003\u0006\u008d\b\u0006\u0001\u0007\u0001"+ - "\u0007\u0003\u0007\u0091\b\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0003\b\u009a\b\b\u0001\t\u0003\t\u009d\b\t\u0001\t"+ - "\u0005\t\u00a0\b\t\n\t\f\t\u00a3\t\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0003\n\u00b6\b\n\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0003\u000b\u00bb\b\u000b\u0001\f\u0001\f\u0003\f\u00bf\b\f\u0001"+ - "\r\u0001\r\u0001\r\u0003\r\u00c4\b\r\u0001\r\u0001\r\u0001\u000e\u0003"+ - "\u000e\u00c9\b\u000e\u0001\u000e\u0005\u000e\u00cc\b\u000e\n\u000e\f\u000e"+ - "\u00cf\t\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0003\u000f\u00d8\b\u000f\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0005\u0010\u00e0\b\u0010"+ - "\n\u0010\f\u0010\u00e3\t\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0005\u0011\u00eb\b\u0011\n\u0011\f\u0011"+ - "\u00ee\t\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u00f8\b\u0012\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015"+ - "\u0001\u0015\u0003\u0015\u0102\b\u0015\u0001\u0016\u0003\u0016\u0105\b"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0003\u0016\u010b"+ - "\b\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0005\u0017\u0111"+ - "\b\u0017\n\u0017\f\u0017\u0114\t\u0017\u0001\u0017\u0001\u0017\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019"+ - "\u0001\u0019\u0003\u0019\u0120\b\u0019\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ - "\u0001\u001e\u0001\u001e\u0003\u001e\u0139\b\u001e\u0001\u001e\u0001\u001e"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001 \u0001 \u0001!\u0001!\u0001!\u0000\u0002 \"\"\u0000\u0002\u0004"+ - "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ - "$&(*,.02468:<>@B\u0000\u0003\u0001\u0000\u000b\f\u0002\u0000\u0006\b,"+ - ",\u0002\u0000\u0001\u0002*+\u0156\u0000E\u0001\u0000\u0000\u0000\u0002"+ - "J\u0001\u0000\u0000\u0000\u0004^\u0001\u0000\u0000\u0000\u0006i\u0001"+ - "\u0000\u0000\u0000\bw\u0001\u0000\u0000\u0000\n\u007f\u0001\u0000\u0000"+ - "\u0000\f\u008c\u0001\u0000\u0000\u0000\u000e\u0090\u0001\u0000\u0000\u0000"+ - "\u0010\u0099\u0001\u0000\u0000\u0000\u0012\u009c\u0001\u0000\u0000\u0000"+ - "\u0014\u00b5\u0001\u0000\u0000\u0000\u0016\u00ba\u0001\u0000\u0000\u0000"+ - "\u0018\u00be\u0001\u0000\u0000\u0000\u001a\u00c3\u0001\u0000\u0000\u0000"+ - "\u001c\u00c8\u0001\u0000\u0000\u0000\u001e\u00d7\u0001\u0000\u0000\u0000"+ - " \u00d9\u0001\u0000\u0000\u0000\"\u00e4\u0001\u0000\u0000\u0000$\u00f7"+ - "\u0001\u0000\u0000\u0000&\u00f9\u0001\u0000\u0000\u0000(\u00fd\u0001\u0000"+ - "\u0000\u0000*\u00ff\u0001\u0000\u0000\u0000,\u0104\u0001\u0000\u0000\u0000"+ - ".\u010e\u0001\u0000\u0000\u00000\u0117\u0001\u0000\u0000\u00002\u011d"+ - "\u0001\u0000\u0000\u00004\u0121\u0001\u0000\u0000\u00006\u0127\u0001\u0000"+ - "\u0000\u00008\u012a\u0001\u0000\u0000\u0000:\u012e\u0001\u0000\u0000\u0000"+ - "<\u0138\u0001\u0000\u0000\u0000>\u013c\u0001\u0000\u0000\u0000@\u0142"+ - "\u0001\u0000\u0000\u0000B\u0144\u0001\u0000\u0000\u0000DF\u0003\u0002"+ - "\u0001\u0000ED\u0001\u0000\u0000\u0000FG\u0001\u0000\u0000\u0000GE\u0001"+ - "\u0000\u0000\u0000GH\u0001\u0000\u0000\u0000H\u0001\u0001\u0000\u0000"+ - "\u0000IK\u0005\u0003\u0000\u0000JI\u0001\u0000\u0000\u0000JK\u0001\u0000"+ - "\u0000\u0000KL\u0001\u0000\u0000\u0000LM\u0005#\u0000\u0000MN\u0005,\u0000"+ - "\u0000NT\u0005\u001f\u0000\u0000OS\u0003\u0004\u0002\u0000PS\u0003,\u0016"+ - "\u0000QS\u0003\u0006\u0003\u0000RO\u0001\u0000\u0000\u0000RP\u0001\u0000"+ - "\u0000\u0000RQ\u0001\u0000\u0000\u0000SV\u0001\u0000\u0000\u0000TR\u0001"+ - "\u0000\u0000\u0000TU\u0001\u0000\u0000\u0000UY\u0001\u0000\u0000\u0000"+ - "VT\u0001\u0000\u0000\u0000WX\u0005\u0004\u0000\u0000XZ\u0003.\u0017\u0000"+ - "YW\u0001\u0000\u0000\u0000YZ\u0001\u0000\u0000\u0000Z[\u0001\u0000\u0000"+ - "\u0000[\\\u0005 \u0000\u0000\\\u0003\u0001\u0000\u0000\u0000]_\u0005\u0003"+ - "\u0000\u0000^]\u0001\u0000\u0000\u0000^_\u0001\u0000\u0000\u0000_`\u0001"+ - "\u0000\u0000\u0000`a\u0005,\u0000\u0000ac\u0005\u001d\u0000\u0000bd\u0003"+ - "\b\u0004\u0000cb\u0001\u0000\u0000\u0000cd\u0001\u0000\u0000\u0000de\u0001"+ - "\u0000\u0000\u0000ef\u0005\u001e\u0000\u0000fg\u0003.\u0017\u0000g\u0005"+ - "\u0001\u0000\u0000\u0000hj\u0005\u0003\u0000\u0000ih\u0001\u0000\u0000"+ - "\u0000ij\u0001\u0000\u0000\u0000jm\u0001\u0000\u0000\u0000kn\u0003@ \u0000"+ - "ln\u0005\u0005\u0000\u0000mk\u0001\u0000\u0000\u0000ml\u0001\u0000\u0000"+ - "\u0000no\u0001\u0000\u0000\u0000op\u0005,\u0000\u0000pr\u0005\u001d\u0000"+ - "\u0000qs\u0003\b\u0004\u0000rq\u0001\u0000\u0000\u0000rs\u0001\u0000\u0000"+ - "\u0000st\u0001\u0000\u0000\u0000tu\u0005\u001e\u0000\u0000uv\u0003.\u0017"+ - "\u0000v\u0007\u0001\u0000\u0000\u0000w|\u0003\n\u0005\u0000xy\u0005\""+ - "\u0000\u0000y{\u0003\n\u0005\u0000zx\u0001\u0000\u0000\u0000{~\u0001\u0000"+ - "\u0000\u0000|z\u0001\u0000\u0000\u0000|}\u0001\u0000\u0000\u0000}\t\u0001"+ - "\u0000\u0000\u0000~|\u0001\u0000\u0000\u0000\u007f\u0080\u0003@ \u0000"+ - "\u0080\u0081\u0005,\u0000\u0000\u0081\u000b\u0001\u0000\u0000\u0000\u0082"+ - "\u0084\u0003\u000e\u0007\u0000\u0083\u0082\u0001\u0000\u0000\u0000\u0083"+ - "\u0084\u0001\u0000\u0000\u0000\u0084\u008d\u0001\u0000\u0000\u0000\u0085"+ - "\u0088\u0003\u000e\u0007\u0000\u0086\u0087\u0005\"\u0000\u0000\u0087\u0089"+ - "\u0003\u000e\u0007\u0000\u0088\u0086\u0001\u0000\u0000\u0000\u0089\u008a"+ - "\u0001\u0000\u0000\u0000\u008a\u0088\u0001\u0000\u0000\u0000\u008a\u008b"+ - "\u0001\u0000\u0000\u0000\u008b\u008d\u0001\u0000\u0000\u0000\u008c\u0083"+ - "\u0001\u0000\u0000\u0000\u008c\u0085\u0001\u0000\u0000\u0000\u008d\r\u0001"+ - "\u0000\u0000\u0000\u008e\u0091\u0003\u0010\b\u0000\u008f\u0091\u0003\u001e"+ - "\u000f\u0000\u0090\u008e\u0001\u0000\u0000\u0000\u0090\u008f\u0001\u0000"+ - "\u0000\u0000\u0091\u000f\u0001\u0000\u0000\u0000\u0092\u009a\u0005$\u0000"+ - "\u0000\u0093\u009a\u0003\u0018\f\u0000\u0094\u009a\u0003\u0016\u000b\u0000"+ - "\u0095\u0096\u0005\u001d\u0000\u0000\u0096\u0097\u0003\u0010\b\u0000\u0097"+ - "\u0098\u0005\u001e\u0000\u0000\u0098\u009a\u0001\u0000\u0000\u0000\u0099"+ - "\u0092\u0001\u0000\u0000\u0000\u0099\u0093\u0001\u0000\u0000\u0000\u0099"+ - "\u0094\u0001\u0000\u0000\u0000\u0099\u0095\u0001\u0000\u0000\u0000\u009a"+ - "\u0011\u0001\u0000\u0000\u0000\u009b\u009d\u0003<\u001e\u0000\u009c\u009b"+ - "\u0001\u0000\u0000\u0000\u009c\u009d\u0001\u0000\u0000\u0000\u009d\u00a1"+ - "\u0001\u0000\u0000\u0000\u009e\u00a0\u0003>\u001f\u0000\u009f\u009e\u0001"+ - "\u0000\u0000\u0000\u00a0\u00a3\u0001\u0000\u0000\u0000\u00a1\u009f\u0001"+ - "\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000\u0000\u0000\u00a2\u00a4\u0001"+ - "\u0000\u0000\u0000\u00a3\u00a1\u0001\u0000\u0000\u0000\u00a4\u00a5\u0005"+ - ",\u0000\u0000\u00a5\u00a6\u0005\u001d\u0000\u0000\u00a6\u00a7\u0003\f"+ - "\u0006\u0000\u00a7\u00a8\u0005\u001e\u0000\u0000\u00a8\u0013\u0001\u0000"+ - "\u0000\u0000\u00a9\u00aa\u0003*\u0015\u0000\u00aa\u00ab\u0005!\u0000\u0000"+ - "\u00ab\u00b6\u0001\u0000\u0000\u0000\u00ac\u00ad\u0003,\u0016\u0000\u00ad"+ - "\u00ae\u0005!\u0000\u0000\u00ae\u00b6\u0001\u0000\u0000\u0000\u00af\u00b6"+ - "\u0003.\u0017\u0000\u00b0\u00b6\u00030\u0018\u0000\u00b1\u00b6\u00032"+ - "\u0019\u0000\u00b2\u00b3\u0003\u0016\u000b\u0000\u00b3\u00b4\u0005!\u0000"+ - "\u0000\u00b4\u00b6\u0001\u0000\u0000\u0000\u00b5\u00a9\u0001\u0000\u0000"+ - "\u0000\u00b5\u00ac\u0001\u0000\u0000\u0000\u00b5\u00af\u0001\u0000\u0000"+ - "\u0000\u00b5\u00b0\u0001\u0000\u0000\u0000\u00b5\u00b1\u0001\u0000\u0000"+ - "\u0000\u00b5\u00b2\u0001\u0000\u0000\u0000\u00b6\u0015\u0001\u0000\u0000"+ - "\u0000\u00b7\u00bb\u00038\u001c\u0000\u00b8\u00bb\u0003:\u001d\u0000\u00b9"+ - "\u00bb\u0003\u0012\t\u0000\u00ba\u00b7\u0001\u0000\u0000\u0000\u00ba\u00b8"+ - "\u0001\u0000\u0000\u0000\u00ba\u00b9\u0001\u0000\u0000\u0000\u00bb\u0017"+ - "\u0001\u0000\u0000\u0000\u00bc\u00bf\u0005,\u0000\u0000\u00bd\u00bf\u0003"+ - "\u001c\u000e\u0000\u00be\u00bc\u0001\u0000\u0000\u0000\u00be\u00bd\u0001"+ - "\u0000\u0000\u0000\u00bf\u0019\u0001\u0000\u0000\u0000\u00c0\u00c4\u0005"+ - "$\u0000\u0000\u00c1\u00c4\u0003:\u001d\u0000\u00c2\u00c4\u0005,\u0000"+ - "\u0000\u00c3\u00c0\u0001\u0000\u0000\u0000\u00c3\u00c1\u0001\u0000\u0000"+ - "\u0000\u00c3\u00c2\u0001\u0000\u0000\u0000\u00c4\u00c5\u0001\u0000\u0000"+ - "\u0000\u00c5\u00c6\u0005\u001c\u0000\u0000\u00c6\u001b\u0001\u0000\u0000"+ - "\u0000\u00c7\u00c9\u0003\u001a\r\u0000\u00c8\u00c7\u0001\u0000\u0000\u0000"+ - "\u00c8\u00c9\u0001\u0000\u0000\u0000\u00c9\u00cd\u0001\u0000\u0000\u0000"+ - "\u00ca\u00cc\u0003>\u001f\u0000\u00cb\u00ca\u0001\u0000\u0000\u0000\u00cc"+ - "\u00cf\u0001\u0000\u0000\u0000\u00cd\u00cb\u0001\u0000\u0000\u0000\u00cd"+ - "\u00ce\u0001\u0000\u0000\u0000\u00ce\u00d0\u0001\u0000\u0000\u0000\u00cf"+ - "\u00cd\u0001\u0000\u0000\u0000\u00d0\u00d1\u0005,\u0000\u0000\u00d1\u001d"+ - "\u0001\u0000\u0000\u0000\u00d2\u00d8\u0003 \u0010\u0000\u00d3\u00d8\u0003"+ - "&\u0013\u0000\u00d4\u00d8\u0003B!\u0000\u00d5\u00d6\u0005\u0019\u0000"+ - "\u0000\u00d6\u00d8\u0003\u001e\u000f\u0000\u00d7\u00d2\u0001\u0000\u0000"+ - "\u0000\u00d7\u00d3\u0001\u0000\u0000\u0000\u00d7\u00d4\u0001\u0000\u0000"+ - "\u0000\u00d7\u00d5\u0001\u0000\u0000\u0000\u00d8\u001f\u0001\u0000\u0000"+ - "\u0000\u00d9\u00da\u0006\u0010\uffff\uffff\u0000\u00da\u00db\u0003\"\u0011"+ - "\u0000\u00db\u00e1\u0001\u0000\u0000\u0000\u00dc\u00dd\n\u0002\u0000\u0000"+ - "\u00dd\u00de\u0005\n\u0000\u0000\u00de\u00e0\u0003\"\u0011\u0000\u00df"+ - "\u00dc\u0001\u0000\u0000\u0000\u00e0\u00e3\u0001\u0000\u0000\u0000\u00e1"+ - "\u00df\u0001\u0000\u0000\u0000\u00e1\u00e2\u0001\u0000\u0000\u0000\u00e2"+ - "!\u0001\u0000\u0000\u0000\u00e3\u00e1\u0001\u0000\u0000\u0000\u00e4\u00e5"+ - "\u0006\u0011\uffff\uffff\u0000\u00e5\u00e6\u0003$\u0012\u0000\u00e6\u00ec"+ - "\u0001\u0000\u0000\u0000\u00e7\u00e8\n\u0002\u0000\u0000\u00e8\u00e9\u0005"+ - "\t\u0000\u0000\u00e9\u00eb\u0003$\u0012\u0000\u00ea\u00e7\u0001\u0000"+ - "\u0000\u0000\u00eb\u00ee\u0001\u0000\u0000\u0000\u00ec\u00ea\u0001\u0000"+ - "\u0000\u0000\u00ec\u00ed\u0001\u0000\u0000\u0000\u00ed#\u0001\u0000\u0000"+ - "\u0000\u00ee\u00ec\u0001\u0000\u0000\u0000\u00ef\u00f8\u0005*\u0000\u0000"+ - "\u00f0\u00f8\u0005,\u0000\u0000\u00f1\u00f8\u0003\u001c\u000e\u0000\u00f2"+ - "\u00f8\u0003\u0012\t\u0000\u00f3\u00f4\u0005\u001d\u0000\u0000\u00f4\u00f5"+ - "\u0003 \u0010\u0000\u00f5\u00f6\u0005\u001e\u0000\u0000\u00f6\u00f8\u0001"+ - "\u0000\u0000\u0000\u00f7\u00ef\u0001\u0000\u0000\u0000\u00f7\u00f0\u0001"+ - "\u0000\u0000\u0000\u00f7\u00f1\u0001\u0000\u0000\u0000\u00f7\u00f2\u0001"+ - "\u0000\u0000\u0000\u00f7\u00f3\u0001\u0000\u0000\u0000\u00f8%\u0001\u0000"+ - "\u0000\u0000\u00f9\u00fa\u0003\u0010\b\u0000\u00fa\u00fb\u0003(\u0014"+ - "\u0000\u00fb\u00fc\u0003\u000e\u0007\u0000\u00fc\'\u0001\u0000\u0000\u0000"+ - "\u00fd\u00fe\u0007\u0000\u0000\u0000\u00fe)\u0001\u0000\u0000\u0000\u00ff"+ - "\u0101\u0005(\u0000\u0000\u0100\u0102\u0003\u000e\u0007\u0000\u0101\u0100"+ - "\u0001\u0000\u0000\u0000\u0101\u0102\u0001\u0000\u0000\u0000\u0102+\u0001"+ - "\u0000\u0000\u0000\u0103\u0105\u0005\u0003\u0000\u0000\u0104\u0103\u0001"+ - "\u0000\u0000\u0000\u0104\u0105\u0001\u0000\u0000\u0000\u0105\u0106\u0001"+ - "\u0000\u0000\u0000\u0106\u0107\u0003@ \u0000\u0107\u010a\u0005,\u0000"+ - "\u0000\u0108\u0109\u0005\r\u0000\u0000\u0109\u010b\u0003\u000e\u0007\u0000"+ - "\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u010b\u0001\u0000\u0000\u0000"+ - "\u010b\u010c\u0001\u0000\u0000\u0000\u010c\u010d\u0005!\u0000\u0000\u010d"+ - "-\u0001\u0000\u0000\u0000\u010e\u0112\u0005\u001f\u0000\u0000\u010f\u0111"+ - "\u0003\u0014\n\u0000\u0110\u010f\u0001\u0000\u0000\u0000\u0111\u0114\u0001"+ - "\u0000\u0000\u0000\u0112\u0110\u0001\u0000\u0000\u0000\u0112\u0113\u0001"+ - "\u0000\u0000\u0000\u0113\u0115\u0001\u0000\u0000\u0000\u0114\u0112\u0001"+ - "\u0000\u0000\u0000\u0115\u0116\u0005 \u0000\u0000\u0116/\u0001\u0000\u0000"+ - "\u0000\u0117\u0118\u0005%\u0000\u0000\u0118\u0119\u0005\u001d\u0000\u0000"+ - "\u0119\u011a\u0003\u000e\u0007\u0000\u011a\u011b\u0005\u001e\u0000\u0000"+ - "\u011b\u011c\u0003\u0014\n\u0000\u011c1\u0001\u0000\u0000\u0000\u011d"+ - "\u011f\u00034\u001a\u0000\u011e\u0120\u00036\u001b\u0000\u011f\u011e\u0001"+ - "\u0000\u0000\u0000\u011f\u0120\u0001\u0000\u0000\u0000\u01203\u0001\u0000"+ - "\u0000\u0000\u0121\u0122\u0005&\u0000\u0000\u0122\u0123\u0005\u001d\u0000"+ - "\u0000\u0123\u0124\u0003\u000e\u0007\u0000\u0124\u0125\u0005\u001e\u0000"+ - "\u0000\u0125\u0126\u0003\u0014\n\u0000\u01265\u0001\u0000\u0000\u0000"+ - "\u0127\u0128\u0005\'\u0000\u0000\u0128\u0129\u0003\u0014\n\u0000\u0129"+ - "7\u0001\u0000\u0000\u0000\u012a\u012b\u0003\u0018\f\u0000\u012b\u012c"+ - "\u0005\r\u0000\u0000\u012c\u012d\u0003\u000e\u0007\u0000\u012d9\u0001"+ - "\u0000\u0000\u0000\u012e\u012f\u0005)\u0000\u0000\u012f\u0130\u0005,\u0000"+ - "\u0000\u0130\u0131\u0005\u001d\u0000\u0000\u0131\u0132\u0003\f\u0006\u0000"+ - "\u0132\u0133\u0005\u001e\u0000\u0000\u0133;\u0001\u0000\u0000\u0000\u0134"+ - "\u0139\u0005$\u0000\u0000\u0135\u0139\u0003\u001c\u000e\u0000\u0136\u0139"+ - "\u0003:\u001d\u0000\u0137\u0139\u0005,\u0000\u0000\u0138\u0134\u0001\u0000"+ - "\u0000\u0000\u0138\u0135\u0001\u0000\u0000\u0000\u0138\u0136\u0001\u0000"+ - "\u0000\u0000\u0138\u0137\u0001\u0000\u0000\u0000\u0139\u013a\u0001\u0000"+ - "\u0000\u0000\u013a\u013b\u0005\u001c\u0000\u0000\u013b=\u0001\u0000\u0000"+ - "\u0000\u013c\u013d\u0005,\u0000\u0000\u013d\u013e\u0005\u001d\u0000\u0000"+ - "\u013e\u013f\u0003\f\u0006\u0000\u013f\u0140\u0005\u001e\u0000\u0000\u0140"+ - "\u0141\u0005\u001c\u0000\u0000\u0141?\u0001\u0000\u0000\u0000\u0142\u0143"+ - "\u0007\u0001\u0000\u0000\u0143A\u0001\u0000\u0000\u0000\u0144\u0145\u0007"+ - "\u0002\u0000\u0000\u0145C\u0001\u0000\u0000\u0000\"GJRTY^cimr|\u0083\u008a"+ - "\u008c\u0090\u0099\u009c\u00a1\u00b5\u00ba\u00be\u00c3\u00c8\u00cd\u00d7"+ - "\u00e1\u00ec\u00f7\u0101\u0104\u010a\u0112\u011f\u0138"; + "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0001"+ + "\u0000\u0004\u0000H\b\u0000\u000b\u0000\f\u0000I\u0001\u0001\u0003\u0001"+ + "M\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0005\u0001U\b\u0001\n\u0001\f\u0001X\t\u0001\u0001\u0001"+ + "\u0001\u0001\u0003\u0001\\\b\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+ + "\u0003\u0002a\b\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002"+ + "f\b\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0003\u0003"+ + "l\b\u0003\u0001\u0003\u0001\u0003\u0003\u0003p\b\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0003\u0003u\b\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004}\b\u0004\n\u0004"+ + "\f\u0004\u0080\t\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006"+ + "\u0003\u0006\u0086\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0004\u0006"+ + "\u008b\b\u0006\u000b\u0006\f\u0006\u008c\u0003\u0006\u008f\b\u0006\u0001"+ + "\u0007\u0001\u0007\u0003\u0007\u0093\b\u0007\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0003\b\u009c\b\b\u0001\t\u0003\t\u009f\b\t"+ + "\u0001\t\u0005\t\u00a2\b\t\n\t\f\t\u00a5\t\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0003\n\u00b7\b\n\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0003\u000b\u00bc\b\u000b\u0001\f\u0001\f\u0003\f\u00c0\b\f\u0001"+ + "\r\u0001\r\u0001\r\u0003\r\u00c5\b\r\u0001\r\u0001\r\u0001\u000e\u0004"+ + "\u000e\u00ca\b\u000e\u000b\u000e\f\u000e\u00cb\u0001\u000e\u0005\u000e"+ + "\u00cf\b\u000e\n\u000e\f\u000e\u00d2\t\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u00db"+ + "\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0005\u0010\u00e3\b\u0010\n\u0010\f\u0010\u00e6\t\u0010\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0005\u0011"+ + "\u00ee\b\u0011\n\u0011\f\u0011\u00f1\t\u0011\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003"+ + "\u0012\u00fb\b\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0003\u0015\u0105\b\u0015\u0001"+ + "\u0016\u0003\u0016\u0108\b\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0003\u0016\u010e\b\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ + "\u0017\u0005\u0017\u0114\b\u0017\n\u0017\f\u0017\u0117\t\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0019\u0001\u0019\u0003\u0019\u0123\b\u0019\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0003\u001e\u013c\b\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001!\u0001!\u0001\"\u0001\"\u0001"+ + "\"\u0000\u0002 \"#\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014"+ + "\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BD\u0000\u0003\u0001\u0000"+ + "\u000b\f\u0002\u0000\u0006\b,,\u0002\u0000\u0001\u0002*+\u015b\u0000G"+ + "\u0001\u0000\u0000\u0000\u0002L\u0001\u0000\u0000\u0000\u0004`\u0001\u0000"+ + "\u0000\u0000\u0006k\u0001\u0000\u0000\u0000\by\u0001\u0000\u0000\u0000"+ + "\n\u0081\u0001\u0000\u0000\u0000\f\u008e\u0001\u0000\u0000\u0000\u000e"+ + "\u0092\u0001\u0000\u0000\u0000\u0010\u009b\u0001\u0000\u0000\u0000\u0012"+ + "\u009e\u0001\u0000\u0000\u0000\u0014\u00b6\u0001\u0000\u0000\u0000\u0016"+ + "\u00bb\u0001\u0000\u0000\u0000\u0018\u00bf\u0001\u0000\u0000\u0000\u001a"+ + "\u00c4\u0001\u0000\u0000\u0000\u001c\u00c9\u0001\u0000\u0000\u0000\u001e"+ + "\u00da\u0001\u0000\u0000\u0000 \u00dc\u0001\u0000\u0000\u0000\"\u00e7"+ + "\u0001\u0000\u0000\u0000$\u00fa\u0001\u0000\u0000\u0000&\u00fc\u0001\u0000"+ + "\u0000\u0000(\u0100\u0001\u0000\u0000\u0000*\u0102\u0001\u0000\u0000\u0000"+ + ",\u0107\u0001\u0000\u0000\u0000.\u0111\u0001\u0000\u0000\u00000\u011a"+ + "\u0001\u0000\u0000\u00002\u0120\u0001\u0000\u0000\u00004\u0124\u0001\u0000"+ + "\u0000\u00006\u012a\u0001\u0000\u0000\u00008\u012d\u0001\u0000\u0000\u0000"+ + ":\u0131\u0001\u0000\u0000\u0000<\u013b\u0001\u0000\u0000\u0000>\u013f"+ + "\u0001\u0000\u0000\u0000@\u0145\u0001\u0000\u0000\u0000B\u0147\u0001\u0000"+ + "\u0000\u0000D\u0149\u0001\u0000\u0000\u0000FH\u0003\u0002\u0001\u0000"+ + "GF\u0001\u0000\u0000\u0000HI\u0001\u0000\u0000\u0000IG\u0001\u0000\u0000"+ + "\u0000IJ\u0001\u0000\u0000\u0000J\u0001\u0001\u0000\u0000\u0000KM\u0005"+ + "\u0003\u0000\u0000LK\u0001\u0000\u0000\u0000LM\u0001\u0000\u0000\u0000"+ + "MN\u0001\u0000\u0000\u0000NO\u0005#\u0000\u0000OP\u0005,\u0000\u0000P"+ + "V\u0005\u001f\u0000\u0000QU\u0003\u0004\u0002\u0000RU\u0003,\u0016\u0000"+ + "SU\u0003\u0006\u0003\u0000TQ\u0001\u0000\u0000\u0000TR\u0001\u0000\u0000"+ + "\u0000TS\u0001\u0000\u0000\u0000UX\u0001\u0000\u0000\u0000VT\u0001\u0000"+ + "\u0000\u0000VW\u0001\u0000\u0000\u0000W[\u0001\u0000\u0000\u0000XV\u0001"+ + "\u0000\u0000\u0000YZ\u0005\u0004\u0000\u0000Z\\\u0003.\u0017\u0000[Y\u0001"+ + "\u0000\u0000\u0000[\\\u0001\u0000\u0000\u0000\\]\u0001\u0000\u0000\u0000"+ + "]^\u0005 \u0000\u0000^\u0003\u0001\u0000\u0000\u0000_a\u0005\u0003\u0000"+ + "\u0000`_\u0001\u0000\u0000\u0000`a\u0001\u0000\u0000\u0000ab\u0001\u0000"+ + "\u0000\u0000bc\u0005,\u0000\u0000ce\u0005\u001d\u0000\u0000df\u0003\b"+ + "\u0004\u0000ed\u0001\u0000\u0000\u0000ef\u0001\u0000\u0000\u0000fg\u0001"+ + "\u0000\u0000\u0000gh\u0005\u001e\u0000\u0000hi\u0003.\u0017\u0000i\u0005"+ + "\u0001\u0000\u0000\u0000jl\u0005\u0003\u0000\u0000kj\u0001\u0000\u0000"+ + "\u0000kl\u0001\u0000\u0000\u0000lo\u0001\u0000\u0000\u0000mp\u0003B!\u0000"+ + "np\u0005\u0005\u0000\u0000om\u0001\u0000\u0000\u0000on\u0001\u0000\u0000"+ + "\u0000pq\u0001\u0000\u0000\u0000qr\u0005,\u0000\u0000rt\u0005\u001d\u0000"+ + "\u0000su\u0003\b\u0004\u0000ts\u0001\u0000\u0000\u0000tu\u0001\u0000\u0000"+ + "\u0000uv\u0001\u0000\u0000\u0000vw\u0005\u001e\u0000\u0000wx\u0003.\u0017"+ + "\u0000x\u0007\u0001\u0000\u0000\u0000y~\u0003\n\u0005\u0000z{\u0005\""+ + "\u0000\u0000{}\u0003\n\u0005\u0000|z\u0001\u0000\u0000\u0000}\u0080\u0001"+ + "\u0000\u0000\u0000~|\u0001\u0000\u0000\u0000~\u007f\u0001\u0000\u0000"+ + "\u0000\u007f\t\u0001\u0000\u0000\u0000\u0080~\u0001\u0000\u0000\u0000"+ + "\u0081\u0082\u0003B!\u0000\u0082\u0083\u0005,\u0000\u0000\u0083\u000b"+ + "\u0001\u0000\u0000\u0000\u0084\u0086\u0003\u000e\u0007\u0000\u0085\u0084"+ + "\u0001\u0000\u0000\u0000\u0085\u0086\u0001\u0000\u0000\u0000\u0086\u008f"+ + "\u0001\u0000\u0000\u0000\u0087\u008a\u0003\u000e\u0007\u0000\u0088\u0089"+ + "\u0005\"\u0000\u0000\u0089\u008b\u0003\u000e\u0007\u0000\u008a\u0088\u0001"+ + "\u0000\u0000\u0000\u008b\u008c\u0001\u0000\u0000\u0000\u008c\u008a\u0001"+ + "\u0000\u0000\u0000\u008c\u008d\u0001\u0000\u0000\u0000\u008d\u008f\u0001"+ + "\u0000\u0000\u0000\u008e\u0085\u0001\u0000\u0000\u0000\u008e\u0087\u0001"+ + "\u0000\u0000\u0000\u008f\r\u0001\u0000\u0000\u0000\u0090\u0093\u0003\u0010"+ + "\b\u0000\u0091\u0093\u0003\u001e\u000f\u0000\u0092\u0090\u0001\u0000\u0000"+ + "\u0000\u0092\u0091\u0001\u0000\u0000\u0000\u0093\u000f\u0001\u0000\u0000"+ + "\u0000\u0094\u009c\u0005$\u0000\u0000\u0095\u009c\u0003\u0018\f\u0000"+ + "\u0096\u009c\u0003\u0016\u000b\u0000\u0097\u0098\u0005\u001d\u0000\u0000"+ + "\u0098\u0099\u0003\u0010\b\u0000\u0099\u009a\u0005\u001e\u0000\u0000\u009a"+ + "\u009c\u0001\u0000\u0000\u0000\u009b\u0094\u0001\u0000\u0000\u0000\u009b"+ + "\u0095\u0001\u0000\u0000\u0000\u009b\u0096\u0001\u0000\u0000\u0000\u009b"+ + "\u0097\u0001\u0000\u0000\u0000\u009c\u0011\u0001\u0000\u0000\u0000\u009d"+ + "\u009f\u0003<\u001e\u0000\u009e\u009d\u0001\u0000\u0000\u0000\u009e\u009f"+ + "\u0001\u0000\u0000\u0000\u009f\u00a3\u0001\u0000\u0000\u0000\u00a0\u00a2"+ + "\u0003>\u001f\u0000\u00a1\u00a0\u0001\u0000\u0000\u0000\u00a2\u00a5\u0001"+ + "\u0000\u0000\u0000\u00a3\u00a1\u0001\u0000\u0000\u0000\u00a3\u00a4\u0001"+ + "\u0000\u0000\u0000\u00a4\u00a6\u0001\u0000\u0000\u0000\u00a5\u00a3\u0001"+ + "\u0000\u0000\u0000\u00a6\u00a7\u0005,\u0000\u0000\u00a7\u00a8\u0005\u001d"+ + "\u0000\u0000\u00a8\u00a9\u0003\f\u0006\u0000\u00a9\u00aa\u0005\u001e\u0000"+ + "\u0000\u00aa\u0013\u0001\u0000\u0000\u0000\u00ab\u00ac\u0003*\u0015\u0000"+ + "\u00ac\u00ad\u0005!\u0000\u0000\u00ad\u00b7\u0001\u0000\u0000\u0000\u00ae"+ + "\u00b7\u0003,\u0016\u0000\u00af\u00b7\u0003.\u0017\u0000\u00b0\u00b7\u0003"+ + "0\u0018\u0000\u00b1\u00b7\u00032\u0019\u0000\u00b2\u00b3\u0003\u0016\u000b"+ + "\u0000\u00b3\u00b4\u0005!\u0000\u0000\u00b4\u00b7\u0001\u0000\u0000\u0000"+ + "\u00b5\u00b7\u0003@ \u0000\u00b6\u00ab\u0001\u0000\u0000\u0000\u00b6\u00ae"+ + "\u0001\u0000\u0000\u0000\u00b6\u00af\u0001\u0000\u0000\u0000\u00b6\u00b0"+ + "\u0001\u0000\u0000\u0000\u00b6\u00b1\u0001\u0000\u0000\u0000\u00b6\u00b2"+ + "\u0001\u0000\u0000\u0000\u00b6\u00b5\u0001\u0000\u0000\u0000\u00b7\u0015"+ + "\u0001\u0000\u0000\u0000\u00b8\u00bc\u00038\u001c\u0000\u00b9\u00bc\u0003"+ + ":\u001d\u0000\u00ba\u00bc\u0003\u0012\t\u0000\u00bb\u00b8\u0001\u0000"+ + "\u0000\u0000\u00bb\u00b9\u0001\u0000\u0000\u0000\u00bb\u00ba\u0001\u0000"+ + "\u0000\u0000\u00bc\u0017\u0001\u0000\u0000\u0000\u00bd\u00c0\u0005,\u0000"+ + "\u0000\u00be\u00c0\u0003\u001c\u000e\u0000\u00bf\u00bd\u0001\u0000\u0000"+ + "\u0000\u00bf\u00be\u0001\u0000\u0000\u0000\u00c0\u0019\u0001\u0000\u0000"+ + "\u0000\u00c1\u00c5\u0005$\u0000\u0000\u00c2\u00c5\u0003:\u001d\u0000\u00c3"+ + "\u00c5\u0005,\u0000\u0000\u00c4\u00c1\u0001\u0000\u0000\u0000\u00c4\u00c2"+ + "\u0001\u0000\u0000\u0000\u00c4\u00c3\u0001\u0000\u0000\u0000\u00c5\u00c6"+ + "\u0001\u0000\u0000\u0000\u00c6\u00c7\u0005\u001c\u0000\u0000\u00c7\u001b"+ + "\u0001\u0000\u0000\u0000\u00c8\u00ca\u0003\u001a\r\u0000\u00c9\u00c8\u0001"+ + "\u0000\u0000\u0000\u00ca\u00cb\u0001\u0000\u0000\u0000\u00cb\u00c9\u0001"+ + "\u0000\u0000\u0000\u00cb\u00cc\u0001\u0000\u0000\u0000\u00cc\u00d0\u0001"+ + "\u0000\u0000\u0000\u00cd\u00cf\u0003>\u001f\u0000\u00ce\u00cd\u0001\u0000"+ + "\u0000\u0000\u00cf\u00d2\u0001\u0000\u0000\u0000\u00d0\u00ce\u0001\u0000"+ + "\u0000\u0000\u00d0\u00d1\u0001\u0000\u0000\u0000\u00d1\u00d3\u0001\u0000"+ + "\u0000\u0000\u00d2\u00d0\u0001\u0000\u0000\u0000\u00d3\u00d4\u0005,\u0000"+ + "\u0000\u00d4\u001d\u0001\u0000\u0000\u0000\u00d5\u00db\u0003 \u0010\u0000"+ + "\u00d6\u00db\u0003&\u0013\u0000\u00d7\u00db\u0003D\"\u0000\u00d8\u00d9"+ + "\u0005\u0019\u0000\u0000\u00d9\u00db\u0003\u001e\u000f\u0000\u00da\u00d5"+ + "\u0001\u0000\u0000\u0000\u00da\u00d6\u0001\u0000\u0000\u0000\u00da\u00d7"+ + "\u0001\u0000\u0000\u0000\u00da\u00d8\u0001\u0000\u0000\u0000\u00db\u001f"+ + "\u0001\u0000\u0000\u0000\u00dc\u00dd\u0006\u0010\uffff\uffff\u0000\u00dd"+ + "\u00de\u0003\"\u0011\u0000\u00de\u00e4\u0001\u0000\u0000\u0000\u00df\u00e0"+ + "\n\u0002\u0000\u0000\u00e0\u00e1\u0005\n\u0000\u0000\u00e1\u00e3\u0003"+ + "\"\u0011\u0000\u00e2\u00df\u0001\u0000\u0000\u0000\u00e3\u00e6\u0001\u0000"+ + "\u0000\u0000\u00e4\u00e2\u0001\u0000\u0000\u0000\u00e4\u00e5\u0001\u0000"+ + "\u0000\u0000\u00e5!\u0001\u0000\u0000\u0000\u00e6\u00e4\u0001\u0000\u0000"+ + "\u0000\u00e7\u00e8\u0006\u0011\uffff\uffff\u0000\u00e8\u00e9\u0003$\u0012"+ + "\u0000\u00e9\u00ef\u0001\u0000\u0000\u0000\u00ea\u00eb\n\u0002\u0000\u0000"+ + "\u00eb\u00ec\u0005\t\u0000\u0000\u00ec\u00ee\u0003$\u0012\u0000\u00ed"+ + "\u00ea\u0001\u0000\u0000\u0000\u00ee\u00f1\u0001\u0000\u0000\u0000\u00ef"+ + "\u00ed\u0001\u0000\u0000\u0000\u00ef\u00f0\u0001\u0000\u0000\u0000\u00f0"+ + "#\u0001\u0000\u0000\u0000\u00f1\u00ef\u0001\u0000\u0000\u0000\u00f2\u00fb"+ + "\u0005*\u0000\u0000\u00f3\u00fb\u0005,\u0000\u0000\u00f4\u00fb\u0003\u001c"+ + "\u000e\u0000\u00f5\u00fb\u0003\u0012\t\u0000\u00f6\u00f7\u0005\u001d\u0000"+ + "\u0000\u00f7\u00f8\u0003 \u0010\u0000\u00f8\u00f9\u0005\u001e\u0000\u0000"+ + "\u00f9\u00fb\u0001\u0000\u0000\u0000\u00fa\u00f2\u0001\u0000\u0000\u0000"+ + "\u00fa\u00f3\u0001\u0000\u0000\u0000\u00fa\u00f4\u0001\u0000\u0000\u0000"+ + "\u00fa\u00f5\u0001\u0000\u0000\u0000\u00fa\u00f6\u0001\u0000\u0000\u0000"+ + "\u00fb%\u0001\u0000\u0000\u0000\u00fc\u00fd\u0003\u0010\b\u0000\u00fd"+ + "\u00fe\u0003(\u0014\u0000\u00fe\u00ff\u0003\u000e\u0007\u0000\u00ff\'"+ + "\u0001\u0000\u0000\u0000\u0100\u0101\u0007\u0000\u0000\u0000\u0101)\u0001"+ + "\u0000\u0000\u0000\u0102\u0104\u0005(\u0000\u0000\u0103\u0105\u0003\u000e"+ + "\u0007\u0000\u0104\u0103\u0001\u0000\u0000\u0000\u0104\u0105\u0001\u0000"+ + "\u0000\u0000\u0105+\u0001\u0000\u0000\u0000\u0106\u0108\u0005\u0003\u0000"+ + "\u0000\u0107\u0106\u0001\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000"+ + "\u0000\u0108\u0109\u0001\u0000\u0000\u0000\u0109\u010a\u0003B!\u0000\u010a"+ + "\u010d\u0005,\u0000\u0000\u010b\u010c\u0005\r\u0000\u0000\u010c\u010e"+ + "\u0003\u000e\u0007\u0000\u010d\u010b\u0001\u0000\u0000\u0000\u010d\u010e"+ + "\u0001\u0000\u0000\u0000\u010e\u010f\u0001\u0000\u0000\u0000\u010f\u0110"+ + "\u0005!\u0000\u0000\u0110-\u0001\u0000\u0000\u0000\u0111\u0115\u0005\u001f"+ + "\u0000\u0000\u0112\u0114\u0003\u0014\n\u0000\u0113\u0112\u0001\u0000\u0000"+ + "\u0000\u0114\u0117\u0001\u0000\u0000\u0000\u0115\u0113\u0001\u0000\u0000"+ + "\u0000\u0115\u0116\u0001\u0000\u0000\u0000\u0116\u0118\u0001\u0000\u0000"+ + "\u0000\u0117\u0115\u0001\u0000\u0000\u0000\u0118\u0119\u0005 \u0000\u0000"+ + "\u0119/\u0001\u0000\u0000\u0000\u011a\u011b\u0005%\u0000\u0000\u011b\u011c"+ + "\u0005\u001d\u0000\u0000\u011c\u011d\u0003\u000e\u0007\u0000\u011d\u011e"+ + "\u0005\u001e\u0000\u0000\u011e\u011f\u0003\u0014\n\u0000\u011f1\u0001"+ + "\u0000\u0000\u0000\u0120\u0122\u00034\u001a\u0000\u0121\u0123\u00036\u001b"+ + "\u0000\u0122\u0121\u0001\u0000\u0000\u0000\u0122\u0123\u0001\u0000\u0000"+ + "\u0000\u01233\u0001\u0000\u0000\u0000\u0124\u0125\u0005&\u0000\u0000\u0125"+ + "\u0126\u0005\u001d\u0000\u0000\u0126\u0127\u0003\u000e\u0007\u0000\u0127"+ + "\u0128\u0005\u001e\u0000\u0000\u0128\u0129\u0003\u0014\n\u0000\u01295"+ + "\u0001\u0000\u0000\u0000\u012a\u012b\u0005\'\u0000\u0000\u012b\u012c\u0003"+ + "\u0014\n\u0000\u012c7\u0001\u0000\u0000\u0000\u012d\u012e\u0003\u0018"+ + "\f\u0000\u012e\u012f\u0005\r\u0000\u0000\u012f\u0130\u0003\u000e\u0007"+ + "\u0000\u01309\u0001\u0000\u0000\u0000\u0131\u0132\u0005)\u0000\u0000\u0132"+ + "\u0133\u0005,\u0000\u0000\u0133\u0134\u0005\u001d\u0000\u0000\u0134\u0135"+ + "\u0003\f\u0006\u0000\u0135\u0136\u0005\u001e\u0000\u0000\u0136;\u0001"+ + "\u0000\u0000\u0000\u0137\u013c\u0005$\u0000\u0000\u0138\u013c\u0003\u001c"+ + "\u000e\u0000\u0139\u013c\u0003:\u001d\u0000\u013a\u013c\u0005,\u0000\u0000"+ + "\u013b\u0137\u0001\u0000\u0000\u0000\u013b\u0138\u0001\u0000\u0000\u0000"+ + "\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013a\u0001\u0000\u0000\u0000"+ + "\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u013e\u0005\u001c\u0000\u0000"+ + "\u013e=\u0001\u0000\u0000\u0000\u013f\u0140\u0005,\u0000\u0000\u0140\u0141"+ + "\u0005\u001d\u0000\u0000\u0141\u0142\u0003\f\u0006\u0000\u0142\u0143\u0005"+ + "\u001e\u0000\u0000\u0143\u0144\u0005\u001c\u0000\u0000\u0144?\u0001\u0000"+ + "\u0000\u0000\u0145\u0146\u0005!\u0000\u0000\u0146A\u0001\u0000\u0000\u0000"+ + "\u0147\u0148\u0007\u0001\u0000\u0000\u0148C\u0001\u0000\u0000\u0000\u0149"+ + "\u014a\u0007\u0002\u0000\u0000\u014aE\u0001\u0000\u0000\u0000\"ILTV[`"+ + "ekot~\u0085\u008c\u008e\u0092\u009b\u009e\u00a3\u00b6\u00bb\u00bf\u00c4"+ + "\u00cb\u00d0\u00da\u00e4\u00ef\u00fa\u0104\u0107\u010d\u0115\u0122\u013b"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/gen/DecafVisitor.java b/src/main/java/gen/DecafVisitor.java index cfe0332..7d5bd62 100644 --- a/src/main/java/gen/DecafVisitor.java +++ b/src/main/java/gen/DecafVisitor.java @@ -202,6 +202,12 @@ public interface DecafVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitReceivingMethod(DecafParser.ReceivingMethodContext ctx); + /** + * Visit a parse tree produced by {@link DecafParser#emptyStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitEmptyStatement(DecafParser.EmptyStatementContext ctx); /** * Visit a parse tree produced by {@link DecafParser#type}. * @param ctx the parse tree