From 839019986650e1a086071bb03eaa09626070f383 Mon Sep 17 00:00:00 2001 From: Joshua Potter Date: Sat, 26 Apr 2014 13:23:14 -0400 Subject: [PATCH] Working compiler. --- README.md | 23 +- docs/PA1.pdf | Bin 155789 -> 0 bytes docs/pa-final.pdf | Bin 0 -> 128765 bytes docs/pa1-updated.pdf | Bin 0 -> 189094 bytes docs/{PA2.pdf => pa2.pdf} | Bin docs/{PA3.pdf => pa3.pdf} | Bin docs/{PA4.pdf => pa4.pdf} | Bin src/mJAM/Test.java | 1 - src/miniJava/AbstractSyntaxTrees/AST.java | 54 +- .../AbstractSyntaxTrees/ASTDisplay.java | 716 ++++++------ .../AbstractSyntaxTrees/ArrayType.java | 50 +- .../AbstractSyntaxTrees/AssignStmt.java | 44 +- .../AbstractSyntaxTrees/BaseType.java | 40 +- .../AbstractSyntaxTrees/BinaryExpr.java | 50 +- .../AbstractSyntaxTrees/BlockStmt.java | 40 +- .../AbstractSyntaxTrees/BooleanLiteral.java | 38 +- .../AbstractSyntaxTrees/CallExpr.java | 44 +- .../AbstractSyntaxTrees/CallStmt.java | 44 +- .../AbstractSyntaxTrees/ClassDecl.java | 52 +- .../AbstractSyntaxTrees/ClassDeclList.java | 64 +- .../AbstractSyntaxTrees/ClassType.java | 46 +- .../AbstractSyntaxTrees/Declaration.java | 56 +- .../AbstractSyntaxTrees/Declarators.java | 6 +- .../AbstractSyntaxTrees/ExprList.java | 62 +- .../AbstractSyntaxTrees/Expression.java | 32 +- .../AbstractSyntaxTrees/FieldDecl.java | 52 +- .../AbstractSyntaxTrees/FieldDeclList.java | 69 +- src/miniJava/AbstractSyntaxTrees/IdRef.java | 44 +- .../AbstractSyntaxTrees/Identifier.java | 44 +- src/miniJava/AbstractSyntaxTrees/IfStmt.java | 62 +- .../AbstractSyntaxTrees/IndexedRef.java | 48 +- .../AbstractSyntaxTrees/IntLiteral.java | 36 +- src/miniJava/AbstractSyntaxTrees/Literal.java | 30 +- .../AbstractSyntaxTrees/LiteralExpr.java | 40 +- .../AbstractSyntaxTrees/LocalDecl.java | 32 +- .../AbstractSyntaxTrees/MemberDecl.java | 54 +- .../AbstractSyntaxTrees/MethodDecl.java | 54 +- .../AbstractSyntaxTrees/MethodDeclList.java | 69 +- .../AbstractSyntaxTrees/NewArrayExpr.java | 44 +- src/miniJava/AbstractSyntaxTrees/NewExpr.java | 30 +- .../AbstractSyntaxTrees/NewObjectExpr.java | 42 +- .../AbstractSyntaxTrees/Operator.java | 45 +- src/miniJava/AbstractSyntaxTrees/Package.java | 44 +- .../AbstractSyntaxTrees/ParameterDecl.java | 38 +- .../ParameterDeclList.java | 69 +- .../AbstractSyntaxTrees/QualifiedRef.java | 50 +- src/miniJava/AbstractSyntaxTrees/RefExpr.java | 42 +- .../AbstractSyntaxTrees/Reference.java | 37 +- .../AbstractSyntaxTrees/Statement.java | 32 +- .../AbstractSyntaxTrees/StatementList.java | 64 +- .../AbstractSyntaxTrees/Terminal.java | 36 +- src/miniJava/AbstractSyntaxTrees/ThisRef.java | 42 +- src/miniJava/AbstractSyntaxTrees/Type.java | 38 +- .../AbstractSyntaxTrees/TypeKind.java | 20 +- .../AbstractSyntaxTrees/UnaryExpr.java | 44 +- src/miniJava/AbstractSyntaxTrees/VarDecl.java | 38 +- .../AbstractSyntaxTrees/VarDeclStmt.java | 46 +- src/miniJava/AbstractSyntaxTrees/Visitor.java | 160 +-- .../AbstractSyntaxTrees/WhileStmt.java | 46 +- src/miniJava/CodeGenerator/Code.java | 55 + src/miniJava/CodeGenerator/Encoder.java | 740 ++++++------ src/miniJava/CodeGenerator/RuntimeEntity.java | 47 +- src/miniJava/Compiler.java | 70 +- src/miniJava/ContextualAnalyzer/Analyzer.java | 1019 ++++++++++------- src/miniJava/ContextualAnalyzer/IdTable.java | 127 ++ .../IdentificationTable.java | 221 ---- src/miniJava/ContextualAnalyzer/Reporter.java | 200 +--- .../Exceptions/IdentificationException.java | 10 - src/miniJava/Exceptions/ParsingException.java | 17 - .../Exceptions/ScanningException.java | 11 - src/miniJava/SyntacticAnalyzer/Parser.java | 901 +++++++++------ .../SyntacticAnalyzer/ParsingException.java | 16 + src/miniJava/SyntacticAnalyzer/Scanner.java | 519 +++++---- .../SyntacticAnalyzer/ScanningException.java | 16 + .../SyntacticAnalyzer/SourcePosition.java | 5 +- src/miniJava/SyntacticAnalyzer/Token.java | 66 +- src/tester/Checkpoint1.java | 71 ++ src/tester/Checkpoint2.java | 98 ++ src/tester/Checkpoint3.java | 73 ++ src/tester/Checkpoint4.java | 112 ++ 80 files changed, 4009 insertions(+), 3488 deletions(-) delete mode 100644 docs/PA1.pdf create mode 100644 docs/pa-final.pdf create mode 100644 docs/pa1-updated.pdf rename docs/{PA2.pdf => pa2.pdf} (100%) rename docs/{PA3.pdf => pa3.pdf} (100%) rename docs/{PA4.pdf => pa4.pdf} (100%) create mode 100644 src/miniJava/CodeGenerator/Code.java create mode 100644 src/miniJava/ContextualAnalyzer/IdTable.java delete mode 100644 src/miniJava/ContextualAnalyzer/IdentificationTable.java delete mode 100644 src/miniJava/Exceptions/IdentificationException.java delete mode 100644 src/miniJava/Exceptions/ParsingException.java delete mode 100644 src/miniJava/Exceptions/ScanningException.java create mode 100644 src/miniJava/SyntacticAnalyzer/ParsingException.java create mode 100644 src/miniJava/SyntacticAnalyzer/ScanningException.java create mode 100644 src/tester/Checkpoint1.java create mode 100644 src/tester/Checkpoint2.java create mode 100644 src/tester/Checkpoint3.java create mode 100644 src/tester/Checkpoint4.java diff --git a/README.md b/README.md index 99535e3..f26ce65 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,19 @@ MiniJava Compiler ================= -[Version 1.0.0 - 04/15/2014] +[Version 1.0.0 - 04/26/2014] -The following is a LL(1) compiler for a subset of Java, denoted MiniJava. As of now, it appears to work for the most -part, passing the regression tests performed after each segment. +The following is a complete MiniJava Compiler implementation, according to the specifications in the docs folder. -Noted bugs: -* Changing a field of an object in an array causes crashes - This is not really a surprise, considering the Contextual Analysis aspect of the project - is in fairly rough shape. - -As of now, I do not plan on implementing more things to this, unless there is some potential for extra credit. +Other Features to include in future releases +-------------------------------------------- +* Static Field Initialization +* Keyword 'null' +* Support class constructors +* 'for' loop +* String type and string literals +* Code generation for conditional operations && and || +* Overloaded methods +* Inheritance of fields and methods +* Dynamic Method Invocation +* Support for instanceof/super diff --git a/docs/PA1.pdf b/docs/PA1.pdf deleted file mode 100644 index b934180e0ae4acd225ef66e06e6a82bfa7b5de44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155789 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

1^F8Tc$o+3c`^h4Ebt8>V||_tuX*W`&T8gZ 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

h*}}yPlAA4W!JSytmS7o#F}f((4fSCF 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 literal 0 HcmV?d00001 diff --git a/docs/pa1-updated.pdf b/docs/pa1-updated.pdf new file mode 100644 index 0000000000000000000000000000000000000000..827a8324e86c65c6f8a622a34d9df86f8653846a GIT binary patch literal 189094 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 z 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 Z+uA$Zf{oCSfk1XNWJ*d=IWaWk{|7+aDu@68 literal 0 HcmV?d00001 diff --git a/docs/PA2.pdf b/docs/pa2.pdf similarity index 100% rename from docs/PA2.pdf rename to docs/pa2.pdf diff --git a/docs/PA3.pdf b/docs/pa3.pdf similarity index 100% rename from docs/PA3.pdf rename to docs/pa3.pdf diff --git a/docs/PA4.pdf b/docs/pa4.pdf similarity index 100% rename from docs/PA4.pdf rename to docs/pa4.pdf diff --git a/src/mJAM/Test.java b/src/mJAM/Test.java index b886ca9..c3b0d66 100644 --- a/src/mJAM/Test.java +++ b/src/mJAM/Test.java @@ -151,7 +151,6 @@ public class Test /* run code */ System.out.println("Running code ... "); Interpreter.debug(objectCodeFileName, asmCodeFileName); - // Interpreter.interpret(objectCodeFileName); System.out.println("*** mJAM execution completed"); } diff --git a/src/miniJava/AbstractSyntaxTrees/AST.java b/src/miniJava/AbstractSyntaxTrees/AST.java index 9303c82..5982b3f 100644 --- a/src/miniJava/AbstractSyntaxTrees/AST.java +++ b/src/miniJava/AbstractSyntaxTrees/AST.java @@ -1,27 +1,27 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public abstract class AST { - - public AST(SourcePosition posn) { - this.posn = posn; - } - - public String toString() { - String fullClassName = this.getClass().getName(); - String cn = fullClassName.substring(1 + fullClassName.lastIndexOf('.')); - if (ASTDisplay.showPosition) - cn = cn + " " + posn.toString(); - return cn; - } - - public abstract R visit(Visitor v, A o); - - public SourcePosition posn; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class AST { + + public AST(SourcePosition posn) { + this.posn = posn; + } + + public String toString() { + String fullClassName = this.getClass().getName(); + String cn = fullClassName.substring(1 + fullClassName.lastIndexOf('.')); + if (ASTDisplay.showPosition) + cn = cn + " " + posn.toString(); + return cn; + } + + public abstract R visit(Visitor v, A o); + + public SourcePosition posn; +} diff --git a/src/miniJava/AbstractSyntaxTrees/ASTDisplay.java b/src/miniJava/AbstractSyntaxTrees/ASTDisplay.java index e0daf6b..08d18db 100644 --- a/src/miniJava/AbstractSyntaxTrees/ASTDisplay.java +++ b/src/miniJava/AbstractSyntaxTrees/ASTDisplay.java @@ -1,358 +1,358 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -/* - * Display AST in text form - * In-order traversal of AST, visiting each node with a method of the form - * - * public Object visitXXX( XXX astnode, String arg) - * - * where arg is a prefix string (indentation) to precede display of ast node - * and a null Object is returned as the result. - * - * implements Visitor - */ -public class ASTDisplay implements Visitor { - - public static boolean showPosition = false; - - /** - * print text representation of AST to stdout - * - * @param ast - * root node of AST - */ - public void showTree(AST ast) { - System.out.println("======= AST Display ========================="); - ast.visit(this, ""); - System.out.println("============================================="); - } - - // methods to format output - - /** - * display arbitrary text for a node - * - * @param prefix - * spacing to indicate depth in AST - * @param text - * preformatted node display - */ - private void show(String prefix, String text) { - System.out.println(prefix + text); - } - - /** - * display AST node by name - * - * @param prefix - * spacing to indicate depth in AST - * @param node - * AST node, will be shown by name - */ - private void show(String prefix, AST node) { - System.out.println(prefix + node.toString()); - } - - /** - * quote a string - * - * @param text - * string to quote - */ - private String quote(String text) { - return ("\"" + text + "\""); - } - - /** - * increase depth in AST - * - * @param prefix - * current spacing to indicate depth in AST - * @return new spacing - */ - private String indent(String prefix) { - return prefix + " "; - } - - // ///////////////////////////////////////////////////////////////////////////// - // - // PACKAGE - // - // ///////////////////////////////////////////////////////////////////////////// - - public Object visitPackage(Package prog, String arg) { - show(arg, prog); - ClassDeclList cl = prog.classDeclList; - show(arg, " ClassDeclList [" + cl.size() + "]"); - String pfx = arg + " . "; - for (ClassDecl c : prog.classDeclList) { - c.visit(this, pfx); - } - return null; - } - - // ///////////////////////////////////////////////////////////////////////////// - // - // DECLARATIONS - // - // ///////////////////////////////////////////////////////////////////////////// - - public Object visitClassDecl(ClassDecl clas, String arg) { - show(arg, clas); - show(indent(arg), quote(clas.name) + " classname"); - show(arg, " FieldDeclList [" + clas.fieldDeclList.size() + "]"); - String pfx = arg + " . "; - for (FieldDecl f : clas.fieldDeclList) - f.visit(this, pfx); - show(arg, " MethodDeclList [" + clas.methodDeclList.size() + "]"); - for (MethodDecl m : clas.methodDeclList) - m.visit(this, pfx); - return null; - } - - public Object visitFieldDecl(FieldDecl f, String arg) { - show(arg, "(" + (f.isPrivate ? "private" : "public") - + (f.isStatic ? " static) " : ") ") + f.toString()); - f.type.visit(this, indent(arg)); - show(indent(arg), quote(f.name) + " fieldname"); - return null; - } - - public Object visitMethodDecl(MethodDecl m, String arg) { - show(arg, "(" + (m.isPrivate ? "private" : "public") - + (m.isStatic ? " static) " : ") ") + m.toString()); - m.type.visit(this, indent(arg)); - show(indent(arg), quote(m.name) + " methodname"); - ParameterDeclList pdl = m.parameterDeclList; - show(arg, " ParameterDeclList [" + pdl.size() + "]"); - String pfx = ((String) arg) + " . "; - for (ParameterDecl pd : pdl) { - pd.visit(this, pfx); - } - StatementList sl = m.statementList; - show(arg, " StmtList [" + sl.size() + "]"); - for (Statement s : sl) { - s.visit(this, pfx); - } - if (m.returnExp != null) { - m.returnExp.visit(this, indent(arg)); - } - return null; - } - - public Object visitParameterDecl(ParameterDecl pd, String arg) { - show(arg, pd); - pd.type.visit(this, indent(arg)); - show(indent(arg), quote(pd.name) + "parametername "); - return null; - } - - public Object visitVarDecl(VarDecl vd, String arg) { - show(arg, vd); - vd.type.visit(this, indent(arg)); - show(indent(arg), quote(vd.name) + " varname"); - return null; - } - - // ///////////////////////////////////////////////////////////////////////////// - // - // TYPES - // - // ///////////////////////////////////////////////////////////////////////////// - - public Object visitBaseType(BaseType type, String arg) { - show(arg, type.typeKind + " " + type.toString()); - return null; - } - - public Object visitClassType(ClassType type, String arg) { - show(arg, type); - show(indent(arg), quote(type.className.spelling) + " classname"); - return null; - } - - public Object visitArrayType(ArrayType type, String arg) { - show(arg, type); - type.eltType.visit(this, indent(arg)); - return null; - } - - // ///////////////////////////////////////////////////////////////////////////// - // - // STATEMENTS - // - // ///////////////////////////////////////////////////////////////////////////// - - public Object visitBlockStmt(BlockStmt stmt, String arg) { - show(arg, stmt); - StatementList sl = stmt.sl; - show(arg, " StatementList [" + sl.size() + "]"); - String pfx = arg + " . "; - for (Statement s : sl) { - s.visit(this, pfx); - } - return null; - } - - public Object visitVardeclStmt(VarDeclStmt stmt, String arg) { - show(arg, stmt); - stmt.varDecl.visit(this, indent(arg)); - stmt.initExp.visit(this, indent(arg)); - return null; - } - - public Object visitAssignStmt(AssignStmt stmt, String arg) { - show(arg, stmt); - stmt.ref.visit(this, indent(arg)); - stmt.val.visit(this, indent(arg)); - return null; - } - - public Object visitCallStmt(CallStmt stmt, String arg) { - show(arg, stmt); - stmt.methodRef.visit(this, indent(arg)); - ExprList al = stmt.argList; - show(arg, " ExprList [" + al.size() + "]"); - String pfx = arg + " . "; - for (Expression e : al) { - e.visit(this, pfx); - } - return null; - } - - public Object visitIfStmt(IfStmt stmt, String arg) { - show(arg, stmt); - stmt.cond.visit(this, indent(arg)); - stmt.thenStmt.visit(this, indent(arg)); - if (stmt.elseStmt != null) - stmt.elseStmt.visit(this, indent(arg)); - return null; - } - - public Object visitWhileStmt(WhileStmt stmt, String arg) { - show(arg, stmt); - stmt.cond.visit(this, indent(arg)); - stmt.body.visit(this, indent(arg)); - return null; - } - - // ///////////////////////////////////////////////////////////////////////////// - // - // EXPRESSIONS - // - // ///////////////////////////////////////////////////////////////////////////// - - public Object visitUnaryExpr(UnaryExpr expr, String arg) { - show(arg, expr); - expr.operator.visit(this, indent(arg)); - expr.expr.visit(this, indent(indent(arg))); - return null; - } - - public Object visitBinaryExpr(BinaryExpr expr, String arg) { - show(arg, expr); - expr.operator.visit(this, indent(arg)); - expr.left.visit(this, indent(indent(arg))); - expr.right.visit(this, indent(indent(arg))); - return null; - } - - public Object visitRefExpr(RefExpr expr, String arg) { - show(arg, expr); - expr.ref.visit(this, indent(arg)); - return null; - } - - public Object visitCallExpr(CallExpr expr, String arg) { - show(arg, expr); - expr.functionRef.visit(this, indent(arg)); - ExprList al = expr.argList; - show(arg, " ExprList + [" + al.size() + "]"); - String pfx = arg + " . "; - for (Expression e : al) { - e.visit(this, pfx); - } - return null; - } - - public Object visitLiteralExpr(LiteralExpr expr, String arg) { - show(arg, expr); - expr.literal.visit(this, indent(arg)); - return null; - } - - public Object visitNewArrayExpr(NewArrayExpr expr, String arg) { - show(arg, expr); - expr.eltType.visit(this, indent(arg)); - expr.sizeExpr.visit(this, indent(arg)); - return null; - } - - public Object visitNewObjectExpr(NewObjectExpr expr, String arg) { - show(arg, expr); - expr.classtype.visit(this, indent(arg)); - return null; - } - - // ///////////////////////////////////////////////////////////////////////////// - // - // REFERENCES - // - // ///////////////////////////////////////////////////////////////////////////// - - public Object visitQualifiedRef(QualifiedRef qr, String arg) { - show(arg, qr); - qr.id.visit(this, indent(arg)); - qr.ref.visit(this, indent(arg)); - return null; - } - - public Object visitIndexedRef(IndexedRef ir, String arg) { - show(arg, ir); - ir.indexExpr.visit(this, indent(arg)); - ir.ref.visit(this, indent(arg)); - return null; - } - - public Object visitIdRef(IdRef ref, String arg) { - show(arg, ref); - ref.id.visit(this, indent(arg)); - return null; - } - - public Object visitThisRef(ThisRef ref, String arg) { - show(arg, ref); - return null; - } - - // ///////////////////////////////////////////////////////////////////////////// - // - // TERMINALS - // - // ///////////////////////////////////////////////////////////////////////////// - - public Object visitIdentifier(Identifier id, String arg) { - show(arg, quote(id.spelling) + " " + id.toString()); - return null; - } - - public Object visitOperator(Operator op, String arg) { - show(arg, quote(op.spelling) + " " + op.toString()); - return null; - } - - public Object visitIntLiteral(IntLiteral num, String arg) { - show(arg, quote(num.spelling) + " " + num.toString()); - return null; - } - - public Object visitBooleanLiteral(BooleanLiteral bool, String arg) { - show(arg, quote(bool.spelling) + " " + bool.toString()); - return null; - } -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +/* + * Display AST in text form + * In-order traversal of AST, visiting each node with a method of the form + * + * public Object visitXXX( XXX astnode, String arg) + * + * where arg is a prefix string (indentation) to precede display of ast node + * and a null Object is returned as the result. + * + * implements Visitor + */ +public class ASTDisplay implements Visitor { + + public static boolean showPosition = false; + + /** + * print text representation of AST to stdout + * + * @param ast + * root node of AST + */ + public void showTree(AST ast) { + System.out.println("======= AST Display ========================="); + ast.visit(this, ""); + System.out.println("============================================="); + } + + // methods to format output + + /** + * display arbitrary text for a node + * + * @param prefix + * spacing to indicate depth in AST + * @param text + * preformatted node display + */ + private void show(String prefix, String text) { + System.out.println(prefix + text); + } + + /** + * display AST node by name + * + * @param prefix + * spacing to indicate depth in AST + * @param node + * AST node, will be shown by name + */ + private void show(String prefix, AST node) { + System.out.println(prefix + node.toString()); + } + + /** + * quote a string + * + * @param text + * string to quote + */ + private String quote(String text) { + return ("\"" + text + "\""); + } + + /** + * increase depth in AST + * + * @param prefix + * current spacing to indicate depth in AST + * @return new spacing + */ + private String indent(String prefix) { + return prefix + " "; + } + + // ///////////////////////////////////////////////////////////////////////////// + // + // PACKAGE + // + // ///////////////////////////////////////////////////////////////////////////// + + public Object visitPackage(Package prog, String arg) { + show(arg, prog); + ClassDeclList cl = prog.classDeclList; + show(arg, " ClassDeclList [" + cl.size() + "]"); + String pfx = arg + " . "; + for (ClassDecl c : prog.classDeclList) { + c.visit(this, pfx); + } + return null; + } + + // ///////////////////////////////////////////////////////////////////////////// + // + // DECLARATIONS + // + // ///////////////////////////////////////////////////////////////////////////// + + public Object visitClassDecl(ClassDecl clas, String arg) { + show(arg, clas); + show(indent(arg), quote(clas.name) + " classname"); + show(arg, " FieldDeclList [" + clas.fieldDeclList.size() + "]"); + String pfx = arg + " . "; + for (FieldDecl f : clas.fieldDeclList) + f.visit(this, pfx); + show(arg, " MethodDeclList [" + clas.methodDeclList.size() + "]"); + for (MethodDecl m : clas.methodDeclList) + m.visit(this, pfx); + return null; + } + + public Object visitFieldDecl(FieldDecl f, String arg) { + show(arg, "(" + (f.isPrivate ? "private" : "public") + + (f.isStatic ? " static) " : ") ") + f.toString()); + f.type.visit(this, indent(arg)); + show(indent(arg), quote(f.name) + " fieldname"); + return null; + } + + public Object visitMethodDecl(MethodDecl m, String arg) { + show(arg, "(" + (m.isPrivate ? "private" : "public") + + (m.isStatic ? " static) " : ") ") + m.toString()); + m.type.visit(this, indent(arg)); + show(indent(arg), quote(m.name) + " methodname"); + ParameterDeclList pdl = m.parameterDeclList; + show(arg, " ParameterDeclList [" + pdl.size() + "]"); + String pfx = ((String) arg) + " . "; + for (ParameterDecl pd : pdl) { + pd.visit(this, pfx); + } + StatementList sl = m.statementList; + show(arg, " StmtList [" + sl.size() + "]"); + for (Statement s : sl) { + s.visit(this, pfx); + } + if (m.returnExp != null) { + m.returnExp.visit(this, indent(arg)); + } + return null; + } + + public Object visitParameterDecl(ParameterDecl pd, String arg) { + show(arg, pd); + pd.type.visit(this, indent(arg)); + show(indent(arg), quote(pd.name) + "parametername "); + return null; + } + + public Object visitVarDecl(VarDecl vd, String arg) { + show(arg, vd); + vd.type.visit(this, indent(arg)); + show(indent(arg), quote(vd.name) + " varname"); + return null; + } + + // ///////////////////////////////////////////////////////////////////////////// + // + // TYPES + // + // ///////////////////////////////////////////////////////////////////////////// + + public Object visitBaseType(BaseType type, String arg) { + show(arg, type.typeKind + " " + type.toString()); + return null; + } + + public Object visitClassType(ClassType type, String arg) { + show(arg, type); + show(indent(arg), quote(type.className.spelling) + " classname"); + return null; + } + + public Object visitArrayType(ArrayType type, String arg) { + show(arg, type); + type.eltType.visit(this, indent(arg)); + return null; + } + + // ///////////////////////////////////////////////////////////////////////////// + // + // STATEMENTS + // + // ///////////////////////////////////////////////////////////////////////////// + + public Object visitBlockStmt(BlockStmt stmt, String arg) { + show(arg, stmt); + StatementList sl = stmt.sl; + show(arg, " StatementList [" + sl.size() + "]"); + String pfx = arg + " . "; + for (Statement s : sl) { + s.visit(this, pfx); + } + return null; + } + + public Object visitVardeclStmt(VarDeclStmt stmt, String arg) { + show(arg, stmt); + stmt.varDecl.visit(this, indent(arg)); + stmt.initExp.visit(this, indent(arg)); + return null; + } + + public Object visitAssignStmt(AssignStmt stmt, String arg) { + show(arg, stmt); + stmt.ref.visit(this, indent(arg)); + stmt.val.visit(this, indent(arg)); + return null; + } + + public Object visitCallStmt(CallStmt stmt, String arg) { + show(arg, stmt); + stmt.methodRef.visit(this, indent(arg)); + ExprList al = stmt.argList; + show(arg, " ExprList [" + al.size() + "]"); + String pfx = arg + " . "; + for (Expression e : al) { + e.visit(this, pfx); + } + return null; + } + + public Object visitIfStmt(IfStmt stmt, String arg) { + show(arg, stmt); + stmt.cond.visit(this, indent(arg)); + stmt.thenStmt.visit(this, indent(arg)); + if (stmt.elseStmt != null) + stmt.elseStmt.visit(this, indent(arg)); + return null; + } + + public Object visitWhileStmt(WhileStmt stmt, String arg) { + show(arg, stmt); + stmt.cond.visit(this, indent(arg)); + stmt.body.visit(this, indent(arg)); + return null; + } + + // ///////////////////////////////////////////////////////////////////////////// + // + // EXPRESSIONS + // + // ///////////////////////////////////////////////////////////////////////////// + + public Object visitUnaryExpr(UnaryExpr expr, String arg) { + show(arg, expr); + expr.operator.visit(this, indent(arg)); + expr.expr.visit(this, indent(indent(arg))); + return null; + } + + public Object visitBinaryExpr(BinaryExpr expr, String arg) { + show(arg, expr); + expr.operator.visit(this, indent(arg)); + expr.left.visit(this, indent(indent(arg))); + expr.right.visit(this, indent(indent(arg))); + return null; + } + + public Object visitRefExpr(RefExpr expr, String arg) { + show(arg, expr); + expr.ref.visit(this, indent(arg)); + return null; + } + + public Object visitCallExpr(CallExpr expr, String arg) { + show(arg, expr); + expr.functionRef.visit(this, indent(arg)); + ExprList al = expr.argList; + show(arg, " ExprList + [" + al.size() + "]"); + String pfx = arg + " . "; + for (Expression e : al) { + e.visit(this, pfx); + } + return null; + } + + public Object visitLiteralExpr(LiteralExpr expr, String arg) { + show(arg, expr); + expr.literal.visit(this, indent(arg)); + return null; + } + + public Object visitNewArrayExpr(NewArrayExpr expr, String arg) { + show(arg, expr); + expr.eltType.visit(this, indent(arg)); + expr.sizeExpr.visit(this, indent(arg)); + return null; + } + + public Object visitNewObjectExpr(NewObjectExpr expr, String arg) { + show(arg, expr); + expr.classtype.visit(this, indent(arg)); + return null; + } + + // ///////////////////////////////////////////////////////////////////////////// + // + // REFERENCES + // + // ///////////////////////////////////////////////////////////////////////////// + + public Object visitQualifiedRef(QualifiedRef qr, String arg) { + show(arg, qr); + qr.id.visit(this, indent(arg)); + qr.ref.visit(this, indent(arg)); + return null; + } + + public Object visitIndexedRef(IndexedRef ir, String arg) { + show(arg, ir); + ir.indexExpr.visit(this, indent(arg)); + ir.ref.visit(this, indent(arg)); + return null; + } + + public Object visitIdRef(IdRef ref, String arg) { + show(arg, ref); + ref.id.visit(this, indent(arg)); + return null; + } + + public Object visitThisRef(ThisRef ref, String arg) { + show(arg, ref); + return null; + } + + // ///////////////////////////////////////////////////////////////////////////// + // + // TERMINALS + // + // ///////////////////////////////////////////////////////////////////////////// + + public Object visitIdentifier(Identifier id, String arg) { + show(arg, quote(id.spelling) + " " + id.toString()); + return null; + } + + public Object visitOperator(Operator op, String arg) { + show(arg, quote(op.spelling) + " " + op.toString()); + return null; + } + + public Object visitIntLiteral(IntLiteral num, String arg) { + show(arg, quote(num.spelling) + " " + num.toString()); + return null; + } + + public Object visitBooleanLiteral(BooleanLiteral bool, String arg) { + show(arg, quote(bool.spelling) + " " + bool.toString()); + return null; + } +} diff --git a/src/miniJava/AbstractSyntaxTrees/ArrayType.java b/src/miniJava/AbstractSyntaxTrees/ArrayType.java index bee4008..3275a14 100644 --- a/src/miniJava/AbstractSyntaxTrees/ArrayType.java +++ b/src/miniJava/AbstractSyntaxTrees/ArrayType.java @@ -1,23 +1,27 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ - -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class ArrayType extends Type { - - public ArrayType(Type eltType, SourcePosition posn) { - super(TypeKind.ARRAY, posn); - this.eltType = eltType; - } - - public R visit(Visitor v, A o) { - return v.visitArrayType(this, o); - } - - public Type eltType; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ + +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class ArrayType extends Type { + + public ArrayType(Type eltType, SourcePosition posn) { + super(TypeKind.ARRAY, posn); + this.eltType = eltType; + } + + public R visit(Visitor v, A o) { + return v.visitArrayType(this, o); + } + + public String toString() { + return eltType + " Array"; + } + + public Type eltType; +} diff --git a/src/miniJava/AbstractSyntaxTrees/AssignStmt.java b/src/miniJava/AbstractSyntaxTrees/AssignStmt.java index cc78e3f..d7c3d44 100644 --- a/src/miniJava/AbstractSyntaxTrees/AssignStmt.java +++ b/src/miniJava/AbstractSyntaxTrees/AssignStmt.java @@ -1,23 +1,23 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class AssignStmt extends Statement { - public AssignStmt(Reference r, Expression e, SourcePosition posn) { - super(posn); - ref = r; - val = e; - } - - public R visit(Visitor v, A o) { - return v.visitAssignStmt(this, o); - } - - public Reference ref; - public Expression val; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class AssignStmt extends Statement { + public AssignStmt(Reference r, Expression e, SourcePosition posn) { + super(posn); + ref = r; + val = e; + } + + public R visit(Visitor v, A o) { + return v.visitAssignStmt(this, o); + } + + public Reference ref; + public Expression val; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/BaseType.java b/src/miniJava/AbstractSyntaxTrees/BaseType.java index d39fe5b..69bc9af 100644 --- a/src/miniJava/AbstractSyntaxTrees/BaseType.java +++ b/src/miniJava/AbstractSyntaxTrees/BaseType.java @@ -1,18 +1,22 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class BaseType extends Type { - public BaseType(TypeKind t, SourcePosition posn) { - super(t, posn); - } - - public R visit(Visitor v, A o) { - return v.visitBaseType(this, o); - } -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class BaseType extends Type { + public BaseType(TypeKind t, SourcePosition posn) { + super(t, posn); + } + + public R visit(Visitor v, A o) { + return v.visitBaseType(this, o); + } + + public String toString() { + return typeKind.toString(); + } +} diff --git a/src/miniJava/AbstractSyntaxTrees/BinaryExpr.java b/src/miniJava/AbstractSyntaxTrees/BinaryExpr.java index 4488c19..cb925a5 100644 --- a/src/miniJava/AbstractSyntaxTrees/BinaryExpr.java +++ b/src/miniJava/AbstractSyntaxTrees/BinaryExpr.java @@ -1,26 +1,26 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class BinaryExpr extends Expression { - public BinaryExpr(Operator o, Expression e1, Expression e2, - SourcePosition posn) { - super(posn); - operator = o; - left = e1; - right = e2; - } - - public R visit(Visitor v, A o) { - return v.visitBinaryExpr(this, o); - } - - public Operator operator; - public Expression left; - public Expression right; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class BinaryExpr extends Expression { + public BinaryExpr(Operator o, Expression e1, Expression e2, + SourcePosition posn) { + super(posn); + operator = o; + left = e1; + right = e2; + } + + public R visit(Visitor v, A o) { + return v.visitBinaryExpr(this, o); + } + + public Operator operator; + public Expression left; + public Expression right; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/BlockStmt.java b/src/miniJava/AbstractSyntaxTrees/BlockStmt.java index 1a4e2d9..a2c7459 100644 --- a/src/miniJava/AbstractSyntaxTrees/BlockStmt.java +++ b/src/miniJava/AbstractSyntaxTrees/BlockStmt.java @@ -1,21 +1,21 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class BlockStmt extends Statement { - public BlockStmt(StatementList sl, SourcePosition posn) { - super(posn); - this.sl = sl; - } - - public R visit(Visitor v, A o) { - return v.visitBlockStmt(this, o); - } - - public StatementList sl; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class BlockStmt extends Statement { + public BlockStmt(StatementList sl, SourcePosition posn) { + super(posn); + this.sl = sl; + } + + public R visit(Visitor v, A o) { + return v.visitBlockStmt(this, o); + } + + public StatementList sl; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/BooleanLiteral.java b/src/miniJava/AbstractSyntaxTrees/BooleanLiteral.java index d0b4302..669c205 100644 --- a/src/miniJava/AbstractSyntaxTrees/BooleanLiteral.java +++ b/src/miniJava/AbstractSyntaxTrees/BooleanLiteral.java @@ -1,19 +1,19 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class BooleanLiteral extends Literal { - - public BooleanLiteral(String spelling, SourcePosition posn) { - super(spelling, posn); - } - - public R visit(Visitor v, A o) { - return v.visitBooleanLiteral(this, o); - } -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class BooleanLiteral extends Literal { + + public BooleanLiteral(String spelling, SourcePosition posn) { + super(spelling, posn); + } + + public R visit(Visitor v, A o) { + return v.visitBooleanLiteral(this, o); + } +} diff --git a/src/miniJava/AbstractSyntaxTrees/CallExpr.java b/src/miniJava/AbstractSyntaxTrees/CallExpr.java index 5aaa41f..d17ba9f 100644 --- a/src/miniJava/AbstractSyntaxTrees/CallExpr.java +++ b/src/miniJava/AbstractSyntaxTrees/CallExpr.java @@ -1,23 +1,23 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class CallExpr extends Expression { - public CallExpr(Reference f, ExprList el, SourcePosition posn) { - super(posn); - functionRef = f; - argList = el; - } - - public R visit(Visitor v, A o) { - return v.visitCallExpr(this, o); - } - - public Reference functionRef; - public ExprList argList; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class CallExpr extends Expression { + public CallExpr(Reference f, ExprList el, SourcePosition posn) { + super(posn); + functionRef = f; + argList = el; + } + + public R visit(Visitor v, A o) { + return v.visitCallExpr(this, o); + } + + public Reference functionRef; + public ExprList argList; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/CallStmt.java b/src/miniJava/AbstractSyntaxTrees/CallStmt.java index 966f984..2353a82 100644 --- a/src/miniJava/AbstractSyntaxTrees/CallStmt.java +++ b/src/miniJava/AbstractSyntaxTrees/CallStmt.java @@ -1,23 +1,23 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class CallStmt extends Statement { - public CallStmt(Reference m, ExprList el, SourcePosition posn) { - super(posn); - methodRef = m; - argList = el; - } - - public R visit(Visitor v, A o) { - return v.visitCallStmt(this, o); - } - - public Reference methodRef; - public ExprList argList; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class CallStmt extends Statement { + public CallStmt(Reference m, ExprList el, SourcePosition posn) { + super(posn); + methodRef = m; + argList = el; + } + + public R visit(Visitor v, A o) { + return v.visitCallStmt(this, o); + } + + public Reference methodRef; + public ExprList argList; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/ClassDecl.java b/src/miniJava/AbstractSyntaxTrees/ClassDecl.java index 39a96be..d99706c 100644 --- a/src/miniJava/AbstractSyntaxTrees/ClassDecl.java +++ b/src/miniJava/AbstractSyntaxTrees/ClassDecl.java @@ -1,27 +1,25 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class ClassDecl extends Declaration { - - public ClassDecl(String cn, FieldDeclList fdl, MethodDeclList mdl, SourcePosition posn) { - super(cn, null, posn); - fieldDeclList = fdl; - methodDeclList = mdl; - - Identifier ident = new Identifier(cn, posn); - type = new ClassType(ident, posn); - } - - public R visit(Visitor v, A o) { - return v.visitClassDecl(this, o); - } - - public FieldDeclList fieldDeclList; - public MethodDeclList methodDeclList; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class ClassDecl extends Declaration { + + public ClassDecl(String cn, FieldDeclList fdl, MethodDeclList mdl, + SourcePosition posn) { + super(cn, null, posn); + fieldDeclList = fdl; + methodDeclList = mdl; + } + + public R visit(Visitor v, A o) { + return v.visitClassDecl(this, o); + } + + public FieldDeclList fieldDeclList; + public MethodDeclList methodDeclList; +} diff --git a/src/miniJava/AbstractSyntaxTrees/ClassDeclList.java b/src/miniJava/AbstractSyntaxTrees/ClassDeclList.java index 64dd757..495908d 100644 --- a/src/miniJava/AbstractSyntaxTrees/ClassDeclList.java +++ b/src/miniJava/AbstractSyntaxTrees/ClassDeclList.java @@ -1,32 +1,32 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import java.util.*; - -public class ClassDeclList implements Iterable { - public ClassDeclList() { - classDeclList = new ArrayList(); - } - - public void add(ClassDecl cd) { - classDeclList.add(cd); - } - - public ClassDecl get(int i) { - return classDeclList.get(i); - } - - public int size() { - return classDeclList.size(); - } - - public Iterator iterator() { - return classDeclList.iterator(); - } - - private List classDeclList; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import java.util.*; + +public class ClassDeclList implements Iterable { + public ClassDeclList() { + classDeclList = new ArrayList(); + } + + public void add(ClassDecl cd) { + classDeclList.add(cd); + } + + public ClassDecl get(int i) { + return classDeclList.get(i); + } + + public int size() { + return classDeclList.size(); + } + + public Iterator iterator() { + return classDeclList.iterator(); + } + + private List classDeclList; +} diff --git a/src/miniJava/AbstractSyntaxTrees/ClassType.java b/src/miniJava/AbstractSyntaxTrees/ClassType.java index 0c2c312..b1e8df9 100644 --- a/src/miniJava/AbstractSyntaxTrees/ClassType.java +++ b/src/miniJava/AbstractSyntaxTrees/ClassType.java @@ -1,21 +1,25 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class ClassType extends Type { - public ClassType(Identifier cn, SourcePosition posn) { - super(TypeKind.CLASS, posn); - className = cn; - } - - public R visit(Visitor v, A o) { - return v.visitClassType(this, o); - } - - public Identifier className; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class ClassType extends Type { + public ClassType(Identifier cn, SourcePosition posn) { + super(TypeKind.CLASS, posn); + className = cn; + } + + public R visit(Visitor v, A o) { + return v.visitClassType(this, o); + } + + public String toString() { + return "Class " + className.spelling; + } + + public Identifier className; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Declaration.java b/src/miniJava/AbstractSyntaxTrees/Declaration.java index a412631..05f6021 100644 --- a/src/miniJava/AbstractSyntaxTrees/Declaration.java +++ b/src/miniJava/AbstractSyntaxTrees/Declaration.java @@ -1,32 +1,24 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.CodeGenerator.RuntimeEntity; -import miniJava.SyntacticAnalyzer.SourcePosition; - -public abstract class Declaration extends AST { - - public Declaration(String name, Type type, SourcePosition posn) { - super(posn); - this.name = name; - this.type = type; - } - - @Override - public String toString() { - if (posn != null) { - return this.name + "(Line: " + posn.line + ", Column: " + posn.col - + ")"; - } else { - return super.toString(); - } - } - - public RuntimeEntity entity; - public String name; - public Type type; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.CodeGenerator.RuntimeEntity; +import miniJava.ContextualAnalyzer.IdTable; +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class Declaration extends AST { + + public Declaration(String name, Type type, SourcePosition posn) { + super(posn); + this.name = name; + this.type = type; + } + + public RuntimeEntity entity; + public IdTable table; + public String name; + public Type type; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Declarators.java b/src/miniJava/AbstractSyntaxTrees/Declarators.java index 3f10afb..e6c3a0e 100644 --- a/src/miniJava/AbstractSyntaxTrees/Declarators.java +++ b/src/miniJava/AbstractSyntaxTrees/Declarators.java @@ -2,6 +2,10 @@ package miniJava.AbstractSyntaxTrees; import miniJava.SyntacticAnalyzer.SourcePosition; +/** + * The following is a custom class, included for use with method and field + * declarations. + */ public class Declarators { public Declarators(boolean isPrivate, boolean isStatic, Type mt, @@ -16,4 +20,4 @@ public class Declarators { public boolean isStatic; public Type mt; public SourcePosition posn; -} +} \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/ExprList.java b/src/miniJava/AbstractSyntaxTrees/ExprList.java index 3aa9cf8..a30054f 100644 --- a/src/miniJava/AbstractSyntaxTrees/ExprList.java +++ b/src/miniJava/AbstractSyntaxTrees/ExprList.java @@ -1,32 +1,32 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import java.util.*; - -public class ExprList implements Iterable { - public ExprList() { - elist = new ArrayList(); - } - - public void add(Expression e) { - elist.add(e); - } - - public Expression get(int i) { - return elist.get(i); - } - - public int size() { - return elist.size(); - } - - public Iterator iterator() { - return elist.iterator(); - } - - private List elist; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import java.util.*; + +public class ExprList implements Iterable { + public ExprList() { + elist = new ArrayList(); + } + + public void add(Expression e) { + elist.add(e); + } + + public Expression get(int i) { + return elist.get(i); + } + + public int size() { + return elist.size(); + } + + public Iterator iterator() { + return elist.iterator(); + } + + private List elist; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/Expression.java b/src/miniJava/AbstractSyntaxTrees/Expression.java index 7086815..34912ee 100644 --- a/src/miniJava/AbstractSyntaxTrees/Expression.java +++ b/src/miniJava/AbstractSyntaxTrees/Expression.java @@ -1,16 +1,16 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public abstract class Expression extends AST { - - public Expression(SourcePosition posn) { - super(posn); - } - -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class Expression extends AST { + + public Expression(SourcePosition posn) { + super(posn); + } + +} diff --git a/src/miniJava/AbstractSyntaxTrees/FieldDecl.java b/src/miniJava/AbstractSyntaxTrees/FieldDecl.java index 12a11f7..ee7e71e 100644 --- a/src/miniJava/AbstractSyntaxTrees/FieldDecl.java +++ b/src/miniJava/AbstractSyntaxTrees/FieldDecl.java @@ -1,24 +1,28 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class FieldDecl extends MemberDecl { - - public FieldDecl(boolean isPrivate, boolean isStatic, Type t, String name, - SourcePosition posn) { - super(isPrivate, isStatic, t, name, posn); - } - - public FieldDecl(MemberDecl md, SourcePosition posn) { - super(md, posn); - } - - public R visit(Visitor v, A o) { - return v.visitFieldDecl(this, o); - } -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class FieldDecl extends MemberDecl { + + public FieldDecl(boolean isPrivate, boolean isStatic, Type t, String name, + SourcePosition posn) { + super(isPrivate, isStatic, t, name, posn); + } + + public FieldDecl(MemberDecl md, SourcePosition posn) { + super(md, posn); + } + + public FieldDecl(Declarators d, String name) { + super(d.isPrivate, d.isStatic, d.mt, name, d.posn); + } + + public R visit(Visitor v, A o) { + return v.visitFieldDecl(this, o); + } +} diff --git a/src/miniJava/AbstractSyntaxTrees/FieldDeclList.java b/src/miniJava/AbstractSyntaxTrees/FieldDeclList.java index a2a476b..03e8226 100644 --- a/src/miniJava/AbstractSyntaxTrees/FieldDeclList.java +++ b/src/miniJava/AbstractSyntaxTrees/FieldDeclList.java @@ -1,37 +1,32 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import java.util.*; - -public class FieldDeclList implements Iterable { - public FieldDeclList() { - fieldDeclList = new ArrayList(); - } - - public FieldDeclList(FieldDecl f) { - fieldDeclList = new ArrayList(); - fieldDeclList.add(f); - } - - public void add(FieldDecl cd) { - fieldDeclList.add(cd); - } - - public FieldDecl get(int i) { - return fieldDeclList.get(i); - } - - public int size() { - return fieldDeclList.size(); - } - - public Iterator iterator() { - return fieldDeclList.iterator(); - } - - private List fieldDeclList; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import java.util.*; + +public class FieldDeclList implements Iterable { + public FieldDeclList() { + fieldDeclList = new ArrayList(); + } + + public void add(FieldDecl cd) { + fieldDeclList.add(cd); + } + + public FieldDecl get(int i) { + return fieldDeclList.get(i); + } + + public int size() { + return fieldDeclList.size(); + } + + public Iterator iterator() { + return fieldDeclList.iterator(); + } + + private List fieldDeclList; +} diff --git a/src/miniJava/AbstractSyntaxTrees/IdRef.java b/src/miniJava/AbstractSyntaxTrees/IdRef.java index cc3e555..696ec40 100644 --- a/src/miniJava/AbstractSyntaxTrees/IdRef.java +++ b/src/miniJava/AbstractSyntaxTrees/IdRef.java @@ -1,22 +1,22 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class IdRef extends Reference { - - public IdRef(Identifier id, SourcePosition posn) { - super(posn); - this.id = id; - } - - public R visit(Visitor v, A o) { - return v.visitIdRef(this, o); - } - - public Identifier id; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class IdRef extends Reference { + + public IdRef(Identifier id, SourcePosition posn) { + super(posn); + this.id = id; + } + + public R visit(Visitor v, A o) { + return v.visitIdRef(this, o); + } + + public Identifier id; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Identifier.java b/src/miniJava/AbstractSyntaxTrees/Identifier.java index 1d0c0a5..dde46f7 100644 --- a/src/miniJava/AbstractSyntaxTrees/Identifier.java +++ b/src/miniJava/AbstractSyntaxTrees/Identifier.java @@ -1,21 +1,23 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class Identifier extends Terminal { - - public Identifier(String s, SourcePosition posn) { - super(s, posn); - } - - public R visit(Visitor v, A o) { - return v.visitIdentifier(this, o); - } - - public Declaration decl = null; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.CodeGenerator.RuntimeEntity; +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class Identifier extends Terminal { + + public Identifier(String s, SourcePosition posn) { + super(s, posn); + } + + public R visit(Visitor v, A o) { + return v.visitIdentifier(this, o); + } + + public Declaration decl; + public RuntimeEntity entity; +} diff --git a/src/miniJava/AbstractSyntaxTrees/IfStmt.java b/src/miniJava/AbstractSyntaxTrees/IfStmt.java index 7ceb5aa..f546cb2 100644 --- a/src/miniJava/AbstractSyntaxTrees/IfStmt.java +++ b/src/miniJava/AbstractSyntaxTrees/IfStmt.java @@ -1,32 +1,32 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class IfStmt extends Statement { - public IfStmt(Expression b, Statement t, Statement e, SourcePosition posn) { - super(posn); - cond = b; - thenStmt = t; - elseStmt = e; - } - - public IfStmt(Expression b, Statement t, SourcePosition posn) { - super(posn); - cond = b; - thenStmt = t; - elseStmt = null; - } - - public R visit(Visitor v, A o) { - return v.visitIfStmt(this, o); - } - - public Expression cond; - public Statement thenStmt; - public Statement elseStmt; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class IfStmt extends Statement { + public IfStmt(Expression b, Statement t, Statement e, SourcePosition posn) { + super(posn); + cond = b; + thenStmt = t; + elseStmt = e; + } + + public IfStmt(Expression b, Statement t, SourcePosition posn) { + super(posn); + cond = b; + thenStmt = t; + elseStmt = null; + } + + public R visit(Visitor v, A o) { + return v.visitIfStmt(this, o); + } + + public Expression cond; + public Statement thenStmt; + public Statement elseStmt; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/IndexedRef.java b/src/miniJava/AbstractSyntaxTrees/IndexedRef.java index a52a014..d009e2c 100644 --- a/src/miniJava/AbstractSyntaxTrees/IndexedRef.java +++ b/src/miniJava/AbstractSyntaxTrees/IndexedRef.java @@ -1,24 +1,24 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class IndexedRef extends Reference { - - public IndexedRef(Reference ref, Expression expr, SourcePosition posn) { - super(posn); - this.ref = ref; - this.indexExpr = expr; - } - - public R visit(Visitor v, A o) { - return v.visitIndexedRef(this, o); - } - - public Reference ref; - public Expression indexExpr; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class IndexedRef extends Reference { + + public IndexedRef(Reference ref, Expression expr, SourcePosition posn) { + super(posn); + this.ref = ref; + this.indexExpr = expr; + } + + public R visit(Visitor v, A o) { + return v.visitIndexedRef(this, o); + } + + public Reference ref; + public Expression indexExpr; +} diff --git a/src/miniJava/AbstractSyntaxTrees/IntLiteral.java b/src/miniJava/AbstractSyntaxTrees/IntLiteral.java index 2e0e0d1..8b97e8e 100644 --- a/src/miniJava/AbstractSyntaxTrees/IntLiteral.java +++ b/src/miniJava/AbstractSyntaxTrees/IntLiteral.java @@ -1,19 +1,19 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class IntLiteral extends Literal { - - public IntLiteral(String s, SourcePosition posn) { - super(s, posn); - } - - public R visit(Visitor v, A o) { - return v.visitIntLiteral(this, o); - } +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class IntLiteral extends Literal { + + public IntLiteral(String s, SourcePosition posn) { + super(s, posn); + } + + public R visit(Visitor v, A o) { + return v.visitIntLiteral(this, o); + } } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/Literal.java b/src/miniJava/AbstractSyntaxTrees/Literal.java index 5c0f5cc..ae727fc 100644 --- a/src/miniJava/AbstractSyntaxTrees/Literal.java +++ b/src/miniJava/AbstractSyntaxTrees/Literal.java @@ -1,15 +1,15 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public abstract class Literal extends Terminal { - - public Literal(String spelling, SourcePosition posn) { - super(spelling, posn); - } -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class Literal extends Terminal { + + public Literal(String spelling, SourcePosition posn) { + super(spelling, posn); + } +} diff --git a/src/miniJava/AbstractSyntaxTrees/LiteralExpr.java b/src/miniJava/AbstractSyntaxTrees/LiteralExpr.java index 83c26d1..70aad01 100644 --- a/src/miniJava/AbstractSyntaxTrees/LiteralExpr.java +++ b/src/miniJava/AbstractSyntaxTrees/LiteralExpr.java @@ -1,21 +1,21 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class LiteralExpr extends Expression { - public LiteralExpr(Literal c, SourcePosition posn) { - super(posn); - literal = c; - } - - public R visit(Visitor v, A o) { - return v.visitLiteralExpr(this, o); - } - - public Literal literal; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class LiteralExpr extends Expression { + public LiteralExpr(Literal c, SourcePosition posn) { + super(posn); + literal = c; + } + + public R visit(Visitor v, A o) { + return v.visitLiteralExpr(this, o); + } + + public Literal literal; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/LocalDecl.java b/src/miniJava/AbstractSyntaxTrees/LocalDecl.java index d03b6c2..8968ac0 100644 --- a/src/miniJava/AbstractSyntaxTrees/LocalDecl.java +++ b/src/miniJava/AbstractSyntaxTrees/LocalDecl.java @@ -1,16 +1,16 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public abstract class LocalDecl extends Declaration { - - public LocalDecl(String name, Type t, SourcePosition posn) { - super(name, t, posn); - } - -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class LocalDecl extends Declaration { + + public LocalDecl(String name, Type t, SourcePosition posn) { + super(name, t, posn); + } + +} diff --git a/src/miniJava/AbstractSyntaxTrees/MemberDecl.java b/src/miniJava/AbstractSyntaxTrees/MemberDecl.java index a199a86..5a2df13 100644 --- a/src/miniJava/AbstractSyntaxTrees/MemberDecl.java +++ b/src/miniJava/AbstractSyntaxTrees/MemberDecl.java @@ -1,27 +1,27 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -abstract public class MemberDecl extends Declaration { - - public MemberDecl(boolean isPrivate, boolean isStatic, Type mt, - String name, SourcePosition posn) { - super(name, mt, posn); - this.isPrivate = isPrivate; - this.isStatic = isStatic; - } - - public MemberDecl(MemberDecl md, SourcePosition posn) { - super(md.name, md.type, posn); - this.isPrivate = md.isPrivate; - this.isStatic = md.isStatic; - } - - public boolean isPrivate; - public boolean isStatic; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +abstract public class MemberDecl extends Declaration { + + public MemberDecl(boolean isPrivate, boolean isStatic, Type mt, + String name, SourcePosition posn) { + super(name, mt, posn); + this.isPrivate = isPrivate; + this.isStatic = isStatic; + } + + public MemberDecl(MemberDecl md, SourcePosition posn) { + super(md.name, md.type, posn); + this.isPrivate = md.isPrivate; + this.isStatic = md.isStatic; + } + + public boolean isPrivate; + public boolean isStatic; +} diff --git a/src/miniJava/AbstractSyntaxTrees/MethodDecl.java b/src/miniJava/AbstractSyntaxTrees/MethodDecl.java index 54ab4e5..71c58a2 100644 --- a/src/miniJava/AbstractSyntaxTrees/MethodDecl.java +++ b/src/miniJava/AbstractSyntaxTrees/MethodDecl.java @@ -1,27 +1,27 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class MethodDecl extends MemberDecl { - - public MethodDecl(MemberDecl md, ParameterDeclList pl, StatementList sl, - Expression e, SourcePosition posn) { - super(md, posn); - parameterDeclList = pl; - statementList = sl; - returnExp = e; - } - - public R visit(Visitor v, A o) { - return v.visitMethodDecl(this, o); - } - - public ParameterDeclList parameterDeclList; - public StatementList statementList; - public Expression returnExp; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class MethodDecl extends MemberDecl { + + public MethodDecl(MemberDecl md, ParameterDeclList pl, StatementList sl, + Expression e, SourcePosition posn) { + super(md, posn); + parameterDeclList = pl; + statementList = sl; + returnExp = e; + } + + public R visit(Visitor v, A o) { + return v.visitMethodDecl(this, o); + } + + public ParameterDeclList parameterDeclList; + public StatementList statementList; + public Expression returnExp; +} diff --git a/src/miniJava/AbstractSyntaxTrees/MethodDeclList.java b/src/miniJava/AbstractSyntaxTrees/MethodDeclList.java index 41bb12f..bf79e72 100644 --- a/src/miniJava/AbstractSyntaxTrees/MethodDeclList.java +++ b/src/miniJava/AbstractSyntaxTrees/MethodDeclList.java @@ -1,37 +1,32 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import java.util.*; - -public class MethodDeclList implements Iterable { - public MethodDeclList() { - methodDeclList = new ArrayList(); - } - - public MethodDeclList(MethodDecl m) { - methodDeclList = new ArrayList(); - methodDeclList.add(m); - } - - public void add(MethodDecl cd) { - methodDeclList.add(cd); - } - - public MethodDecl get(int i) { - return methodDeclList.get(i); - } - - public int size() { - return methodDeclList.size(); - } - - public Iterator iterator() { - return methodDeclList.iterator(); - } - - private List methodDeclList; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import java.util.*; + +public class MethodDeclList implements Iterable { + public MethodDeclList() { + methodDeclList = new ArrayList(); + } + + public void add(MethodDecl cd) { + methodDeclList.add(cd); + } + + public MethodDecl get(int i) { + return methodDeclList.get(i); + } + + public int size() { + return methodDeclList.size(); + } + + public Iterator iterator() { + return methodDeclList.iterator(); + } + + private List methodDeclList; +} diff --git a/src/miniJava/AbstractSyntaxTrees/NewArrayExpr.java b/src/miniJava/AbstractSyntaxTrees/NewArrayExpr.java index 398c18e..52a8934 100644 --- a/src/miniJava/AbstractSyntaxTrees/NewArrayExpr.java +++ b/src/miniJava/AbstractSyntaxTrees/NewArrayExpr.java @@ -1,23 +1,23 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class NewArrayExpr extends NewExpr { - public NewArrayExpr(Type et, Expression e, SourcePosition posn) { - super(posn); - eltType = et; - sizeExpr = e; - } - - public R visit(Visitor v, A o) { - return v.visitNewArrayExpr(this, o); - } - - public Type eltType; - public Expression sizeExpr; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class NewArrayExpr extends NewExpr { + public NewArrayExpr(Type et, Expression e, SourcePosition posn) { + super(posn); + eltType = et; + sizeExpr = e; + } + + public R visit(Visitor v, A o) { + return v.visitNewArrayExpr(this, o); + } + + public Type eltType; + public Expression sizeExpr; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/NewExpr.java b/src/miniJava/AbstractSyntaxTrees/NewExpr.java index 62c271d..9842110 100644 --- a/src/miniJava/AbstractSyntaxTrees/NewExpr.java +++ b/src/miniJava/AbstractSyntaxTrees/NewExpr.java @@ -1,15 +1,15 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public abstract class NewExpr extends Expression { - - public NewExpr(SourcePosition posn) { - super(posn); - } -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class NewExpr extends Expression { + + public NewExpr(SourcePosition posn) { + super(posn); + } +} diff --git a/src/miniJava/AbstractSyntaxTrees/NewObjectExpr.java b/src/miniJava/AbstractSyntaxTrees/NewObjectExpr.java index 9217ebf..82ea4ea 100644 --- a/src/miniJava/AbstractSyntaxTrees/NewObjectExpr.java +++ b/src/miniJava/AbstractSyntaxTrees/NewObjectExpr.java @@ -1,21 +1,21 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class NewObjectExpr extends NewExpr { - public NewObjectExpr(ClassType ct, SourcePosition posn) { - super(posn); - classtype = ct; - } - - public R visit(Visitor v, A o) { - return v.visitNewObjectExpr(this, o); - } - - public ClassType classtype; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class NewObjectExpr extends NewExpr { + public NewObjectExpr(ClassType ct, SourcePosition posn) { + super(posn); + classtype = ct; + } + + public R visit(Visitor v, A o) { + return v.visitNewObjectExpr(this, o); + } + + public ClassType classtype; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Operator.java b/src/miniJava/AbstractSyntaxTrees/Operator.java index 00016ab..f570d02 100644 --- a/src/miniJava/AbstractSyntaxTrees/Operator.java +++ b/src/miniJava/AbstractSyntaxTrees/Operator.java @@ -1,23 +1,22 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; -import miniJava.SyntacticAnalyzer.Token; - -public class Operator extends Terminal { - - public Operator(Token t, SourcePosition posn) { - super(t.spelling, posn); - token = t; - } - - public R visit(Visitor v, A o) { - return v.visitOperator(this, o); - } - - public Token token; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; +import miniJava.SyntacticAnalyzer.Token; + +public class Operator extends Terminal { + + public Operator(Token t, SourcePosition posn) { + super(t.spelling, posn); + } + + public R visit(Visitor v, A o) { + return v.visitOperator(this, o); + } + + public Token token; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Package.java b/src/miniJava/AbstractSyntaxTrees/Package.java index 974564c..638d322 100644 --- a/src/miniJava/AbstractSyntaxTrees/Package.java +++ b/src/miniJava/AbstractSyntaxTrees/Package.java @@ -1,22 +1,22 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class Package extends AST { - - public Package(ClassDeclList cdl, SourcePosition posn) { - super(posn); - classDeclList = cdl; - } - - public R visit(Visitor v, A o) { - return v.visitPackage(this, o); - } - - public ClassDeclList classDeclList; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class Package extends AST { + + public Package(ClassDeclList cdl, SourcePosition posn) { + super(posn); + classDeclList = cdl; + } + + public R visit(Visitor v, A o) { + return v.visitPackage(this, o); + } + + public ClassDeclList classDeclList; +} diff --git a/src/miniJava/AbstractSyntaxTrees/ParameterDecl.java b/src/miniJava/AbstractSyntaxTrees/ParameterDecl.java index 56655e4..ba454e2 100644 --- a/src/miniJava/AbstractSyntaxTrees/ParameterDecl.java +++ b/src/miniJava/AbstractSyntaxTrees/ParameterDecl.java @@ -1,19 +1,19 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class ParameterDecl extends LocalDecl { - - public ParameterDecl(Type t, String name, SourcePosition posn) { - super(name, t, posn); - } - - public R visit(Visitor v, A o) { - return v.visitParameterDecl(this, o); - } -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class ParameterDecl extends LocalDecl { + + public ParameterDecl(Type t, String name, SourcePosition posn) { + super(name, t, posn); + } + + public R visit(Visitor v, A o) { + return v.visitParameterDecl(this, o); + } +} diff --git a/src/miniJava/AbstractSyntaxTrees/ParameterDeclList.java b/src/miniJava/AbstractSyntaxTrees/ParameterDeclList.java index 9612836..2b80ada 100644 --- a/src/miniJava/AbstractSyntaxTrees/ParameterDeclList.java +++ b/src/miniJava/AbstractSyntaxTrees/ParameterDeclList.java @@ -1,37 +1,32 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import java.util.*; - -public class ParameterDeclList implements Iterable { - public ParameterDeclList() { - parameterDeclList = new ArrayList(); - } - - public ParameterDeclList(ParameterDecl p) { - parameterDeclList = new ArrayList(); - parameterDeclList.add(p); - } - - public void add(ParameterDecl s) { - parameterDeclList.add(s); - } - - public ParameterDecl get(int i) { - return parameterDeclList.get(i); - } - - public int size() { - return parameterDeclList.size(); - } - - public Iterator iterator() { - return parameterDeclList.iterator(); - } - - private List parameterDeclList; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import java.util.*; + +public class ParameterDeclList implements Iterable { + public ParameterDeclList() { + parameterDeclList = new ArrayList(); + } + + public void add(ParameterDecl s) { + parameterDeclList.add(s); + } + + public ParameterDecl get(int i) { + return parameterDeclList.get(i); + } + + public int size() { + return parameterDeclList.size(); + } + + public Iterator iterator() { + return parameterDeclList.iterator(); + } + + private List parameterDeclList; +} diff --git a/src/miniJava/AbstractSyntaxTrees/QualifiedRef.java b/src/miniJava/AbstractSyntaxTrees/QualifiedRef.java index c147f79..74192a7 100644 --- a/src/miniJava/AbstractSyntaxTrees/QualifiedRef.java +++ b/src/miniJava/AbstractSyntaxTrees/QualifiedRef.java @@ -1,25 +1,25 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class QualifiedRef extends Reference { - - public QualifiedRef(Reference ref, Identifier id, SourcePosition posn) { - super(posn); - this.ref = ref; - this.id = id; - } - - @Override - public R visit(Visitor v, A o) { - return v.visitQualifiedRef(this, o); - } - - public Reference ref; - public Identifier id; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class QualifiedRef extends Reference { + + public QualifiedRef(Reference ref, Identifier id, SourcePosition posn) { + super(posn); + this.ref = ref; + this.id = id; + } + + @Override + public R visit(Visitor v, A o) { + return v.visitQualifiedRef(this, o); + } + + public Reference ref; + public Identifier id; +} diff --git a/src/miniJava/AbstractSyntaxTrees/RefExpr.java b/src/miniJava/AbstractSyntaxTrees/RefExpr.java index 4f289b2..2d570e2 100644 --- a/src/miniJava/AbstractSyntaxTrees/RefExpr.java +++ b/src/miniJava/AbstractSyntaxTrees/RefExpr.java @@ -1,21 +1,21 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class RefExpr extends Expression { - public RefExpr(Reference r, SourcePosition posn) { - super(posn); - ref = r; - } - - public R visit(Visitor v, A o) { - return v.visitRefExpr(this, o); - } - - public Reference ref; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class RefExpr extends Expression { + public RefExpr(Reference r, SourcePosition posn) { + super(posn); + ref = r; + } + + public R visit(Visitor v, A o) { + return v.visitRefExpr(this, o); + } + + public Reference ref; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Reference.java b/src/miniJava/AbstractSyntaxTrees/Reference.java index 7998896..c373659 100644 --- a/src/miniJava/AbstractSyntaxTrees/Reference.java +++ b/src/miniJava/AbstractSyntaxTrees/Reference.java @@ -1,18 +1,19 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.CodeGenerator.RuntimeEntity; -import miniJava.SyntacticAnalyzer.SourcePosition; - -public abstract class Reference extends AST { - public Reference(SourcePosition posn) { - super(posn); - } - - public Declaration decl; - public RuntimeEntity entity; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.CodeGenerator.RuntimeEntity; +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class Reference extends AST { + public Reference(SourcePosition posn) { + super(posn); + } + + public String spelling; + public Declaration decl; + public RuntimeEntity entity; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Statement.java b/src/miniJava/AbstractSyntaxTrees/Statement.java index e8db4cb..6d332b0 100644 --- a/src/miniJava/AbstractSyntaxTrees/Statement.java +++ b/src/miniJava/AbstractSyntaxTrees/Statement.java @@ -1,16 +1,16 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public abstract class Statement extends AST { - - public Statement(SourcePosition posn) { - super(posn); - } - -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class Statement extends AST { + + public Statement(SourcePosition posn) { + super(posn); + } + +} diff --git a/src/miniJava/AbstractSyntaxTrees/StatementList.java b/src/miniJava/AbstractSyntaxTrees/StatementList.java index b6bd1d9..d2fbfb8 100644 --- a/src/miniJava/AbstractSyntaxTrees/StatementList.java +++ b/src/miniJava/AbstractSyntaxTrees/StatementList.java @@ -1,32 +1,32 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import java.util.*; - -public class StatementList implements Iterable { - public StatementList() { - slist = new ArrayList(); - } - - public void add(Statement s) { - slist.add(s); - } - - public Statement get(int i) { - return slist.get(i); - } - - public int size() { - return slist.size(); - } - - public Iterator iterator() { - return slist.iterator(); - } - - private List slist; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import java.util.*; + +public class StatementList implements Iterable { + public StatementList() { + slist = new ArrayList(); + } + + public void add(Statement s) { + slist.add(s); + } + + public Statement get(int i) { + return slist.get(i); + } + + public int size() { + return slist.size(); + } + + public Iterator iterator() { + return slist.iterator(); + } + + private List slist; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Terminal.java b/src/miniJava/AbstractSyntaxTrees/Terminal.java index fb28172..4ee4f21 100644 --- a/src/miniJava/AbstractSyntaxTrees/Terminal.java +++ b/src/miniJava/AbstractSyntaxTrees/Terminal.java @@ -1,18 +1,18 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -abstract public class Terminal extends AST { - - public Terminal(String s, SourcePosition posn) { - super(posn); - spelling = s; - } - - public String spelling; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +abstract public class Terminal extends AST { + + public Terminal(String s, SourcePosition posn) { + super(posn); + spelling = s; + } + + public String spelling; +} diff --git a/src/miniJava/AbstractSyntaxTrees/ThisRef.java b/src/miniJava/AbstractSyntaxTrees/ThisRef.java index 082340c..874a590 100644 --- a/src/miniJava/AbstractSyntaxTrees/ThisRef.java +++ b/src/miniJava/AbstractSyntaxTrees/ThisRef.java @@ -1,21 +1,21 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class ThisRef extends Reference { - - public ThisRef(SourcePosition posn) { - super(posn); - } - - @Override - public R visit(Visitor v, A o) { - return v.visitThisRef(this, o); - } - -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class ThisRef extends Reference { + + public ThisRef(SourcePosition posn) { + super(posn); + } + + @Override + public R visit(Visitor v, A o) { + return v.visitThisRef(this, o); + } + +} diff --git a/src/miniJava/AbstractSyntaxTrees/Type.java b/src/miniJava/AbstractSyntaxTrees/Type.java index ef45865..463bfb6 100644 --- a/src/miniJava/AbstractSyntaxTrees/Type.java +++ b/src/miniJava/AbstractSyntaxTrees/Type.java @@ -1,19 +1,19 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -abstract public class Type extends AST { - - public Type(TypeKind typ, SourcePosition posn) { - super(posn); - typeKind = typ; - } - - public TypeKind typeKind; - -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +abstract public class Type extends AST { + + public Type(TypeKind typ, SourcePosition posn) { + super(posn); + typeKind = typ; + } + + public TypeKind typeKind; + +} diff --git a/src/miniJava/AbstractSyntaxTrees/TypeKind.java b/src/miniJava/AbstractSyntaxTrees/TypeKind.java index 824ddbb..b9421bb 100644 --- a/src/miniJava/AbstractSyntaxTrees/TypeKind.java +++ b/src/miniJava/AbstractSyntaxTrees/TypeKind.java @@ -1,10 +1,10 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -public enum TypeKind { - VOID, INT, BOOLEAN, CLASS, ARRAY, UNSUPPORTED, ERROR, EQUALS, RELATIONAL; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +public enum TypeKind { + VOID, INT, BOOLEAN, CLASS, ARRAY, UNSUPPORTED, ERROR; +} diff --git a/src/miniJava/AbstractSyntaxTrees/UnaryExpr.java b/src/miniJava/AbstractSyntaxTrees/UnaryExpr.java index eeb8e56..ecf8504 100644 --- a/src/miniJava/AbstractSyntaxTrees/UnaryExpr.java +++ b/src/miniJava/AbstractSyntaxTrees/UnaryExpr.java @@ -1,23 +1,23 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class UnaryExpr extends Expression { - public UnaryExpr(Operator o, Expression e, SourcePosition posn) { - super(posn); - operator = o; - expr = e; - } - - public R visit(Visitor v, A o) { - return v.visitUnaryExpr(this, o); - } - - public Operator operator; - public Expression expr; +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class UnaryExpr extends Expression { + public UnaryExpr(Operator o, Expression e, SourcePosition posn) { + super(posn); + operator = o; + expr = e; + } + + public R visit(Visitor v, A o) { + return v.visitUnaryExpr(this, o); + } + + public Operator operator; + public Expression expr; } \ No newline at end of file diff --git a/src/miniJava/AbstractSyntaxTrees/VarDecl.java b/src/miniJava/AbstractSyntaxTrees/VarDecl.java index 2be65c3..8231714 100644 --- a/src/miniJava/AbstractSyntaxTrees/VarDecl.java +++ b/src/miniJava/AbstractSyntaxTrees/VarDecl.java @@ -1,19 +1,19 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class VarDecl extends LocalDecl { - - public VarDecl(Type t, String name, SourcePosition posn) { - super(name, t, posn); - } - - public R visit(Visitor v, A o) { - return v.visitVarDecl(this, o); - } -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class VarDecl extends LocalDecl { + + public VarDecl(Type t, String name, SourcePosition posn) { + super(name, t, posn); + } + + public R visit(Visitor v, A o) { + return v.visitVarDecl(this, o); + } +} diff --git a/src/miniJava/AbstractSyntaxTrees/VarDeclStmt.java b/src/miniJava/AbstractSyntaxTrees/VarDeclStmt.java index 3e74d70..56db252 100644 --- a/src/miniJava/AbstractSyntaxTrees/VarDeclStmt.java +++ b/src/miniJava/AbstractSyntaxTrees/VarDeclStmt.java @@ -1,23 +1,23 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class VarDeclStmt extends Statement { - public VarDeclStmt(VarDecl vd, Expression e, SourcePosition posn) { - super(posn); - varDecl = vd; - initExp = e; - } - - public R visit(Visitor v, A o) { - return v.visitVardeclStmt(this, o); - } - - public VarDecl varDecl; - public Expression initExp; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class VarDeclStmt extends Statement { + public VarDeclStmt(VarDecl vd, Expression e, SourcePosition posn) { + super(posn); + varDecl = vd; + initExp = e; + } + + public R visit(Visitor v, A o) { + return v.visitVardeclStmt(this, o); + } + + public VarDecl varDecl; + public Expression initExp; +} diff --git a/src/miniJava/AbstractSyntaxTrees/Visitor.java b/src/miniJava/AbstractSyntaxTrees/Visitor.java index 2045d36..08c2541 100644 --- a/src/miniJava/AbstractSyntaxTrees/Visitor.java +++ b/src/miniJava/AbstractSyntaxTrees/Visitor.java @@ -1,80 +1,80 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -/** - * An implementation of the Visitor interface provides a method visitX for each - * non-abstract AST class X. - */ -public interface Visitor { - - // Package - public ResultType visitPackage(Package prog, ArgType arg); - - // Declarations - public ResultType visitClassDecl(ClassDecl cd, ArgType arg); - - public ResultType visitFieldDecl(FieldDecl fd, ArgType arg); - - public ResultType visitMethodDecl(MethodDecl md, ArgType arg); - - public ResultType visitParameterDecl(ParameterDecl pd, ArgType arg); - - public ResultType visitVarDecl(VarDecl decl, ArgType arg); - - // Types - public ResultType visitBaseType(BaseType type, ArgType arg); - - public ResultType visitClassType(ClassType type, ArgType arg); - - public ResultType visitArrayType(ArrayType type, ArgType arg); - - // Statements - public ResultType visitBlockStmt(BlockStmt stmt, ArgType arg); - - public ResultType visitVardeclStmt(VarDeclStmt stmt, ArgType arg); - - public ResultType visitAssignStmt(AssignStmt stmt, ArgType arg); - - public ResultType visitCallStmt(CallStmt stmt, ArgType arg); - - public ResultType visitIfStmt(IfStmt stmt, ArgType arg); - - public ResultType visitWhileStmt(WhileStmt stmt, ArgType arg); - - // Expressions - public ResultType visitUnaryExpr(UnaryExpr expr, ArgType arg); - - public ResultType visitBinaryExpr(BinaryExpr expr, ArgType arg); - - public ResultType visitRefExpr(RefExpr expr, ArgType arg); - - public ResultType visitCallExpr(CallExpr expr, ArgType arg); - - public ResultType visitLiteralExpr(LiteralExpr expr, ArgType arg); - - public ResultType visitNewObjectExpr(NewObjectExpr expr, ArgType arg); - - public ResultType visitNewArrayExpr(NewArrayExpr expr, ArgType arg); - - // References - public ResultType visitQualifiedRef(QualifiedRef ref, ArgType arg); - - public ResultType visitIndexedRef(IndexedRef ref, ArgType arg); - - public ResultType visitIdRef(IdRef ref, ArgType arg); - - public ResultType visitThisRef(ThisRef ref, ArgType arg); - - // Terminals - public ResultType visitIdentifier(Identifier id, ArgType arg); - - public ResultType visitOperator(Operator op, ArgType arg); - - public ResultType visitIntLiteral(IntLiteral num, ArgType arg); - - public ResultType visitBooleanLiteral(BooleanLiteral bool, ArgType arg); -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +/** + * An implementation of the Visitor interface provides a method visitX for each + * non-abstract AST class X. + */ +public interface Visitor { + + // Package + public ResultType visitPackage(Package prog, ArgType arg); + + // Declarations + public ResultType visitClassDecl(ClassDecl cd, ArgType arg); + + public ResultType visitFieldDecl(FieldDecl fd, ArgType arg); + + public ResultType visitMethodDecl(MethodDecl md, ArgType arg); + + public ResultType visitParameterDecl(ParameterDecl pd, ArgType arg); + + public ResultType visitVarDecl(VarDecl decl, ArgType arg); + + // Types + public ResultType visitBaseType(BaseType type, ArgType arg); + + public ResultType visitClassType(ClassType type, ArgType arg); + + public ResultType visitArrayType(ArrayType type, ArgType arg); + + // Statements + public ResultType visitBlockStmt(BlockStmt stmt, ArgType arg); + + public ResultType visitVardeclStmt(VarDeclStmt stmt, ArgType arg); + + public ResultType visitAssignStmt(AssignStmt stmt, ArgType arg); + + public ResultType visitCallStmt(CallStmt stmt, ArgType arg); + + public ResultType visitIfStmt(IfStmt stmt, ArgType arg); + + public ResultType visitWhileStmt(WhileStmt stmt, ArgType arg); + + // Expressions + public ResultType visitUnaryExpr(UnaryExpr expr, ArgType arg); + + public ResultType visitBinaryExpr(BinaryExpr expr, ArgType arg); + + public ResultType visitRefExpr(RefExpr expr, ArgType arg); + + public ResultType visitCallExpr(CallExpr expr, ArgType arg); + + public ResultType visitLiteralExpr(LiteralExpr expr, ArgType arg); + + public ResultType visitNewObjectExpr(NewObjectExpr expr, ArgType arg); + + public ResultType visitNewArrayExpr(NewArrayExpr expr, ArgType arg); + + // References + public ResultType visitQualifiedRef(QualifiedRef ref, ArgType arg); + + public ResultType visitIndexedRef(IndexedRef ref, ArgType arg); + + public ResultType visitIdRef(IdRef ref, ArgType arg); + + public ResultType visitThisRef(ThisRef ref, ArgType arg); + + // Terminals + public ResultType visitIdentifier(Identifier id, ArgType arg); + + public ResultType visitOperator(Operator op, ArgType arg); + + public ResultType visitIntLiteral(IntLiteral num, ArgType arg); + + public ResultType visitBooleanLiteral(BooleanLiteral bool, ArgType arg); +} diff --git a/src/miniJava/AbstractSyntaxTrees/WhileStmt.java b/src/miniJava/AbstractSyntaxTrees/WhileStmt.java index 3695b45..88d3a22 100644 --- a/src/miniJava/AbstractSyntaxTrees/WhileStmt.java +++ b/src/miniJava/AbstractSyntaxTrees/WhileStmt.java @@ -1,23 +1,23 @@ -/** - * miniJava Abstract Syntax Tree classes - * @author prins - * @version COMP 520 (v2.2) - */ -package miniJava.AbstractSyntaxTrees; - -import miniJava.SyntacticAnalyzer.SourcePosition; - -public class WhileStmt extends Statement { - public WhileStmt(Expression b, Statement s, SourcePosition posn) { - super(posn); - cond = b; - body = s; - } - - public R visit(Visitor v, A o) { - return v.visitWhileStmt(this, o); - } - - public Expression cond; - public Statement body; -} +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public class WhileStmt extends Statement { + public WhileStmt(Expression b, Statement s, SourcePosition posn) { + super(posn); + cond = b; + body = s; + } + + public R visit(Visitor v, A o) { + return v.visitWhileStmt(this, o); + } + + public Expression cond; + public Statement body; +} diff --git a/src/miniJava/CodeGenerator/Code.java b/src/miniJava/CodeGenerator/Code.java new file mode 100644 index 0000000..fa32703 --- /dev/null +++ b/src/miniJava/CodeGenerator/Code.java @@ -0,0 +1,55 @@ +package miniJava.CodeGenerator; + +import mJAM.Machine; +import miniJava.AbstractSyntaxTrees.*; + +public class Code { + + public boolean addr; + public Declaration decl; + + /** + * If addr true, returns the address of the declaration. + * Otherwise, uses the size of the declaration in its place. + * @param op + * @param decl + * @param addr + */ + public Code(Declaration decl, boolean addr) { + this.decl = decl; + this.addr = addr; + } + + /** + * + * @param index + */ + public void modify(int instr) { + + // Setup size + switch(decl.type.typeKind) { + case ARRAY: + case CLASS: + Machine.code[instr].n = Machine.addressSize; + case INT: + Machine.code[instr].n = Machine.integerSize; + case BOOLEAN: + Machine.code[instr].n = Machine.booleanSize; + case VOID: + Machine.code[instr].n = 0; + default: + Machine.code[instr].n = -1; + } + + // Setup displacement + if(addr) { + Machine.code[instr].d += decl.entity.addr; + } else { + Machine.code[instr].d += decl.entity.size; + } + + // Setup register + Machine.code[instr].r = decl.entity.reg.ordinal(); + } + +} diff --git a/src/miniJava/CodeGenerator/Encoder.java b/src/miniJava/CodeGenerator/Encoder.java index 5773186..6ee76b6 100644 --- a/src/miniJava/CodeGenerator/Encoder.java +++ b/src/miniJava/CodeGenerator/Encoder.java @@ -1,94 +1,79 @@ package miniJava.CodeGenerator; +import java.util.HashMap; + import mJAM.Machine; import mJAM.Machine.*; import miniJava.AbstractSyntaxTrees.*; import miniJava.AbstractSyntaxTrees.Package; import miniJava.ContextualAnalyzer.Analyzer; -public class Encoder implements Visitor { +public class Encoder implements Visitor { - private int mdLBOffset = 0; - - // ///////////////////////////////////////////////////////////////////////////// - // - // Convenience Functions - // - // ///////////////////////////////////////////////////////////////////////////// + // Keeps track of variables placed on the stack + private int methodDataOffset = 0; + + // Maintains data to correct once completed traversal + private HashMap patches = new HashMap<>(); - /** - * Get size of type for declaration purposes. - * @param t - * @return - */ - private int getSize(Type t) { - switch(t.typeKind) { - case ARRAY: - case CLASS: - return Machine.addressSize; - case INT: - return Machine.integerSize; - case BOOLEAN: - return Machine.booleanSize; - case VOID: - return 0; - default: - return -1; - } - } - // ///////////////////////////////////////////////////////////////////////////// // // PACKAGE // // ///////////////////////////////////////////////////////////////////////////// - + @Override - public Integer visitPackage(Package prog, Integer arg) { + public Object visitPackage(Package prog, Integer arg) { - // Initialize static fields + Machine.initCodeGen(); + + // Initialize all static fields + int staticFieldsSize = 0; for(ClassDecl cd : prog.classDeclList) { for(int i = 0; i < cd.fieldDeclList.size(); i++) { - if(cd.fieldDeclList.get(i).isStatic) { - cd.fieldDeclList.get(i).visit(this, i); + FieldDecl fd = cd.fieldDeclList.get(i); + if(fd.isStatic) { + int size = getSize(fd.type); + fd.entity = new RuntimeEntity(size, staticFieldsSize, Reg.SB); + staticFieldsSize += size; } } } - int patch = Machine.nextInstrAddr(); - Machine.emit(Op.JUMP, Reg.CB, 0); - - // Initialize all classes and methods - for(ClassDecl cd : prog.classDeclList) { - cd.visit(this, 1); + if(staticFieldsSize > 0) { + Machine.emit(Op.PUSH, staticFieldsSize); } - // Link classes & build stack - Machine.patch(patch, Machine.nextInstrAddr()); + // Build Classes for(ClassDecl cd : prog.classDeclList) { int cdPatch = Machine.nextInstrAddr(); Machine.emit(Op.JUMP, Reg.CB, 0); - Machine.patch(cdPatch, cd.visit(this, 0)); + cd.visit(this, cdPatch); } // Build main function - mdLBOffset = Machine.linkDataSize; + methodDataOffset = Machine.linkDataSize; int mainPatch = Machine.nextInstrAddr(); Machine.emit(Op.JUMP, Reg.CB, 0); - Analyzer.mainMethod.visit(this, 0); - - + Analyzer.main.visit(this, null); + // Run main function int mainLabel = Machine.nextInstrAddr(); - RuntimeEntity main = Analyzer.mainMethod.entity; - + RuntimeEntity main = Analyzer.main.entity; + Machine.emit(Op.LOADL, Machine.nullRep); Machine.emit(Op.CALL, Reg.CB, main.addr); Machine.emit(Machine.Op.HALT, 0 ,0, 0); Machine.patch(mainPatch, mainLabel); - return 0; + // Patch up + for(Integer instr : patches.keySet()) { + Code c = patches.get(instr); + c.modify(instr); + } + + return null; } @@ -99,163 +84,128 @@ public class Encoder implements Visitor { // ///////////////////////////////////////////////////////////////////////////// @Override - public Integer visitClassDecl(ClassDecl cd, Integer init) { + public Object visitClassDecl(ClassDecl cd, Integer patch) { - /* Give an address to each method and class, so it can be referred - * to directly by jumping. - */ - if(init != 0) { - - // Get size of class - int size = 0; - for(FieldDecl fd : cd.fieldDeclList) { - if(!fd.isStatic) { - fd.visit(this, size); - size += getSize(fd.type); - } + // Get size of class + int size = 0; + for(FieldDecl fd : cd.fieldDeclList) { + if(!fd.isStatic) { + fd.visit(this, size); + size += fd.entity.size; } - - // Build Methods - for(MethodDecl md : cd.methodDeclList) { - md.visit(this, init); - } - - // Runtime Entity - int addr = Machine.nextInstrAddr(); - cd.entity = new RuntimeEntity(size, addr, Reg.CB, addr); - Machine.emit(Op.JUMP, Reg.CB, 0); - - return addr; - } + } // Build Instance Methods for(MethodDecl md : cd.methodDeclList) { - if(!md.isStatic) { - md.visit(this, 0); + if(md != Analyzer.main) { + md.visit(this, null); } } - // Build class descriptor - int label = Machine.nextInstrAddr(); - Machine.patch(cd.entity.instr, label); + // Build Class Descriptor + int addr = Machine.nextInstrAddr(); + Machine.patch(patch, addr); - Machine.emit(Op.LOADL, -1); // No superclasses allowed - Machine.emit(Op.LOADL, cd.entity.size); // Size of class - Machine.emit(Op.LOADA, Reg.CB, cd.entity.addr); // Address of class + Machine.emit(Op.LOADL, -1); // No superclasses allowed + Machine.emit(Op.LOADL, size); // Size of class + Machine.emit(Op.LOADA, Reg.CB, addr); // Address of class - return label; + // Save entity + cd.entity = new RuntimeEntity(size, addr, Reg.CB); + + return null; } @Override - public Integer visitFieldDecl(FieldDecl fd, Integer addr) { - + public Object visitFieldDecl(FieldDecl fd, Integer offset) { + + // Only non-static fields should ever reach this method int size = getSize(fd.type); - - // Static fields are placed onto the stack - if(fd.isStatic) { - fd.entity = new RuntimeEntity(size, addr, Reg.SB); - Machine.emit(Op.PUSH, size); - } else { - fd.entity = new RuntimeEntity(size, addr, Reg.OB); - } - - return 0; + fd.entity = new RuntimeEntity(size, offset, Reg.OB); + + return null; } - @Override - public Integer visitMethodDecl(MethodDecl md, Integer init) { + public Object visitMethodDecl(MethodDecl md, Integer arg) { - mdLBOffset = Machine.linkDataSize; + // Reset for next local LB + methodDataOffset = Machine.linkDataSize; - if(init != 0) { - int size = getSize(md.type); - int addr = Machine.nextInstrAddr(); - md.entity = new RuntimeEntity(size, addr, Reg.CB, addr); - Machine.emit(Op.JUMP, Reg.CB, 0); - } + // Save Entity + int size = getSize(md.type); + int addr = Machine.nextInstrAddr(); + md.entity = new RuntimeEntity(size, addr, Reg.CB); - else { - // Setup parameters - int paramS = 0; - for(ParameterDecl pd : md.parameterDeclList) { - paramS += getSize(md.type); - pd.visit(this, -paramS); - } - - // Setup body - int addr = Machine.nextInstrAddr(); - Machine.patch(md.entity.instr, addr); - for(Statement s : md.statementList) { - s.visit(this, 0); - } - - // Setup return statement - if(md.returnExp != null) { - md.returnExp.visit(this, 0); - } - - // Return from function - // Machine.emit(Op.HALT, 4, 0, 0); (See snapshot) - Machine.emit(Op.RETURN, md.entity.size, 0, paramS); + // Setup parameters + int parameterSize = 0; + for(ParameterDecl pd : md.parameterDeclList) { + parameterSize += getSize(pd.type); + pd.visit(this, -parameterSize); } - return 0; + // Build Body + for(Statement s : md.statementList) { + s.visit(this, null); + } + + // Setup Return + if(md.returnExp != null) { + md.returnExp.visit(this, null); + } + + Machine.emit(Op.RETURN, size, 0, parameterSize); + + return null; } - /** - * Note parameter addresses are negative to LB since they are - * placed onto the stack before emitting a CALL. - */ @Override - public Integer visitParameterDecl(ParameterDecl pd, Integer addr) { + public Object visitParameterDecl(ParameterDecl pd, Integer offset) { - // Builds runtime entity, offset at LB + // Builds runtime entity (should be negative of LB) int size = getSize(pd.type); - pd.entity = new RuntimeEntity(size, addr, Reg.LB); - - return 0; + pd.entity = new RuntimeEntity(size, offset, Reg.LB); + + return null; } - /** - * Variable declarations are never disposed (even in static closures). - */ @Override - public Integer visitVarDecl(VarDecl decl, Integer addr) { - + public Object visitVarDecl(VarDecl decl, Integer arg) { + // Builds runtime entity, offset at LB int size = getSize(decl.type); - decl.entity = new RuntimeEntity(size, addr, Reg.LB); + decl.entity = new RuntimeEntity(size, methodDataOffset, Reg.LB); // Allocates space on stack Machine.emit(Op.PUSH, size); - - return 0; + methodDataOffset += size; + + return null; } // ///////////////////////////////////////////////////////////////////////////// // // TYPES - // + // // ///////////////////////////////////////////////////////////////////////////// @Override - public Integer visitBaseType(BaseType type, Integer arg) { + public Object visitBaseType(BaseType type, Integer arg) { - return 0; + return null; } @Override - public Integer visitClassType(ClassType type, Integer arg) { + public Object visitClassType(ClassType type, Integer arg) { - return 0; + return null; } @Override - public Integer visitArrayType(ArrayType type, Integer arg) { + public Object visitArrayType(ArrayType type, Integer arg) { - return 0; + return null; } @@ -265,171 +215,187 @@ public class Encoder implements Visitor { // // ///////////////////////////////////////////////////////////////////////////// - /** - * We note a block statement may contain a variable declaration, - * that should go out of scope at the end of the statement. - * If the passed argument is 1, we indicate we want this to - * happen. - */ @Override - public Integer visitBlockStmt(BlockStmt stmt, Integer arg) { + public Object visitBlockStmt(BlockStmt stmt, Integer arg) { // Execute statements int size = 0; for(Statement s : stmt.sl) { - s.visit(this, 0); - - // Push variable declarations if necessary - if(arg == 1 && s instanceof VarDeclStmt) { - VarDeclStmt decl = (VarDeclStmt) s; - size += getSize(decl.varDecl.type); + s.visit(this, null); + if(s instanceof VarDeclStmt) { + VarDeclStmt vds = (VarDeclStmt) s; + size += vds.varDecl.entity.size; } } // Pop off variable declarations - Machine.emit(Op.POP, size); - - return 0; + if(size > 0) { + Machine.emit(Op.POP, size); + methodDataOffset -= size; + } + + return null; } - /** - * We declare the variable, place the RHS onto the stack, and - * replace the value of the variable with the top of the stack. - */ @Override - public Integer visitVardeclStmt(VarDeclStmt stmt, Integer arg) { - stmt.varDecl.visit(this, mdLBOffset); - stmt.initExp.visit(this, 0); + public Object visitVardeclStmt(VarDeclStmt stmt, Integer arg) { + + stmt.varDecl.visit(this, null); + stmt.initExp.visit(this, null); - // Assign value RuntimeEntity e = stmt.varDecl.entity; - Machine.emit(Op.STORE, e.size, e.register, e.addr); + Machine.emit(Op.STORE, e.size, e.reg, e.addr); - // Update position - mdLBOffset += getSize(stmt.varDecl.type); - - return 0; + return null; } @Override - public Integer visitAssignStmt(AssignStmt stmt, Integer arg) { + public Object visitAssignStmt(AssignStmt stmt, Integer arg) { - stmt.ref.visit(this, 0); + // Can potentially reach declaration directly + if(stmt.ref instanceof QualifiedRef) { + + QualifiedRef ref = (QualifiedRef) stmt.ref; + MemberDecl md = (MemberDecl) ref.id.decl; + + // Just access directly + if(md.isStatic) { + stmt.val.visit(this, null); + patches.put(Machine.nextInstrAddr(), new Code(md, true)); + Machine.emit(Op.STORE, getSize(md.type), Reg.SB, 0); + + return null; + } + + // Access member directly + else if(ref.ref instanceof ThisRef) { + stmt.val.visit(this, null); + + int addr = Machine.nextInstrAddr(); + int size = getSize(ref.id.decl.type); + patches.put(addr, new Code(ref.id.decl, true)); + Machine.emit(Op.STORE, size, Reg.OB, 0); + + return null; + } + } + + // Must access member iteratively + stmt.ref.visit(this, 1); + stmt.val.visit(this, null); - // Setup - RuntimeEntity e = stmt.ref.entity; - - // Build code accordingly - if(stmt.ref instanceof QualifiedRef) { - e.parent.load(); - Machine.emit(Op.LOADL, e.addr); - stmt.val.visit(this, 0); + if(stmt.ref instanceof QualifiedRef) { Machine.emit(Prim.fieldupd); } else if(stmt.ref instanceof IndexedRef) { - IndexedRef ref = (IndexedRef) stmt.ref; - e.load(); - ref.indexExpr.visit(this, 0); - stmt.val.visit(this, 0); Machine.emit(Prim.arrayupd); } else if(stmt.ref instanceof IdRef) { - stmt.val.visit(this, 0); - Machine.emit(Op.STORE, e.size, e.register, e.addr); + int addr = Machine.nextInstrAddr(); + int size = getSize(stmt.ref.decl.type); + patches.put(addr, new Code(stmt.ref.decl, true)); + Machine.emit(Op.STORE, size, Reg.ZR, 0); } - return 0; + return null; } - /** - * The method in question can either be an instance or static - * function (it must be a MethodDecl). - */ @Override - public Integer visitCallStmt(CallStmt stmt, Integer arg) { + public Object visitCallStmt(CallStmt stmt, Integer arg) { MethodDecl md = (MethodDecl) stmt.methodRef.decl; // Request to print out if(md == Analyzer.println) { - stmt.argList.get(0).visit(this, 0); + stmt.argList.get(0).visit(this, null); Machine.emit(Prim.putintnl); - return 0; + return null; } // Push parameters on (must iterate in reverse order) for(int i = stmt.argList.size() - 1; i >= 0; i--) { - stmt.argList.get(i).visit(this, 0); + stmt.argList.get(i).visit(this, null); } - // Call Method - stmt.methodRef.visit(this, 0); + // Call method directly if(md.isStatic) { - Machine.emit(Op.CALL, Reg.CB, md.entity.addr); - } else { - stmt.methodRef.entity.call(); - Machine.emit(Op.CALLI, Reg.CB, md.entity.addr); + patches.put(Machine.nextInstrAddr(), new Code(md, true)); + Machine.emit(Op.CALL, Reg.CB, 0); + } + + // Get address of qualified object + else { + if(stmt.methodRef instanceof QualifiedRef) { + QualifiedRef ref = (QualifiedRef) stmt.methodRef; + ref.ref.visit(this, null); + } else { + Machine.emit(Op.LOADA, Machine.addressSize, Reg.OB, 0); + } + + patches.put(Machine.nextInstrAddr(), new Code(md, true)); + Machine.emit(Op.CALLI, Reg.CB, 0); } - return 0; + // Clear off stack if necessary + int returnSize = getSize(md.type); + if(returnSize > 0) { + Machine.emit(Op.POP, returnSize); + } + + return null; } @Override - public Integer visitIfStmt(IfStmt stmt, Integer arg) { + public Object visitIfStmt(IfStmt stmt, Integer arg) { - stmt.cond.visit(this, 0); + stmt.cond.visit(this, null); - // Build Then Statement + // Do not have to build as many jump instructions in this case + if(stmt.elseStmt == null) { + int ifPatch = Machine.nextInstrAddr(); + Machine.emit(Op.JUMPIF, Machine.falseRep, Reg.CB, 0); + + stmt.thenStmt.visit(this, null); + Machine.patch(ifPatch, Machine.nextInstrAddr()); + + return null; + } + + // Must jump out at end of 'if' clause int ifPatch = Machine.nextInstrAddr(); - Machine.emit(Op.JUMPIF, Machine.trueRep, Reg.CB, 0); - - int elsePatch = Machine.nextInstrAddr(); - Machine.emit(Op.JUMP, Reg.CB, 0); - - int thenLabel = Machine.nextInstrAddr(); - stmt.thenStmt.visit(this, 0); + Machine.emit(Op.JUMPIF, Machine.falseRep, Reg.CB, 0); + stmt.thenStmt.visit(this, null); int thenPatch = Machine.nextInstrAddr(); Machine.emit(Op.JUMP, Reg.CB, 0); - // Connect labels/patches - int endLabel = Machine.nextInstrAddr(); - Machine.patch(elsePatch, endLabel); + // Build 'else' clause + Machine.patch(ifPatch, Machine.nextInstrAddr()); + stmt.elseStmt.visit(this, null); + Machine.patch(thenPatch, Machine.nextInstrAddr()); - if(stmt.elseStmt != null) { - stmt.elseStmt.visit(this, 0); - endLabel = Machine.nextInstrAddr(); - } - - Machine.patch(ifPatch, thenLabel); - Machine.patch(thenPatch, endLabel); - - return 0; + return null; } - /** - * We note since the same declaration can be reached multiple times, we - * are forced to pop each declaration initialized. - */ @Override - public Integer visitWhileStmt(WhileStmt stmt, Integer arg) { + public Object visitWhileStmt(WhileStmt stmt, Integer arg) { // Must check the condition each loop int whileLabel = Machine.nextInstrAddr(); - stmt.cond.visit(this, 0); + stmt.cond.visit(this, null); // Jump out once condition fails int whileEndPatch = Machine.nextInstrAddr(); Machine.emit(Op.JUMPIF, Machine.falseRep, Reg.CB, 0); // Execute - stmt.body.visit(this, 1); + stmt.body.visit(this, null); Machine.emit(Op.JUMP, Reg.CB, whileLabel); Machine.patch(whileEndPatch, Machine.nextInstrAddr()); - - return 0; + + return null; } @@ -440,9 +406,9 @@ public class Encoder implements Visitor { // ///////////////////////////////////////////////////////////////////////////// @Override - public Integer visitUnaryExpr(UnaryExpr expr, Integer arg) { + public Object visitUnaryExpr(UnaryExpr expr, Integer arg) { - expr.expr.visit(this, 0); + expr.expr.visit(this, null); switch(expr.operator.spelling) { case "!": Machine.emit(Prim.not); @@ -452,115 +418,105 @@ public class Encoder implements Visitor { break; } - return 0; + return null; } @Override - public Integer visitBinaryExpr(BinaryExpr expr, Integer arg) { - expr.left.visit(this, 0); - expr.right.visit(this, 0); - expr.operator.visit(this, 0); + public Object visitBinaryExpr(BinaryExpr expr, Integer arg) { - return 0; - } - - @Override - public Integer visitRefExpr(RefExpr expr, Integer arg) { - - expr.ref.visit(this, 0); + String op = expr.operator.spelling; - // Build code accordingly - if(expr.ref instanceof QualifiedRef) { + if(op.equals("&&") || op.equals("||")) { + int rep = (op.equals("&&")) ? Machine.falseRep : Machine.trueRep; - // Must be requesting length of array - if(expr.ref.decl.type.typeKind == TypeKind.ARRAY) { - int size = Machine.integerSize; - int addr = expr.ref.entity.addr + size; - Machine.emit(Op.LOAD, size, Reg.LB, addr); - } else { - expr.ref.entity.load(); - } - } - - else if(expr.ref instanceof IndexedRef) { - IndexedRef ref = (IndexedRef) expr.ref; - ref.entity.load(); - ref.indexExpr.visit(this, 0); - Machine.emit(Prim.arrayref); - } - - else if(expr.ref instanceof ThisRef) { - RuntimeEntity e = expr.ref.entity; - Machine.emit(Op.LOADA, e.size, e.register, e.addr); + expr.left.visit(this, null); + int leftJump = Machine.nextInstrAddr(); + Machine.emit(Op.JUMPIF, rep, Reg.CB, 0); + + expr.right.visit(this, null); + expr.operator.visit(this, null); + + Machine.patch(leftJump, Machine.nextInstrAddr()); } else { - expr.ref.entity.load(); + expr.left.visit(this, null); + expr.right.visit(this, null); + expr.operator.visit(this, null); } - return 0; + return null; } @Override - public Integer visitCallExpr(CallExpr expr, Integer arg) { + public Object visitRefExpr(RefExpr expr, Integer arg) { + + expr.ref.visit(this, null); + + return null; + } + + @Override + public Object visitCallExpr(CallExpr expr, Integer arg) { + + MethodDecl md = (MethodDecl) expr.functionRef.decl; // Push parameters on (must iterate in reverse order) for(int i = expr.argList.size() - 1; i >= 0; i--) { - expr.argList.get(i).visit(this, 0); + expr.argList.get(i).visit(this, null); } - - // Call method - MethodDecl md = (MethodDecl) expr.functionRef.decl; - expr.functionRef.visit(this, 0); + + // Call Method if(md.isStatic) { - Machine.emit(Op.CALL, Reg.CB, md.entity.addr); + patches.put(Machine.nextInstrAddr(), new Code(md, true)); + Machine.emit(Op.CALL, Reg.CB, 0); } else { - expr.functionRef.entity.call(); - Machine.emit(Op.CALLI, Reg.CB, md.entity.addr); + + if(expr.functionRef instanceof QualifiedRef) { + QualifiedRef ref = (QualifiedRef) expr.functionRef; + ref.ref.visit(this, null); + } else { + Machine.emit(Op.LOADA, Machine.addressSize, Reg.OB, 0); + } + + patches.put(Machine.nextInstrAddr(), new Code(md, true)); + Machine.emit(Op.CALLI, Reg.CB, 0); } - return 0; + return null; } @Override - public Integer visitLiteralExpr(LiteralExpr expr, Integer arg) { + public Object visitLiteralExpr(LiteralExpr expr, Integer arg) { - expr.literal.visit(this, 0); + expr.literal.visit(this, null); - return 0; + return null; } @Override - public Integer visitNewObjectExpr(NewObjectExpr expr, Integer arg) { - - RuntimeEntity e = expr.classtype.className.decl.entity; - Machine.emit(Op.LOADA, e.register, e.addr); - Machine.emit(Op.LOADL, e.size); + public Object visitNewObjectExpr(NewObjectExpr expr, Integer arg) { + + Declaration decl = expr.classtype.className.decl; + + patches.put(Machine.nextInstrAddr(), new Code(decl, true)); + Machine.emit(Op.LOADA, Reg.CB, 0); + + patches.put(Machine.nextInstrAddr(), new Code(decl, false)); + Machine.emit(Op.LOADL, 0); + Machine.emit(Prim.newobj); - return 0; + return null; } - /** - * Returns the address where the new array's size is being - * stored (as it cannot be easily accessed otherwise). - */ @Override - public Integer visitNewArrayExpr(NewArrayExpr expr, Integer arg) { - - // Setup - int addr = mdLBOffset; - int size = Machine.integerSize; - mdLBOffset += Machine.integerSize; - - // Add to stack - expr.sizeExpr.visit(this, 0); - - // Create new array - Machine.emit(Op.LOAD, size, Reg.LB, addr); + public Object visitNewArrayExpr(NewArrayExpr expr, Integer arg) { + + expr.sizeExpr.visit(this, null); Machine.emit(Prim.newarr); - return addr; + return null; } @@ -571,49 +527,91 @@ public class Encoder implements Visitor { // ///////////////////////////////////////////////////////////////////////////// @Override - public Integer visitQualifiedRef(QualifiedRef ref, Integer arg) { + public Object visitQualifiedRef(QualifiedRef ref, Integer arg) { - ref.ref.visit(this, 0); - - // Must be accessing length of an array + // Array type always returns value if(ref.ref.decl.type.typeKind == TypeKind.ARRAY) { - ref.decl = ref.ref.decl; - ref.entity = ref.ref.entity; - } - - // Access class member - else { - ref.entity = ref.id.decl.entity; - ref.entity.parent = ref.ref.entity; + + // Get address of object + if(ref.ref instanceof QualifiedRef) { + ref.ref.visit(this, null); + } else if(ref.ref instanceof ThisRef) { + patches.put(Machine.nextInstrAddr(), new Code(ref.id.decl, true)); + Machine.emit(Op.STORE, getSize(ref.id.decl.type), Reg.OB, 0); + } else { + patches.put(Machine.nextInstrAddr(), new Code(ref.ref.decl, true)); + Machine.emit(Op.LOAD, Machine.addressSize, Reg.LB, 0); + } + + Machine.emit(Op.LOADL, 1); + Machine.emit(Prim.sub); + Machine.emit(Op.LOADI, Machine.integerSize); + + return null; } - return 0; + MemberDecl md = (MemberDecl) ref.id.decl; + + // Assigning + if(arg != null) { + ref.ref.visit(this, null); + patches.put(Machine.nextInstrAddr(), new Code(ref.id.decl, true)); + Machine.emit(Op.LOADL, 0); + } + + // Retrieving + else if(md.isStatic) { + patches.put(Machine.nextInstrAddr(), new Code(md, true)); + Machine.emit(Op.LOAD, getSize(md.type), Reg.SB, 0); + } else { + ref.ref.visit(this, null); + int addr = Machine.nextInstrAddr(); + patches.put(addr, new Code(ref.decl, true)); + + Machine.emit(Op.LOADL, 0); + Machine.emit(Prim.fieldref); + } + + return null; } @Override - public Integer visitIndexedRef(IndexedRef ref, Integer arg) { + public Object visitIndexedRef(IndexedRef ref, Integer arg) { + + ref.ref.visit(this, null); + ref.indexExpr.visit(this, null); + + // Retrieving + if(arg == null) { + Machine.emit(Prim.arrayref); + } + + return null; + } + + @Override + public Object visitIdRef(IdRef ref, Integer arg) { ref.entity = ref.decl.entity; - return 0; + // Retrieving + if(arg == null) { + int size = getSize(ref.decl.type); + int addr = Machine.nextInstrAddr(); + patches.put(addr, new Code(ref.decl, true)); + + Machine.emit(Op.LOAD, size, Reg.ZR, 0); + } + + return null; } @Override - public Integer visitIdRef(IdRef ref, Integer arg) { - - ref.entity = ref.decl.entity; + public Object visitThisRef(ThisRef ref, Integer arg) { - return 0; - } - - @Override - public Integer visitThisRef(ThisRef ref, Integer arg) { + Machine.emit(Op.LOADA, Machine.addressSize, Reg.OB, 0); - RuntimeEntity e = ref.decl.entity; - ref.entity = new RuntimeEntity(e.size, 0, Reg.OB); - ref.entity.indirect = true; - - return 0; + return null; } @@ -624,15 +622,15 @@ public class Encoder implements Visitor { // ///////////////////////////////////////////////////////////////////////////// @Override - public Integer visitIdentifier(Identifier id, Integer arg) { + public Object visitIdentifier(Identifier id, Integer arg) { - return 0; + return null; } @Override - public Integer visitOperator(Operator op, Integer arg) { + public Object visitOperator(Operator op, Integer arg) { - switch(op.token.spelling) { + switch(op.spelling) { case "+": Machine.emit(Prim.add); break; @@ -671,20 +669,20 @@ public class Encoder implements Visitor { break; } - return 0; + return null; } @Override - public Integer visitIntLiteral(IntLiteral num, Integer arg) { + public Object visitIntLiteral(IntLiteral num, Integer arg) { Integer lit = Integer.parseInt(num.spelling); Machine.emit(Op.LOADL, lit.intValue()); - return 0; + return null; } @Override - public Integer visitBooleanLiteral(BooleanLiteral bool, Integer arg) { + public Object visitBooleanLiteral(BooleanLiteral bool, Integer arg) { if(bool.spelling.equals("true")) { Machine.emit(Op.LOADL, Machine.trueRep); @@ -692,7 +690,35 @@ public class Encoder implements Visitor { Machine.emit(Op.LOADL, Machine.falseRep); } - return 0; + return null; + } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // Convenience Methods + // + // ///////////////////////////////////////////////////////////////////////////// + + /** + * Get size of type for declaration purposes. + * @param t + * @return + */ + private int getSize(Type t) { + switch(t.typeKind) { + case ARRAY: + case CLASS: + return Machine.addressSize; + case INT: + return Machine.integerSize; + case BOOLEAN: + return Machine.booleanSize; + case VOID: + return 0; + default: + return -1; + } } } diff --git a/src/miniJava/CodeGenerator/RuntimeEntity.java b/src/miniJava/CodeGenerator/RuntimeEntity.java index a05ebce..8571a10 100644 --- a/src/miniJava/CodeGenerator/RuntimeEntity.java +++ b/src/miniJava/CodeGenerator/RuntimeEntity.java @@ -1,52 +1,19 @@ package miniJava.CodeGenerator; -import mJAM.Machine; -import mJAM.Machine.Op; -import mJAM.Machine.Prim; import mJAM.Machine.Reg; public class RuntimeEntity { + + public Reg reg; + public int size; + public int addr; - public int size = -1; // Size of type - public int addr = -1; // Position relative to register - public int instr = -1; // Instruction relative to CB - public Reg register = Reg.ZR; // Register to offset by + RuntimeEntity parent = null; - // For use with nested elements - public boolean indirect = false; - public RuntimeEntity parent = null; - - public RuntimeEntity(int size, int addr, Reg register) { - this(size, addr, register, -1); - } - - public RuntimeEntity(int size, int addr, Reg register, int instr) { + public RuntimeEntity(int size, int addr, Reg reg) { + this.reg = reg; this.size = size; this.addr = addr; - this.register = register; - this.instr = instr; } - // Load entity into memory (if this, should call LOADA) - public void load() { - if(parent != null) { - parent.load(); - Machine.emit(Op.LOADL, addr); - Machine.emit(Prim.fieldref); - } else { - if(indirect) { - Machine.emit(Op.LOADA, size, register, addr); - } else { - Machine.emit(Op.LOAD, size, register, addr); - } - } - } - - public void call() { - if(parent != null) { - parent.load(); - } else { - Machine.emit(Op.LOADA, size, Reg.OB, 0); - } - } } diff --git a/src/miniJava/Compiler.java b/src/miniJava/Compiler.java index f137eb9..2059ca1 100644 --- a/src/miniJava/Compiler.java +++ b/src/miniJava/Compiler.java @@ -1,13 +1,21 @@ package miniJava; -import java.io.*; +import java.io.FileReader; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.FileNotFoundException; -import mJAM.*; -import miniJava.SyntacticAnalyzer.*; +import mJAM.Disassembler; +import mJAM.Interpreter; +import mJAM.ObjectFile; +import miniJava.SyntacticAnalyzer.Scanner; +import miniJava.SyntacticAnalyzer.Parser; import miniJava.AbstractSyntaxTrees.Package; -import miniJava.ContextualAnalyzer.Analyzer; +import miniJava.AbstractSyntaxTrees.ASTDisplay; import miniJava.CodeGenerator.Encoder; -import miniJava.Exceptions.*; +import miniJava.ContextualAnalyzer.IdTable; +import miniJava.ContextualAnalyzer.Analyzer; +import miniJava.ContextualAnalyzer.Reporter; public class Compiler { @@ -26,15 +34,22 @@ public class Compiler { Scanner scanner = new Scanner(new BufferedReader(input)); Parser parser = new Parser(scanner); Package p = parser.parse(); - - // Identification/Type Checking - Analyzer analyzer = new Analyzer(); - analyzer.visitPackage(p, null); - int analyzed = analyzer.validate(); - // Begin Compilation to mJAM - if(analyzed == 0) { + // Display + ASTDisplay display = new ASTDisplay(); + display.showTree(p); + + // Contextual Analyzer + IdTable table = new IdTable(); + Analyzer analyzer = new Analyzer(); + analyzer.visitPackage(p, table); + + // Compilation + if(Reporter.error) { + System.exit(rc); + } else { + // Build mJAM assembly Encoder encoder = new Encoder(); encoder.visitPackage(p, null); @@ -43,23 +58,36 @@ public class Compiler { String objectFileName = args[0].substring(0, pos) + ".mJAM"; ObjectFile objF = new ObjectFile(objectFileName); if(objF.write()) { - System.out.println("***Object File Failed."); + Reporter.emit("Object File Failed."); } + + // create asm file using disassembler + String asmCodeFileName = "test.asm"; + System.out.print("Writing assembly file ... "); + Disassembler d = new Disassembler(objectFileName); + if (d.disassemble()) { + System.out.println("FAILED!"); + return; + } + else + System.out.println("SUCCEEDED"); + + // run + System.out.println("Running code ... "); + Interpreter.debug(objectFileName, asmCodeFileName); + + System.out.println("*** mJAM execution completed"); } - System.exit(analyzed); + System.exit(0); } catch (FileNotFoundException e) { - System.out.println("***" + e.getMessage()); + Reporter.emit(e.getMessage()); } catch (IOException e) { - System.out.println("***" + e.getMessage()); - } catch (ScanningException e) { - System.out.println("***" + e.getMessage()); - } catch (ParsingException e) { - System.out.println("***" + e.getMessage()); + Reporter.emit(e.getMessage()); } System.exit(rc); } -} +} \ No newline at end of file diff --git a/src/miniJava/ContextualAnalyzer/Analyzer.java b/src/miniJava/ContextualAnalyzer/Analyzer.java index 9a23e8a..65f4bff 100644 --- a/src/miniJava/ContextualAnalyzer/Analyzer.java +++ b/src/miniJava/ContextualAnalyzer/Analyzer.java @@ -1,68 +1,38 @@ package miniJava.ContextualAnalyzer; -import java.util.*; +import java.io.IOException; +import java.util.ArrayList; import miniJava.Compiler; -import miniJava.Exceptions.*; -import miniJava.SyntacticAnalyzer.*; -import miniJava.SyntacticAnalyzer.Scanner; import miniJava.AbstractSyntaxTrees.*; import miniJava.AbstractSyntaxTrees.Package; +import miniJava.SyntacticAnalyzer.Parser; +import miniJava.SyntacticAnalyzer.Scanner; -public class Analyzer implements Visitor { - - public static MethodDecl mainMethod = null; - public static MethodDecl println = null; +public class Analyzer implements Visitor { - // Notifies if handling predefined as opposed to user defined code - private boolean predefinedGen = true; + public Reporter reporter = new Reporter(); - // Keeps track of declarations - private VarDecl currentVarDecl = null; - private ClassDecl currentClassDecl = null; - private MethodDecl currentMethodDecl = null; + // Required Methods + public static MethodDecl main; + public static MethodDecl println; - // Keeps track of identifcatoin - private IdentificationTable table = new IdentificationTable(); - - // Keep track of all predefined names to handle + // Predefined private static ArrayList predefined; static { predefined = new ArrayList(); - predefined.add("class _PrintStream { public void println(int n){} }"); - predefined.add("class System { public static _PrintStream out; }"); predefined.add("class String { }"); + predefined.add("class _PrintStream { public void println(int n){} }"); + predefined.add("class System { public static _PrintStream out; }"); } - - /** - * Adds predefined names to topmost table. These names should not be allowed - * redefinition and must be ordered such that no class refers to one - * undeclared yet. - */ - public Analyzer() throws ParsingException, ScanningException { - for (String s : predefined) { - Scanner scanner = new Scanner(s); - Parser parser = new Parser(scanner); - parser.parse().visit(this, table); - } - predefinedGen = false; - } - - /** - * Checks that contextual analysis was successful or not, returning the - * proper error code in either case. - * - * @return - */ - public int validate() { - // Exactly one public static void main(String[] args) function must be declared - if (mainMethod == null) - Reporter.report(ErrorType.MAIN_UNDECLARED, null, null); - - return (Reporter.error) ? Compiler.rc : 0; - } - + + // Keep Track Of Declarations + private IdTable top = null; + private VarDecl currentVarDecl = null; + private ClassDecl currentClassDecl = null; + private MethodDecl currentMethodDecl = null; + // ///////////////////////////////////////////////////////////////////////////// // @@ -70,40 +40,44 @@ public class Analyzer implements Visitor { // // ///////////////////////////////////////////////////////////////////////////// - public Type visitPackage(Package prog, IdentificationTable arg) { - - /* - * Since classes and static methods/fields can be referenced before the - * classes themselves are declared, we preprocess all classes and - * methods first. - */ - for (ClassDecl cd : prog.classDeclList) { - - IdentificationTable cdTable = table.openScope(cd); - - if (cdTable != null) { - - // Simply add fields to current scope - for (FieldDecl fd : cd.fieldDeclList) { - cdTable.setDeclarationAtScope(fd); - } - - // Just Add Declaration (also creates another identification table) - for (MethodDecl md : cd.methodDeclList) { - cdTable.openScope(md); - } + @Override + public Type visitPackage(Package prog, IdTable table) { + + top = table; + + // Begin predefinitions + try { + for(String pd : predefined) { + Scanner scanner = new Scanner(pd, true); + Parser parser = new Parser(scanner); + ClassDecl cd = parser.parseClassDeclaration(); + + addDeclarations(cd, table); + cd.visit(this, table); } + } catch(IOException e) { + Reporter.emit("System Predefinitions Error!"); + System.exit(Compiler.rc); } - - // Begin Traversal - for (ClassDecl cd : prog.classDeclList) { - currentClassDecl = cd; + + // Add all second level declarations + for(ClassDecl cd : prog.classDeclList) { + addDeclarations(cd, table); + } + + // Begin traversal + for(ClassDecl cd : prog.classDeclList) { cd.visit(this, table); } + + // Check a main exists + if(main == null) { + Reporter.emit("Main method undeclared."); + } return null; } - + // ///////////////////////////////////////////////////////////////////////////// // @@ -111,228 +85,283 @@ public class Analyzer implements Visitor { // // ///////////////////////////////////////////////////////////////////////////// - public Type visitClassDecl(ClassDecl cd, IdentificationTable arg) { - - IdentificationTable cdTable = arg.getScope(cd); - - if (cdTable != null) { - - for (FieldDecl fd : cd.fieldDeclList) { - fd.visit(this, cdTable); - } - - for (MethodDecl md : cd.methodDeclList) { - currentMethodDecl = md; - md.visit(this, cdTable); - } - } - - return cd.type; - } - - public Type visitFieldDecl(FieldDecl fd, IdentificationTable arg) { - - // Must check that the type of the field can be identified - if (!table.classExists(fd.type)) { - Reporter.report(ErrorType.UNDECLARED_TYPE, fd.type, null); - } else if(fd.type.typeKind == TypeKind.VOID) { - Reporter.report(ErrorType.VOID_TYPE, fd.type, null); - } - - return fd.type; - } - - public Type visitMethodDecl(MethodDecl md, IdentificationTable arg) { + @Override + public Type visitClassDecl(ClassDecl cd, IdTable table) { - if(predefinedGen && md.name.equals("println")) { + currentClassDecl = cd; + + for(FieldDecl fd : cd.fieldDeclList) { + fd.visit(this, cd.table); + } + + for(MethodDecl md : cd.methodDeclList) { + md.visit(this, cd.table); + } + + return null; + } + + @Override + public Type visitFieldDecl(FieldDecl fd, IdTable table) { + + fd.type.visit(this, table); + if(fd.type.typeKind == TypeKind.VOID) { + Reporter.emit("Field " + fd.name + " at " + fd.posn + " cannot have type 'void'"); + } + + return null; + } + + @Override + public Type visitMethodDecl(MethodDecl md, IdTable table) { + + currentMethodDecl = md; + + // Save println method + if(println == null && md.name.equals("println")) { println = md; } - - // Check if a valid entry point to program - if (IdentificationTable.isMainMethod(md)) { - if (mainMethod != null) - Reporter.report(ErrorType.MULTIPLE_MAIN, md, mainMethod); - else - mainMethod = md; + + // Save main method + if(isMain(md)) { + if(main != null) { + Reporter.emit("Main at " + md.posn + " previously defined at " + main.posn); + } else { + main = md; + } } - - // Must check that the type of the method can be identified - if (!table.classExists(md.type)) { - Reporter.report(ErrorType.UNDECLARED_TYPE, md.type, null); - } - + // Continue Traversal - IdentificationTable mdTable = arg.getScope(md); - if (mdTable != null) { - for (ParameterDecl pd : md.parameterDeclList) - pd.visit(this, mdTable); - for (Statement s : md.statementList) - s.visit(this, mdTable); - - // Check that return type matches expected type - if (md.returnExp == null && md.type.typeKind != TypeKind.VOID) { - Reporter.report(ErrorType.NO_RETURN, md, null); - } else if (md.returnExp != null) { - Type returnType = md.returnExp.visit(this, mdTable); - IdentificationTable.match(md.type, returnType, true); + md.type.visit(this, table); + + for(ParameterDecl pd : md.parameterDeclList) { + pd.visit(this, md.table); + } + + for(Statement s : md.statementList) { + s.visit(this, md.table); + } + + // Check return status + if(md.type.typeKind != TypeKind.VOID && md.returnExp == null) { + Reporter.emit("Method " + md.name + " at " + md.posn + " must have a return expression"); + } else if(md.type.typeKind == TypeKind.VOID && md.returnExp != null) { + Reporter.emit("Method " + md.name + " at " + md.posn + " cannot have a return expression"); + } + + if(md.returnExp != null) { + Type returnType = md.returnExp.visit(this, md.table); + if(!match(returnType, md.type)) { + Reporter.emit("Expected " + md.type + " but got " + returnType + " at " + md.returnExp.posn); } } - return md.type; + return null; } - public Type visitParameterDecl(ParameterDecl pd, IdentificationTable arg) { - arg.setDeclarationAtScope(pd); - if (!table.classExists(pd.type)) { - Reporter.report(ErrorType.UNDECLARED_TYPE, pd.type, null); - } else if(pd.type.typeKind == TypeKind.VOID) { - Reporter.report(ErrorType.VOID_TYPE, pd.type, null); - } - - return pd.type; - } - - public Type visitVarDecl(VarDecl decl, IdentificationTable arg) { - arg.setDeclarationAtScope(decl); - if (!table.classExists(decl.type)) { - Reporter.report(ErrorType.UNDECLARED_TYPE, decl.type, null); - } else if(decl.type.typeKind == TypeKind.VOID) { - Reporter.report(ErrorType.VOID_TYPE, decl.type, null); + @Override + public Type visitParameterDecl(ParameterDecl pd, IdTable table) { + + table.add(pd); + pd.type.visit(this, table); + if(pd.type.typeKind == TypeKind.VOID) { + Reporter.emit("Parameter " + pd.name + " at " + pd.posn + " cannot have type 'void'"); } - return decl.type; + return null; } - + @Override + public Type visitVarDecl(VarDecl decl, IdTable table) { + + table.add(decl); + decl.type.visit(this, table); + if(decl.type.typeKind == TypeKind.VOID) { + Reporter.emit("Variable " + decl.name + " at " + decl.posn + " cannot have type 'void'"); + } + + return null; + } + + // ///////////////////////////////////////////////////////////////////////////// // // TYPES // // ///////////////////////////////////////////////////////////////////////////// - - public Type visitBaseType(BaseType type, IdentificationTable arg) { - + + @Override + public Type visitBaseType(BaseType type, IdTable table) { + return type; } - public Type visitClassType(ClassType type, IdentificationTable arg) { - type.className.visit(this, arg); + @Override + public Type visitClassType(ClassType type, IdTable table) { + + type.className.visit(this, table); + + // Must check that the type is valid + String cn = type.className.spelling; + if(top.getDeclarationAtScope(cn) == null) { + Reporter.emit("Class '" + cn + "' undeclared at " + type.posn); + } + return type; } - public Type visitArrayType(ArrayType type, IdentificationTable arg) { - type.eltType.visit(this, arg); + @Override + public Type visitArrayType(ArrayType type, IdTable table) { + + type.eltType.visit(this, table); + return type; } - + // ///////////////////////////////////////////////////////////////////////////// // // STATEMENTS // // ///////////////////////////////////////////////////////////////////////////// - public Type visitBlockStmt(BlockStmt stmt, IdentificationTable arg) { - arg.pushLevel(); - for (Statement s : stmt.sl) - s.visit(this, arg); - arg.popLevel(); - + @Override + public Type visitBlockStmt(BlockStmt stmt, IdTable table) { + + table.push(); + + for(Statement s : stmt.sl) { + s.visit(this, table); + } + + table.pop(); + return null; } - // The stmt of the vardecl may not refer to the variable itself - public Type visitVardeclStmt(VarDeclStmt stmt, IdentificationTable arg) { - Type varDeclType = stmt.varDecl.visit(this, arg); + @Override + public Type visitVardeclStmt(VarDeclStmt stmt, IdTable table) { + + stmt.varDecl.visit(this, table); currentVarDecl = stmt.varDecl; - Type initExpType = stmt.initExp.visit(this, arg); - IdentificationTable.match(varDeclType, initExpType, true); + Type exprType = stmt.initExp.visit(this, table); currentVarDecl = null; - // Can't have a class reference as the sole rhs - if(stmt.initExp instanceof RefExpr && initExpType.typeKind == TypeKind.CLASS) { - RefExpr re = (RefExpr)stmt.initExp; - Declaration decl = table.getDeclarationAtScope(re.ref.decl.name); - if(decl != null) Reporter.report(ErrorType.CLASS_IDENTIFER, stmt, null); + // Types must match + if(!match(stmt.varDecl.type, exprType)) { + Reporter.emit("Expected " + stmt.varDecl.type + " but got " + exprType + " at " + stmt.initExp.posn); } - - return varDeclType; + + return null; } - public Type visitAssignStmt(AssignStmt stmt, IdentificationTable arg) { - Type refType = stmt.ref.visit(this, arg); - Type valType = stmt.val.visit(this, arg); - IdentificationTable.match(valType, refType, true); + @Override + public Type visitAssignStmt(AssignStmt stmt, IdTable table) { - if(stmt.ref.decl instanceof MethodDecl) - Reporter.report(ErrorType.FUNCTION_ASSIGNMENT, stmt.ref.decl, null); - - return refType; - } - - public Type visitCallStmt(CallStmt stmt, IdentificationTable arg) { - - Type methodType = stmt.methodRef.visit(this, arg); + Type refType = stmt.ref.visit(this, table); + Type valType = stmt.val.visit(this, table); - if(methodType.typeKind != TypeKind.ERROR) { - - // Check that parameter count is correct and each type is correct - MethodDecl decl = (MethodDecl) stmt.methodRef.decl; - if (decl.parameterDeclList.size() != stmt.argList.size()) { - Reporter.report(ErrorType.INVALID_PARAM_COUNT, stmt, decl); - } else { - for (int i = 0; i < stmt.argList.size(); i++) { - Type exprType = stmt.argList.get(i).visit(this, arg); - Type pdType = decl.parameterDeclList.get(i).type; - IdentificationTable.match(pdType, exprType, true); - } + if(!match(refType, valType)) { + Reporter.emit("Expected " + refType + " but got " + valType + " at " + stmt.posn); + } + + // Should never assign 'this' to anything + if(stmt.ref instanceof ThisRef) { + Reporter.emit("Cannot assign 'this' to a value at " + stmt.posn); + } + + // Should never assign a method a value + if(stmt.ref.decl instanceof MethodDecl) { + Reporter.emit("Cannot assign a method a value at " + stmt.posn); + } + + // Cannot assign array length field + if(stmt.ref instanceof QualifiedRef) { + QualifiedRef ref = (QualifiedRef) stmt.ref; + if(ref.ref.decl.type.typeKind == TypeKind.ARRAY && ref.id.spelling.equals("length")) { + Reporter.emit("'length' field cannot be changed at " + stmt.posn); } } - - return methodType; + + return null; } - public Type visitIfStmt(IfStmt stmt, IdentificationTable arg) { + @Override + public Type visitCallStmt(CallStmt stmt, IdTable table) { + + stmt.methodRef.visit(this, table); + + // Check valid parameter count + MethodDecl md = (MethodDecl) stmt.methodRef.decl; + if(md.parameterDeclList.size() != stmt.argList.size()) { + Reporter.emit("Expected " + md.parameterDeclList.size() + " parameters at " + stmt.posn); + return null; + } + + // Check parameter types match + for (int i = 0; i < stmt.argList.size(); i++) { + Expression e = stmt.argList.get(i); + Type exprType = e.visit(this, table); + ParameterDecl pd = md.parameterDeclList.get(i); - // The conditional statment must be a boolean - Type condType = stmt.cond.visit(this, arg); - IdentificationTable.match(new BaseType(TypeKind.BOOLEAN, null), condType, true); - - // A single vardecl cannot exist after a conditional statement - if (stmt.thenStmt instanceof VarDeclStmt) { - Reporter.report(ErrorType.SINGLE_VARCOND, stmt.thenStmt, null); - } else { - stmt.thenStmt.visit(this, arg); - if (stmt.elseStmt != null) { - if (stmt.elseStmt instanceof VarDeclStmt) { - Reporter.report(ErrorType.SINGLE_VARCOND, stmt.elseStmt, - null); - } else { - stmt.elseStmt.visit(this, arg); - } + if(!match(pd.type, exprType)) { + Reporter.emit("Parameter " + pd.name + " is of type " + pd.type + " but got " + exprType + " at " + e.posn); } } return null; } - public Type visitWhileStmt(WhileStmt stmt, IdentificationTable arg) { - - // The conditional statment must be a boolean - Type condType = stmt.cond.visit(this, arg); - IdentificationTable.match(new BaseType(TypeKind.BOOLEAN, null), condType, true); - - // A single vardecl cannot exist after a conditional statement - if (stmt.body instanceof VarDeclStmt) { - Reporter.report(ErrorType.SINGLE_VARCOND, stmt.body, null); - } else { - stmt.body.visit(this, arg); + @Override + public Type visitIfStmt(IfStmt stmt, IdTable table) { + + // Conditional statement must have type boolean + Type condType = stmt.cond.visit(this, table); + if(condType.typeKind != TypeKind.BOOLEAN) { + Reporter.emit("Expected boolean but got " + condType + " at " + condType.posn); + } + + // A single variable declaration not allowed after conditional statement + if(stmt.thenStmt instanceof VarDeclStmt) { + Reporter.emit("Variable declaration not allowed solely in 'then' clause at " + stmt.thenStmt.posn); + return null; + } + + stmt.thenStmt.visit(this, table); + + // Check else statement + if (stmt.elseStmt != null) { + if (stmt.elseStmt instanceof VarDeclStmt) { + Reporter.emit("Variable declaration not allowed solely in 'else' clause at " + stmt.elseStmt.posn); + return null; + } + + stmt.elseStmt.visit(this, table); } return null; } + @Override + public Type visitWhileStmt(WhileStmt stmt, IdTable table) { + + // Conditional statement must have type boolean + Type condType = stmt.cond.visit(this, table); + if(condType.typeKind != TypeKind.BOOLEAN) { + Reporter.emit("Expected boolean but got " + condType + " at " + condType.posn); + } + + if(stmt.body instanceof VarDeclStmt) { + Reporter.emit("Variable declaration not allowed solely in 'while' clause at " + stmt.body.posn); + return null; + } + + stmt.body.visit(this, table); + + return null; + } + // ///////////////////////////////////////////////////////////////////////////// // @@ -340,85 +369,153 @@ public class Analyzer implements Visitor { // // ///////////////////////////////////////////////////////////////////////////// - public Type visitUnaryExpr(UnaryExpr expr, IdentificationTable arg) { - Type opType = expr.operator.visit(this, arg); - Type exprType = expr.expr.visit(this, arg); - IdentificationTable.match(opType, exprType, true); - + @Override + public Type visitUnaryExpr(UnaryExpr expr, IdTable table) { + + Type exprType = expr.expr.visit(this, table); + Type opType = expr.operator.visit(this, table); + if(!match(exprType, opType)) { + String op = expr.operator.spelling; + Reporter.emit("Operator " + op + " applies to " + opType + " but got " + exprType + " at " + expr.posn); + } + return opType; } - public Type visitBinaryExpr(BinaryExpr expr, IdentificationTable arg) { - Type opType = expr.operator.visit(this, arg); - Type leftType = expr.left.visit(this, arg); - Type rightType = expr.right.visit(this, arg); + @Override + public Type visitBinaryExpr(BinaryExpr expr, IdTable table) { - // Both sides must be the same - if(opType.typeKind == TypeKind.EQUALS) { - IdentificationTable.match(leftType, rightType, true); - return new BaseType(TypeKind.BOOLEAN, opType.posn); - } + Type lType = expr.left.visit(this, table); + Type rType = expr.right.visit(this, table); - // Both sides must be integers - else if(opType.typeKind == TypeKind.RELATIONAL) { - BaseType bt = new BaseType(TypeKind.INT, opType.posn); - IdentificationTable.match(bt, leftType, true); - IdentificationTable.match(bt, rightType, true); - return new BaseType(TypeKind.BOOLEAN, opType.posn); - } - - // Both sides must match operator type - IdentificationTable.match(leftType, opType, true); - IdentificationTable.match(rightType, opType, true); - return opType; - } - - public Type visitRefExpr(RefExpr expr, IdentificationTable arg) { - Type exprType = expr.ref.visit(this, arg); - return exprType; - } - - public Type visitCallExpr(CallExpr expr, IdentificationTable arg) { - Type functionRefType = expr.functionRef.visit(this, arg); - - if(expr.functionRef.decl instanceof MethodDecl) { + BaseType type = null; + String op = expr.operator.spelling; + switch(op) { - MethodDecl decl = (MethodDecl) expr.functionRef.decl; - - // Check that parameter count is correct and each type is correct - if (decl.parameterDeclList.size() != expr.argList.size()) { - Reporter.report(ErrorType.INVALID_PARAM_COUNT, expr, decl); - } else { - for (int i = 0; i < expr.argList.size(); i++) { - Type exprType = expr.argList.get(i).visit(this, arg); - Type pdType = decl.parameterDeclList.get(i).type; - IdentificationTable.match(pdType, exprType, true); + // Equality Operators + case "==": + case "!=": + if(!match(lType, rType)) { + Reporter.emit("Left hand side must be of right hand side's type " + rType + " at " + expr.posn); } + return new BaseType(TypeKind.BOOLEAN, expr.posn); + + // Boolean Operators + case "&&": + case "||": + type = new BaseType(TypeKind.BOOLEAN, expr.posn); + break; + + // Integer operators + case ">": + case "<": + case "+": + case "-": + case "*": + case "/": + case "<=": + case ">=": + type = new BaseType(TypeKind.INT, expr.posn); + break; + + default: + return new BaseType(TypeKind.ERROR, expr.posn); + } + + // Make sure types match + if(!match(lType, type)) { + Reporter.emit("Expected " + type + " but got " + lType + " at " + expr.posn); + } + + if(!match(rType, type)) { + Reporter.emit("Expected " + type + " but got " + lType + " at " + expr.posn); + } + + // Resulting type + return expr.operator.visit(this, table); + } + + @Override + public Type visitRefExpr(RefExpr expr, IdTable table) { + + Type refType = expr.ref.visit(this, table); + Declaration decl = table.getDeclaration(expr.ref.spelling); + + // Should never reference a class name + if(decl instanceof ClassDecl) { + Reporter.emit("Class declaration referenced at " + expr.posn); + } + + // Should never reference a method name + else if(decl instanceof MethodDecl) { + Reporter.emit("Method declaration referenced at " + expr.posn); + } + + // Cannot access instance members in static context + if(!(expr.ref instanceof QualifiedRef) && decl instanceof FieldDecl) { + FieldDecl fd = (FieldDecl) decl; + if(currentMethodDecl.isStatic && !fd.isStatic) { + Reporter.emit("Cannot access instance member in static context at " + expr.posn); } - } else { - Reporter.report(ErrorType.NONFUNCTION_CALL, expr, null); } - return functionRefType; + return refType; } - public Type visitLiteralExpr(LiteralExpr expr, IdentificationTable arg) { - Type literalType = expr.literal.visit(this, arg); - return literalType; + @Override + public Type visitCallExpr(CallExpr expr, IdTable table) { + + Type refType = expr.functionRef.visit(this, table); + + // Check parameter count matches + MethodDecl md = (MethodDecl) expr.functionRef.decl; + if(md.parameterDeclList.size() != expr.argList.size()) { + Reporter.emit("Expected " + md.parameterDeclList.size() + " parameters at " + expr.posn); + return refType; + } + + // Check parameter types match + for (int i = 0; i < expr.argList.size(); i++) { + Expression e = expr.argList.get(i); + Type exprType = e.visit(this, table); + ParameterDecl pd = md.parameterDeclList.get(i); + + if(!match(pd.type, exprType)) { + Reporter.emit("Parameter " + pd.name + " is of type " + pd.type + " but got " + exprType + " at " + e.posn); + } + } + + return refType; } - public Type visitNewObjectExpr(NewObjectExpr expr, IdentificationTable arg) { - Type objectType = expr.classtype.visit(this, arg); - return objectType; + @Override + public Type visitLiteralExpr(LiteralExpr expr, IdTable table) { + + return expr.literal.visit(this, table); } - public Type visitNewArrayExpr(NewArrayExpr expr, IdentificationTable arg) { - Type sizeExprType = expr.sizeExpr.visit(this, arg); - if (sizeExprType.typeKind != TypeKind.INT) { - Reporter.report(ErrorType.INVALID_INDEX, expr.sizeExpr, null); + @Override + public Type visitNewObjectExpr(NewObjectExpr expr, IdTable table) { + + return expr.classtype.visit(this, table); + } + + @Override + public Type visitNewArrayExpr(NewArrayExpr expr, IdTable table) { + + // Arrays only of classes and integers + Type eltType = expr.eltType.visit(this, table); + if(eltType.typeKind != TypeKind.INT && eltType.typeKind != TypeKind.CLASS) { + Reporter.emit("Cannot create array of type " + eltType + " at " + expr.posn); + } + + // Size must be an integer value + Type sizeType = expr.sizeExpr.visit(this, table); + if (sizeType.typeKind != TypeKind.INT) { + BaseType type = new BaseType(TypeKind.INT, expr.sizeExpr.posn); + Reporter.emit("Expected " + type + " but got " + sizeType + " at " + type.posn); } - Type eltType = expr.eltType.visit(this, arg); return new ArrayType(eltType, expr.posn); } @@ -428,171 +525,166 @@ public class Analyzer implements Visitor { // REFERENCES // // ///////////////////////////////////////////////////////////////////////////// - - public Type visitQualifiedRef(QualifiedRef ref, IdentificationTable arg) { - Type refType = ref.ref.visit(this, arg); + @Override + public Type visitQualifiedRef(QualifiedRef ref, IdTable table) { - // Array types only have the single 'length' field + Type refType = ref.ref.visit(this, table); + + // Should not try and access a method in qualified manner + if(ref.ref.decl instanceof MethodDecl) { + Reporter.emit("Cannot use method " + ref.ref.decl.name + " in qualified manner at " + ref.ref.posn); + return new BaseType(TypeKind.ERROR, ref.ref.posn); + } + + // Array types can have a length field if(refType.typeKind == TypeKind.ARRAY) { if(!ref.id.spelling.equals("length")) { - Reporter.report(ErrorType.LENGTH, ref.id, null); - return refType; + Reporter.emit(ref.id.spelling + " attribute not available with arrays at " + ref.id.posn); + return new BaseType(TypeKind.ERROR, ref.id.posn); } return new BaseType(TypeKind.INT, ref.id.posn); - } - - // Note qualified ref's only make sense in the context of classes - else if(refType.typeKind != TypeKind.CLASS) { - if(refType.typeKind != TypeKind.ERROR) // Don't need to report multiple times - Reporter.report(ErrorType.TYPE_MISMATCH, new BaseType(TypeKind.CLASS, null), refType); - - return refType; - } - - // Try to find qualified member - Declaration qualified = ref.ref.decl; - ClassType qualType = (ClassType) qualified.type; - Declaration qualClassDecl = table.getDeclaration(qualType.className.spelling); - if(qualClassDecl == null) { - Reporter.report(ErrorType.UNDECLARED_TYPE, qualified.type, null); - return new BaseType(TypeKind.ERROR, qualified.posn); } - // Get member - IdentificationTable cdTable = table.getScope(qualClassDecl); - MemberDecl md = (MemberDecl) cdTable.getDeclarationAtScope(ref.id.spelling); - - // Check the member exists at all + // Otherwise, should have a class type + if(refType.typeKind != TypeKind.CLASS) { + Reporter.emit("Qualified reference not of type class or array at " + ref.posn); + return new BaseType(TypeKind.ERROR, ref.posn); + } + + // Get member in question + ClassType ct = (ClassType) refType; + ClassDecl cd = (ClassDecl) top.getDeclarationAtScope(ct.className.spelling); + if(cd == null) { + Reporter.emit("Accessing non-existant class at " + ct.posn); + return new BaseType(TypeKind.ERROR, ref.posn); + } + + MemberDecl md = (MemberDecl) cd.table.getDeclarationAtScope(ref.id.spelling); if(md == null) { - Reporter.report(ErrorType.UNDEFINED, ref.id, null); - return new BaseType(TypeKind.ERROR, ref.id.posn); - } - - // If the qualifed ref is a class declaration, members must be static (must check for 'this') - else if(qualified instanceof ClassDecl && !(ref.ref instanceof ThisRef)) { - if(!md.isStatic) { - Reporter.report(ErrorType.STATIC, md, ref.id); - return new BaseType(TypeKind.ERROR, ref.id.posn); - } else if(md.isPrivate) { - Reporter.report(ErrorType.VISIBILITY, md, ref.id); - return new BaseType(TypeKind.ERROR, ref.id.posn); - } + Reporter.emit("Accessing non-existant field at " + ref.id.posn); + return new BaseType(TypeKind.ERROR, ref.posn); } - // The member should not be a method, as this is unsupported - else if(qualified instanceof MethodDecl) { - Reporter.report(ErrorType.UNDEFINED, ref.id, null); + // Check if static member + Declaration decl = table.getDeclaration(ref.ref.spelling); + if(decl instanceof ClassDecl && !md.isStatic) { + Reporter.emit("Cannot access non-static member at " + ref.id.posn); } - - // Otherwise, we can assume the object is a variable and attempt to access members - else if(md.isPrivate && currentClassDecl != qualClassDecl) { - Reporter.report(ErrorType.VISIBILITY, md, ref.id); - return new BaseType(TypeKind.ERROR, ref.id.posn); + + // Check Visibility Status + if(md.isPrivate && cd != currentClassDecl) { + Reporter.emit("Cannot access private member at " + ref.id.posn); } - - ref.id.decl = md; + ref.decl = md; + ref.id.decl = md; + ref.spelling = ref.id.spelling; + return md.type; } - public Type visitIndexedRef(IndexedRef ref, IdentificationTable arg) { - - ArrayType refType = (ArrayType) ref.ref.visit(this, arg); - - // Make sure index is an integer - Type indexExprType = ref.indexExpr.visit(this, arg); - if (indexExprType.typeKind != TypeKind.INT) { - Reporter.report(ErrorType.INVALID_INDEX, ref.indexExpr, null); + @Override + public Type visitIndexedRef(IndexedRef ref, IdTable table) { + + Type refType = ref.ref.visit(this, table); + ref.spelling = ref.ref.spelling; + + // Must be an array type + if(refType.typeKind != TypeKind.ARRAY) { + Reporter.emit("Trying to index " + refType + " at " + ref.ref.posn); + return refType; + } + + // Index must be an integer value + Type indexType = ref.indexExpr.visit(this, table); + if(indexType.typeKind != TypeKind.INT) { + BaseType type = new BaseType(TypeKind.INT, ref.indexExpr.posn); + Reporter.emit("Expected " + type + " but got " + indexType + " at " + type.posn); + } + + // Array types can be of either classes or ints + ArrayType at = (ArrayType) refType; + if(at.eltType.typeKind == TypeKind.CLASS) { + ClassType ct = (ClassType) at.eltType; + ref.decl = table.getDeclaration(ct.className.spelling); + return ref.decl.type; + } else { + ref.decl = null; + return new BaseType(TypeKind.INT, ref.posn); } - - ref.decl = ref.ref.decl; - return refType.eltType; } - public Type visitIdRef(IdRef ref, IdentificationTable arg) { - Type idType = ref.id.visit(this, arg); + @Override + public Type visitIdRef(IdRef ref, IdTable table) { + + ref.id.visit(this, table); ref.decl = ref.id.decl; - - return idType; + ref.spelling = ref.id.spelling; + + return ref.decl.type; } - public Type visitThisRef(ThisRef ref, IdentificationTable arg) { + @Override + public Type visitThisRef(ThisRef ref, IdTable table) { + + ref.spelling = "this"; ref.decl = currentClassDecl; if(currentMethodDecl.isStatic) { - Reporter.report(ErrorType.THIS, ref, currentMethodDecl); + Reporter.emit("'this' cannot be referenced in a static context at " + ref.posn); } return ref.decl.type; } - + // ///////////////////////////////////////////////////////////////////////////// // // TERMINALS // // ///////////////////////////////////////////////////////////////////////////// - - public Type visitIdentifier(Identifier id, IdentificationTable arg) { - // Must check identifier is not of the same type being declared + @Override + public Type visitIdentifier(Identifier id, IdTable table) { + + // An variable cannot be used in its declaration if(currentVarDecl != null && currentVarDecl.name.equals(id.spelling)) { - Reporter.report(ErrorType.VARDECL_USED, id, currentVarDecl); - return new BaseType(TypeKind.ERROR, id.posn); + Reporter.emit("Cannot use variable in declaration at " + id.posn); } - - // Check if identifier can be found in current scope - Declaration decl = arg.getDeclarationAtScope(id.spelling); - if (decl != null) { id.decl = decl; return decl.type; } - // Access member and check visibility properties - Declaration d = arg.getDeclaration(id.spelling); - if(d == null) { - Reporter.report(ErrorType.UNDEFINED, id, null); - return new BaseType(TypeKind.ERROR, id.posn); - } else { - - // Can only be a member at this point - if(d.type.typeKind != TypeKind.CLASS) { - MemberDecl md = (MemberDecl) d; - - // A static method cannot access instance members - if(currentMethodDecl.isStatic && !md.isStatic) { - Reporter.report(ErrorType.STATIC, md, id); - return new BaseType(TypeKind.ERROR, id.posn); - } - - // If a member declaration is private, it must be a member of the current class - else if(md.isPrivate) { - - // Check if member is part of the current class - IdentificationTable cdTable = table.getScope(currentClassDecl); - if(cdTable.getDeclarationAtScope(md.name) == null) { - Reporter.report(ErrorType.VISIBILITY, md, id); - return new BaseType(TypeKind.ERROR, id.posn); - } - } - } - - id.decl = d; - return d.type; + // Try to find declaration (and abort if not found) + id.decl = table.getDeclaration(id.spelling); + if(id.decl == null) { + Reporter.emit(id.spelling + " undefined at " + id.posn); + System.exit(Compiler.rc); } + + // Cannot access instance method from static context + if(id.decl instanceof MemberDecl) { + MemberDecl md = (MemberDecl) id.decl; + if(currentMethodDecl.isStatic && !md.isStatic) { + Reporter.emit("Cannot access instance member " + md.name + " in a static context at " + id.posn); + } + } + + return id.decl.type; + } - public Type visitOperator(Operator op, IdentificationTable arg) { - - switch (op.token.spelling) { + @Override + public Type visitOperator(Operator op, IdTable table) { + switch(op.spelling) { case "!": case "&&": case "||": - return new BaseType(TypeKind.BOOLEAN, op.posn); - case ">": case "<": case "<=": case ">=": - return new BaseType(TypeKind.RELATIONAL, op.posn); + case "==": + case "!=": + return new BaseType(TypeKind.BOOLEAN, op.posn); case "+": case "-": @@ -600,22 +692,107 @@ public class Analyzer implements Visitor { case "/": return new BaseType(TypeKind.INT, op.posn); - case "==": - case "!=": - return new BaseType(TypeKind.EQUALS, op.posn); + default: + return new BaseType(TypeKind.ERROR, op.posn); } - - return null; } - public Type visitIntLiteral(IntLiteral num, IdentificationTable arg) { - + @Override + public Type visitIntLiteral(IntLiteral num, IdTable table) { + return new BaseType(TypeKind.INT, num.posn); } - public Type visitBooleanLiteral(BooleanLiteral bool, IdentificationTable arg) { - + @Override + public Type visitBooleanLiteral(BooleanLiteral bool, IdTable table) { + return new BaseType(TypeKind.BOOLEAN, bool.posn); } + + // ///////////////////////////////////////////////////////////////////////////// + // + // Convenience Functions + // + // ///////////////////////////////////////////////////////////////////////////// + + /** + * + * @param cd + * @param table + */ + private void addDeclarations(ClassDecl cd, IdTable table) { + + table.add(cd); + cd.table = new IdTable(table); + + for(FieldDecl fd : cd.fieldDeclList) { + cd.table.add(fd); + } + + for(MethodDecl md : cd.methodDeclList) { + cd.table.add(md); + md.table = new IdTable(cd.table); + } + } + + /** + * + * @param md + * @return + */ + private boolean isMain(MethodDecl md) { + + // Correct Signature + if(!md.isPrivate && md.isStatic) { + if(md.type.typeKind == TypeKind.VOID) { + if(md.name.equals("main") && md.parameterDeclList.size() == 1) { + + // Check parameter declaration + ParameterDecl pd = md.parameterDeclList.get(0); + if(pd.type.typeKind == TypeKind.ARRAY) { + ArrayType at = (ArrayType) pd.type; + if(at.eltType.typeKind == TypeKind.CLASS) { + ClassType ct = (ClassType) at.eltType; + + return ct.className.spelling.equals("String"); + } + } + } + } + } + + return false; + } + + /** + * + * @param t1 + * @param t2 + * @return + */ + private boolean match(Type t1, Type t2) { + + if(t1.typeKind != t2.typeKind) { + return false; + } + + // Check Class Types match + else if(t1.typeKind == TypeKind.CLASS) { + ClassType c1 = (ClassType) t1; + ClassType c2 = (ClassType) t2; + + return c1.className.spelling.equals(c2.className.spelling); + } + + // Check Array Types match + else if(t1.typeKind == TypeKind.ARRAY) { + ArrayType a1 = (ArrayType) t1; + ArrayType a2 = (ArrayType) t2; + + return match(a1.eltType, a2.eltType); + } + + return true; + } } diff --git a/src/miniJava/ContextualAnalyzer/IdTable.java b/src/miniJava/ContextualAnalyzer/IdTable.java new file mode 100644 index 0000000..50da518 --- /dev/null +++ b/src/miniJava/ContextualAnalyzer/IdTable.java @@ -0,0 +1,127 @@ +package miniJava.ContextualAnalyzer; + +import java.util.HashMap; +import java.util.ArrayList; +import miniJava.Compiler; + +import miniJava.AbstractSyntaxTrees.*; + +/** + * + */ +public class IdTable { + + private IdTable parent; + private ArrayList> scope; + + + // ///////////////////////////////////////////////////////////////////////////// + // + // CONSTRUCTORS + // + // ///////////////////////////////////////////////////////////////////////////// + + /** + * + */ + public IdTable() { + this(null); + } + + /** + * + * @param parent + */ + public IdTable(IdTable parent) { + this.parent = parent; + this.scope = new ArrayList<>(); + push(); + } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // ACTIVE SCOPE + // + // ///////////////////////////////////////////////////////////////////////////// + + /** + * + */ + public void pop() { + int last = scope.size() - 1; + scope.remove(last); + } + + /** + * + */ + public void push() { + HashMap nested = new HashMap<>(); + scope.add(nested); + } + + /** + * + */ + public void add(Declaration decl) { + for(int i = 0; i < scope.size(); i++) { + HashMap nest = scope.get(i); + if(nest.containsKey(decl.name)) { + + Declaration prev = nest.get(decl.name); + + if(decl instanceof ClassDecl) { + Reporter.report(decl, prev, "Class"); + } else if(decl instanceof FieldDecl) { + Reporter.report(decl, prev, "Field"); + } else if(decl instanceof MethodDecl) { + Reporter.report(decl, prev, "Method"); + } else if(decl instanceof ParameterDecl) { + Reporter.report(decl, prev, "Parameter"); + } else if(decl instanceof VarDecl) { + Reporter.report(decl, prev, "Variable"); + } + + System.exit(Compiler.rc); + } + } + + scope.get(scope.size()-1).put(decl.name, decl); + } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // GETTERS + // + // ///////////////////////////////////////////////////////////////////////////// + + /** + * + * @param name + */ + public Declaration getDeclaration(String name) { + IdTable current = this; + while (current != null) { + Declaration decl = current.getDeclarationAtScope(name); + if (decl == null) current = current.parent; + else return decl; + } + + return null; + } + + /** + * + * @param name + */ + public Declaration getDeclarationAtScope(String name) { + for (int i = scope.size() - 1; i >= 0; i--) { + HashMap nest = scope.get(i); + if (nest.containsKey(name)) return nest.get(name); + } + + return null; + } +} diff --git a/src/miniJava/ContextualAnalyzer/IdentificationTable.java b/src/miniJava/ContextualAnalyzer/IdentificationTable.java deleted file mode 100644 index 6faa248..0000000 --- a/src/miniJava/ContextualAnalyzer/IdentificationTable.java +++ /dev/null @@ -1,221 +0,0 @@ -package miniJava.ContextualAnalyzer; - -import java.util.*; - -import miniJava.AbstractSyntaxTrees.*; - -public class IdentificationTable { - - private IdentificationTable parent; - private HashMap scope; - private ArrayList> table; - - /** - * - */ - public IdentificationTable() { - this(null); - } - - /** - * - * @param parent - */ - public IdentificationTable(IdentificationTable parent) { - this.parent = parent; - this.scope = new HashMap(); - this.table = new ArrayList>(); - this.table.add(new HashMap()); - } - - /** - * Adds another level for variables to be stored at - */ - public void popLevel() { - table.remove(table.size() - 1); - } - - /** - * Removes all variables declared at the current level - */ - public void pushLevel() { - table.add(new HashMap()); - } - - /** - * This method will only ever be called with class/method declarations. - * - * @param decl - * @return - */ - public IdentificationTable openScope(Declaration decl) { - Declaration current = getDeclarationAtScope(decl.name); - if (scope.containsKey(decl.name) || current != null) { - Reporter.report(ErrorType.REDEFINITION, decl, current); - return null; - } else { - table.get(table.size() - 1).put(decl.name, decl); - scope.put(decl.name, new IdentificationTable(this)); - return scope.get(decl.name); - } - } - - /** - * Return nested scope corresponding to declaration (or null if - * non-existant). - * - * @param decl - * @return - */ - public IdentificationTable getScope(Declaration decl) { - if (scope.containsKey(decl.name)) { - return scope.get(decl.name); - } - - return null; - } - - /** - * Iterates through all parents and tries to find the specified declaration - * by name. - * - * @param name - * @return - */ - public Declaration getDeclaration(String name) { - IdentificationTable current = this; - while (current != null) { - Declaration decl = current.getDeclarationAtScope(name); - if (decl == null) current = current.parent; - else return decl; - } - - return null; - } - - /** - * Iterates through levels (from higher to lower) for declaration, returning - * none if it does not exist. - * - * @param name - * @return - */ - public Declaration getDeclarationAtScope(String name) { - for (int i = table.size() - 1; i >= 0; i--) { - HashMap level = table.get(i); - if (level.containsKey(name)) return level.get(name); - } - - return null; - } - - /** - * Add declaration to current table's table member. - * - * @param name - */ - public void setDeclarationAtScope(Declaration decl) { - for (int i = 0; i < table.size(); i++) { - HashMap level = table.get(i); - if (level.containsKey(decl.name)) { - Declaration defined = level.get(decl.name); - Reporter.report(ErrorType.REDEFINITION, decl, defined); - return; - } - } - - table.get(table.size() - 1).put(decl.name, decl); - } - - /** - * Checks whether the specified class has been declared. - * - * @param t - * @return - */ - public boolean classExists(Type t) { - if (t.typeKind == TypeKind.CLASS) { - ClassType ct = (ClassType) t; - return getDeclaration(ct.className.spelling) != null; - } - - return true; - } - - /** - * Determines whether two types match. - * - * @param t1 - * @param t2 - * @return - */ - public static boolean match(Type t1, Type t2) { - return IdentificationTable.match(t1, t2, false); - } - - /** - * Determines whether two type match, reporting an error if they do not. - * - * @param t1 - * @param t2 - * @param report - * @return - */ - public static boolean match(Type t1, Type t2, boolean report) { - - if (t1.typeKind != t2.typeKind) { - if (report) Reporter.report(ErrorType.TYPE_MISMATCH, t1, t2); - return false; - } - - // Check Class Types match - else if (t1.typeKind == TypeKind.CLASS) { - ClassType c1 = (ClassType) t1; - ClassType c2 = (ClassType) t2; - if (!c1.className.spelling.equals(c2.className.spelling)) { - if (report) Reporter.report(ErrorType.TYPE_MISMATCH, t1, t2); - return false; - } - } - - // Check array types match - else if (t1.typeKind == TypeKind.ARRAY) { - ArrayType a1 = (ArrayType) t1; - ArrayType a2 = (ArrayType) t2; - if (!IdentificationTable.match(a1.eltType, a2.eltType)) { - if (report) Reporter.report(ErrorType.TYPE_MISMATCH, t1, t2); - return false; - } - } - - return true; - } - - /** - * Determines if the passed method is a valid entry point for the - * compilation phase. - * - * @param md - * @return - */ - public static boolean isMainMethod(MethodDecl md) { - - // Check Declaration - if (!md.isPrivate && md.isStatic && md.type.typeKind == TypeKind.VOID - && md.name.equals("main") && md.parameterDeclList.size() == 1) { - - // Check Parameter Declaration - ParameterDecl pd = md.parameterDeclList.get(0); - - if (pd.type.typeKind != TypeKind.ARRAY) return false; - ArrayType at = (ArrayType) pd.type; - - if (at.eltType.typeKind != TypeKind.CLASS) return false; - ClassType ct = (ClassType) at.eltType; - - return ct.className.spelling.equals("String"); - } - - return false; - } -} diff --git a/src/miniJava/ContextualAnalyzer/Reporter.java b/src/miniJava/ContextualAnalyzer/Reporter.java index 66fd900..0b65f4b 100644 --- a/src/miniJava/ContextualAnalyzer/Reporter.java +++ b/src/miniJava/ContextualAnalyzer/Reporter.java @@ -1,205 +1,27 @@ package miniJava.ContextualAnalyzer; -import miniJava.AbstractSyntaxTrees.*; - -enum ErrorType { - THIS, - LENGTH, - VOID_TYPE, - CLASS_IDENTIFER, - VARDECL_USED, - NONFUNCTION_CALL, - FUNCTION_ASSIGNMENT, - UNDEFINED, - STATIC, - VISIBILITY, - NO_RETURN, - TYPE_MISMATCH, - REDEFINITION, - MAIN_UNDECLARED, - INVALID_PARAM_COUNT, - MULTIPLE_MAIN, - UNDECLARED_TYPE, - SINGLE_VARCOND, - INVALID_INDEX -} +import miniJava.AbstractSyntaxTrees.Declaration; public class Reporter { - + public static boolean error = false; - + /** - * Convenience function for getting type names. - * - * @param t - * @return - */ - private static String getTypeName(Type t) { - if (t instanceof ClassType) { - ClassType ct = (ClassType) t; - return ct.className.spelling; - } else if (t instanceof ArrayType) { - ArrayType at = (ArrayType) t; - return getTypeName(at.eltType); - } - - return t.typeKind.toString(); - } - - /** - * Convenience method for formatting error message. * * @param message */ - private static void emit(String message) { + public static void emit(String message) { + error = true; System.out.println("***" + message); } - + /** - * Convenience function for managing all error types. - * - * @param type - * @param a1 - * @param a2 + * Redefinitions + * @param d1 + * @param d2 */ - public static void report(ErrorType type, AST a1, AST a2) { - - switch (type) { - - // Cannot access 'this' in a static method - case THIS: { - MethodDecl md = (MethodDecl) a2; - emit("Cannot reference 'this' " + a1.posn + " in static method '" + md.name + "' " + md.posn); - break; - } - - // Array types have the single field 'length' - case LENGTH: { - emit("Array types have only a single field 'length' (at " + a1.posn + ")."); - break; - } - - // Can't use a class as an identifier solely - case CLASS_IDENTIFER: { - emit("Cannot use class identifier outside of a qualified reference at " + a1.posn); - break; - } - - // Cannot have a parameter of type void - case VOID_TYPE: { - emit("Cannot have a parameter of type void at " + a1.posn); - break; - } - - // Attempting to call a non function as a function - case NONFUNCTION_CALL: { - emit("Not a valid function call at " + a1.posn); - break; - } - - // Cannot assign a value to a function - case FUNCTION_ASSIGNMENT: { - emit("Cannot assign a value to a function at " + a1.posn); - break; - } - - // Tried accessing a non-static member from a static method - case STATIC: { - MemberDecl md = (MemberDecl) a1; - Identifier ident = (Identifier) a2; - emit("'" + md.name + "' " + md.posn + " is an instance member and cannot be accessed at " + ident.posn); - break; - } - - // Tried accessing a private member of a different class - case VISIBILITY: { - MemberDecl md = (MemberDecl) a1; - Identifier ident = (Identifier) a2; - emit("'" + md.name + "' " + md.posn + " is a private member and cannot be accessed at " + ident.posn); - break; - } - - // Non-void function does not have a return statement - case NO_RETURN: { - MethodDecl md = (MethodDecl) a1; - emit("'" + md.name + "' " + md.posn + " must have a return statement"); - break; - } - - // The passed types are not the same - case TYPE_MISMATCH: { - String name1 = getTypeName((Type) a1); - String name2 = getTypeName((Type) a2); - if(a1 instanceof ArrayType) name1 += " Array"; - if(a2 instanceof ArrayType) name2 += " Array"; - emit("Expected type '" + name1 + "' but got '" + name2 + "' " + a2.posn); - break; - } - - // Attempting to redeclare a variable - case REDEFINITION: { - emit("Variable at " + a1.posn + " already declared earlier at " + a2.posn); - break; - } - - // Identifier could not be found - case UNDEFINED: { - Identifier ident = (Identifier) a1; - emit("Identifier '" + ident.spelling + "' " + ident.posn + " is undeclared."); - break; - } - - // A public static void main(String[] args) method was not declared - case MAIN_UNDECLARED: { - emit("A main function was not declared"); - break; - } - - // Parameter counts of an expression/statement do not match declaration - case INVALID_PARAM_COUNT: { - MethodDecl md = (MethodDecl) a2; - emit("Call to '" + md.name + "' " + a2.posn + " has an invalid parameter count at " + a1.posn); - break; - } - - // A public static void main(String[] args) was declared more than once - case MULTIPLE_MAIN: { - emit("Main function at " + a1.posn + " already declared previously at " + a2.posn); - break; - } - - // A reference has been made to a non-existant type - case UNDECLARED_TYPE: { - if(a1 instanceof Type) { - String typeName = getTypeName((Type) a1); - emit("'" + typeName + "' " + a1.posn + " has not been declared previously"); - } else { - emit("Identifier at " + a1.posn + " could not be identified"); - } - - break; - } - - // A Variable Declaration Statement was made as the only statement of a condition - case SINGLE_VARCOND: { - emit("Conditional statment cannot be followed by a variable declaration statement exclusively " + a1.posn); - break; - } - - // An indexed expression must be of an int type - case INVALID_INDEX: { - emit("Index expression is not of type int " + a1.posn); - break; - } - - // A variable declaration identifier was used in a var decl statement - case VARDECL_USED: { - emit("Identifier at " + a1.posn + " cannot refer to the variable declaration at " + a2.posn); - break; - } - } - - error = true; + public static void report(Declaration d1, Declaration d2, String prefix) { + emit(prefix + " at " + d1.posn + " previously defined at " + d2.posn); } } diff --git a/src/miniJava/Exceptions/IdentificationException.java b/src/miniJava/Exceptions/IdentificationException.java deleted file mode 100644 index 167ee93..0000000 --- a/src/miniJava/Exceptions/IdentificationException.java +++ /dev/null @@ -1,10 +0,0 @@ -package miniJava.Exceptions; - -public class IdentificationException extends Exception { - - private static final long serialVersionUID = 1L; - - public IdentificationException() { - super("Identification Error!"); - } -} diff --git a/src/miniJava/Exceptions/ParsingException.java b/src/miniJava/Exceptions/ParsingException.java deleted file mode 100644 index f655358..0000000 --- a/src/miniJava/Exceptions/ParsingException.java +++ /dev/null @@ -1,17 +0,0 @@ -package miniJava.Exceptions; - -import miniJava.SyntacticAnalyzer.Token; - -public class ParsingException extends Exception { - - private static final long serialVersionUID = 1L; - - public ParsingException() { - super("Unidentified parsing error!"); - } - - public ParsingException(Token t) { - super("Parsing error with " + t.spelling + " at " + t.posn.toString()); - } - -} diff --git a/src/miniJava/Exceptions/ScanningException.java b/src/miniJava/Exceptions/ScanningException.java deleted file mode 100644 index a24b2e2..0000000 --- a/src/miniJava/Exceptions/ScanningException.java +++ /dev/null @@ -1,11 +0,0 @@ -package miniJava.Exceptions; - -public class ScanningException extends Exception { - - private static final long serialVersionUID = 1L; - - public ScanningException(int col, int line) { - super("Scanning error at Column: " + col + ", Line: " + line); - } - -} diff --git a/src/miniJava/SyntacticAnalyzer/Parser.java b/src/miniJava/SyntacticAnalyzer/Parser.java index b06176b..524163f 100644 --- a/src/miniJava/SyntacticAnalyzer/Parser.java +++ b/src/miniJava/SyntacticAnalyzer/Parser.java @@ -1,28 +1,94 @@ package miniJava.SyntacticAnalyzer; +import java.io.IOException; import java.util.LinkedList; import miniJava.AbstractSyntaxTrees.*; import miniJava.AbstractSyntaxTrees.Package; -import miniJava.Exceptions.*; +/** + * Stratified Grammar (original grammar in PA1): + * + * Program ::= (ClassDeclaration)* eot + * + * ClassDeclaration ::= + * class id { + * (Declarators id (; | MethodDeclaration))* + * } + * + * MethodDeclaration ::= + * (ParameterList?) { + * Statement* (return Expression ;)? + * } + * + * Declarators ::= (public | private)? static? Type + * + * Type ::= boolean | void | int ([])? | id ([])? + * + * ParameterList ::= Type id (, Type id)* + * + * ArgumentList ::= Expression (, Expression)* + * + * Reference ::= BaseRef (. id ([ Expression])?)* + * + * BaseRef ::= this | id ([ Expression])? + * + * Statement ::= + * {Statement*} + * | Type id = Expression; + * | Reference = Expression; + * | Reference ( ArgumentList? ); + * | if (Expression) Statement (else Statement)? + * | while (Expression) Statement + * + * Expression ::= + * num | true | false + * | ( Expression ) + * | new (id() | int [ Expression ] | id [ Expression ] ) + * | Reference ((ArgumentList?))? + * | DExpression + * + * DExpression ::= CExpression (|| CExpression)* + * + * CExpression ::= EExpression (&& EExpression)* + * + * EExpression ::= RExpression ((==|!=) RExpression)* + * + * RExpression ::= AExpression ((<=|<|>|>=) AExpression)* + * + * AExpression ::= MExpression ((+|-) MExpression)* + * + * MExpression ::= Expression ((*|/) Expression)* + * +*/ public class Parser { - + private Scanner scanner; private LinkedList stream; - + + /** + * + * @param scanner + */ public Parser(Scanner scanner) { this.scanner = scanner; this.stream = new LinkedList(); } - + + + // ///////////////////////////////////////////////////////////////////////////// + // + // Package + // + // ///////////////////////////////////////////////////////////////////////////// + /** - * Program ::= (ClassDeclaration)* eot + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - public Package parse() throws ParsingException, ScanningException { + public Package parse() throws IOException { + ClassDeclList decls = new ClassDeclList(); while (peek(1).type == Token.TYPE.CLASS) { decls.add(parseClassDeclaration()); @@ -31,469 +97,557 @@ public class Parser { accept(Token.TYPE.EOT); return new Package(decls, new SourcePosition(0, 0)); } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // DECLARATIONS + // + // ///////////////////////////////////////////////////////////////////////////// /** - * ClassDeclaration ::= class id { (Declarators id (; | MethodDeclaration))* } + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private ClassDecl parseClassDeclaration() throws ParsingException, - ScanningException { - + public ClassDecl parseClassDeclaration() throws IOException { + // Class Header Token classToken = accept(Token.TYPE.CLASS); - String cn = accept(Token.TYPE.ID).spelling; + String className = accept(Token.TYPE.ID).spelling; + + // Class Body accept(Token.TYPE.LBRACKET); - - // Setup + FieldDeclList fdl = new FieldDeclList(); MethodDeclList mdl = new MethodDeclList(); - - // Class Body + + // Haven't reached end of body while (peek(1).type != Token.TYPE.RBRACKET) { Declarators d = parseDeclarators(); - String name = accept(Token.TYPE.ID).spelling; - FieldDecl f = new FieldDecl(d.isPrivate, d.isStatic, d.mt, name, - d.posn); - - // Field Declarations - if (peek(1).type == Token.TYPE.SEMICOLON) { + String memberName = accept(Token.TYPE.ID).spelling; + + // Field Declaration + FieldDecl fd = new FieldDecl(d, memberName); + if(peek(1).type == Token.TYPE.SEMICOLON) { accept(Token.TYPE.SEMICOLON); - fdl.add(f); + fdl.add(fd); + } + + // Method Declaration + else { + MethodDecl md = parseMethodDeclaration(fd); + mdl.add(md); } - - // Method Declarations - else - mdl.add(parseMethodDeclaration(f)); } - + accept(Token.TYPE.RBRACKET); - return new ClassDecl(cn, fdl, mdl, classToken.posn); + + // Build Class + ClassDecl decl = new ClassDecl(className, fdl, mdl, classToken.posn); + Identifier ident = new Identifier(className, classToken.posn); + decl.type = new ClassType(ident, classToken.posn); + + return decl; } - + /** - * Declarators ::= (public | private)? static? Type + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Declarators parseDeclarators() throws ParsingException, - ScanningException { - - // Visibility - SourcePosition start = null; + private Declarators parseDeclarators() throws IOException { + + boolean isStatic = false; boolean isPrivate = false; - + SourcePosition start = peek(1).posn; + + // Visibility if (peek(1).type == Token.TYPE.PUBLIC) { - start = accept(Token.TYPE.PUBLIC).posn; + accept(Token.TYPE.PUBLIC); } else if (peek(1).type == Token.TYPE.PRIVATE) { isPrivate = true; - start = accept(Token.TYPE.PRIVATE).posn; + accept(Token.TYPE.PRIVATE); } - - // Class Methods - boolean isStatic = false; + + // Static if (peek(1).type == Token.TYPE.STATIC) { isStatic = true; - if (start == null) { - start = accept(Token.TYPE.STATIC).posn; - } else { - accept(Token.TYPE.STATIC); - } + accept(Token.TYPE.STATIC); } - Type t = parseType(); - if (start == null) { - start = t.posn; - } - - return new Declarators(isPrivate, isStatic, t, start); + return new Declarators(isPrivate, isStatic, parseType(), start); } - + /** - * MethodDeclaration ::= (ParameterList?) { Statement* (return Expression;)? } + * * @param f * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private MethodDecl parseMethodDeclaration(FieldDecl f) - throws ParsingException, ScanningException { - - // Method Header + private MethodDecl parseMethodDeclaration(FieldDecl f) throws IOException { + + Expression returnExpr = null; + StatementList stl = new StatementList(); + + // Parameters accept(Token.TYPE.LPAREN); - - // Parameter List + ParameterDeclList pdl = new ParameterDeclList(); - if (peek(1).type != Token.TYPE.RPAREN) + if (peek(1).type != Token.TYPE.RPAREN) { pdl = parseParameterList(); + } accept(Token.TYPE.RPAREN); - accept(Token.TYPE.LBRACKET); - + // Method Body - Expression re = null; - StatementList stl = new StatementList(); + accept(Token.TYPE.LBRACKET); + while (peek(1).type != Token.TYPE.RBRACKET) { - if (peek(1).type == Token.TYPE.RETURN) { accept(Token.TYPE.RETURN); - re = parseExpression(); + returnExpr = parseExpression(); accept(Token.TYPE.SEMICOLON); break; } - + stl.add(parseStatement()); } - + accept(Token.TYPE.RBRACKET); - return new MethodDecl(f, pdl, stl, re, f.posn); + + return new MethodDecl(f, pdl, stl, returnExpr, f.posn); } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // TYPES + // + // ///////////////////////////////////////////////////////////////////////////// /** - * Type ::= boolean | void | int ([])? | id ([])? + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Type parseType() throws ParsingException, ScanningException { - - SourcePosition posn = null; - - switch (peek(1).type) { - - case BOOLEAN: - posn = accept(Token.TYPE.BOOLEAN).posn; - return new BaseType(TypeKind.BOOLEAN, posn); - - case VOID: - posn = accept(Token.TYPE.VOID).posn; - return new BaseType(TypeKind.VOID, posn); - - case INT: { - posn = accept(Token.TYPE.INT).posn; - BaseType b = new BaseType(TypeKind.INT, posn); - - if (peek(1).type == Token.TYPE.LSQUARE) { - accept(Token.TYPE.LSQUARE); - accept(Token.TYPE.RSQUARE); - return new ArrayType(b, posn); + private Type parseType() throws IOException { + + switch(peek(1).type) { + + case VOID: { + Token next = accept(Token.TYPE.VOID); + return new BaseType(TypeKind.VOID, next.posn); } - - return b; - } - - case ID: { - Token id = accept(peek(1).type); - Identifier i = new Identifier(id.spelling, id.posn); - ClassType c = new ClassType(i, id.posn); - - if (peek(1).type == Token.TYPE.LSQUARE) { - accept(Token.TYPE.LSQUARE); - accept(Token.TYPE.RSQUARE); - return new ArrayType(c, id.posn); + + case BOOLEAN: { + Token next = accept(Token.TYPE.BOOLEAN); + return new BaseType(TypeKind.BOOLEAN, next.posn); + } + + case INT: { + Token next = accept(Token.TYPE.INT); + BaseType bt = new BaseType(TypeKind.INT, next.posn); + + if (peek(1).type == Token.TYPE.LSQUARE) { + accept(Token.TYPE.LSQUARE); + accept(Token.TYPE.RSQUARE); + return new ArrayType(bt, next.posn); + } + + return bt; + } + + case ID: { + Token next = accept(Token.TYPE.ID); + Identifier ident = new Identifier(next.spelling, next.posn); + ClassType ct = new ClassType(ident, ident.posn); + + if (peek(1).type == Token.TYPE.LSQUARE) { + accept(Token.TYPE.LSQUARE); + accept(Token.TYPE.RSQUARE); + return new ArrayType(ct, ident.posn); + } + + return ct; + } + + default: { + Token next = peek(1); + throw new ParsingException(next.posn); } - - return c; - } - - default: - throw new ParsingException(); } } - + + + // ///////////////////////////////////////////////////////////////////////////// + // + // Arguments + // + // ///////////////////////////////////////////////////////////////////////////// + /** - * ParameterList ::= Type id (, Type id)* + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private ParameterDeclList parseParameterList() throws ParsingException, ScanningException { - + private ParameterDeclList parseParameterList() throws IOException { + ParameterDeclList decls = new ParameterDeclList(); // First Parameter - Type t = parseType(); - Token id = accept(Token.TYPE.ID); - decls.add(new ParameterDecl(t, id.spelling, id.posn)); + Type fpt = parseType(); + Token next = accept(Token.TYPE.ID); + decls.add(new ParameterDecl(fpt, next.spelling, fpt.posn)); // Remainder of List - while (peek(1).type == Token.TYPE.COMMA) { + while(peek(1).type == Token.TYPE.COMMA) { accept(Token.TYPE.COMMA); - Type nextType = parseType(); - Token nextId = accept(Token.TYPE.ID); - decls.add(new ParameterDecl(nextType, nextId.spelling, nextId.posn)); + Type type = parseType(); + Token id = accept(Token.TYPE.ID); + decls.add(new ParameterDecl(type, id.spelling, type.posn)); } return decls; } /** - * ArgumentList ::= Expression (, Expression)* + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private ExprList parseArgumentList() throws ParsingException, ScanningException { - ExprList e = new ExprList(); - e.add(parseExpression()); - while (peek(1).type == Token.TYPE.COMMA) { + private ExprList parseArgumentList() throws IOException { + + ExprList el = new ExprList(); + el.add(parseExpression()); + + // Rest of argument list + while(peek(1).type == Token.TYPE.COMMA) { accept(Token.TYPE.COMMA); - e.add(parseExpression()); + el.add(parseExpression()); } - return e; + return el; } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // REFERENCES + // + // ///////////////////////////////////////////////////////////////////////////// /** - * Reference ::= BaseRef (. BaseRef)* + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Reference parseReference() throws ParsingException, ScanningException { - Reference r = parseBaseRef(); + private Reference parseReference() throws IOException { + + Reference ref = parseBaseRef(); + while (peek(1).type == Token.TYPE.PERIOD) { accept(Token.TYPE.PERIOD); - Token tokenId = accept(Token.TYPE.ID); - Identifier id = new Identifier(tokenId.spelling, tokenId.posn); - r = new QualifiedRef(r, id, tokenId.posn); + Token next = accept(Token.TYPE.ID); + Identifier ident = new Identifier(next.spelling, next.posn); + ref = new QualifiedRef(ref, ident, next.posn); + // Must be indexed if (peek(1).type == Token.TYPE.LSQUARE) { accept(Token.TYPE.LSQUARE); - Expression e = parseExpression(); + Expression expr = parseExpression(); accept(Token.TYPE.RSQUARE); - r = new IndexedRef(r, e, tokenId.posn); + ref = new IndexedRef(ref, expr, next.posn); } } - return r; + return ref; } /** - * BaseRef ::= this | id ([ Expression])? + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Reference parseBaseRef() throws ParsingException, ScanningException { - - switch (peek(1).type) { - case THIS: { - Token thisToken = accept(Token.TYPE.THIS); - return new ThisRef(thisToken.posn); - } - - // id ([ Expression])? - default: { - Token id = accept(Token.TYPE.ID); - Identifier i = new Identifier(id.spelling, id.posn); - IdRef r = new IdRef(i, id.posn); - - if (peek(1).type == Token.TYPE.LSQUARE) { - accept(Token.TYPE.LSQUARE); - Expression e = parseExpression(); - accept(Token.TYPE.RSQUARE); - return new IndexedRef(r, e, id.posn); - } - - return r; - } + private Reference parseBaseRef() throws IOException { + + if(peek(1).type == Token.TYPE.THIS) { + Token next = accept(Token.TYPE.THIS); + return new ThisRef(next.posn); } + + Token next = accept(Token.TYPE.ID); + Identifier ident = new Identifier(next.spelling, next.posn); + IdRef ref = new IdRef(ident, ident.posn); + + // Must be indexed + if (peek(1).type == Token.TYPE.LSQUARE) { + accept(Token.TYPE.LSQUARE); + Expression expr = parseExpression(); + accept(Token.TYPE.RSQUARE); + return new IndexedRef(ref, expr, next.posn); + } + + return ref; } - + + + // ///////////////////////////////////////////////////////////////////////////// + // + // STATEMENTS + // + // ///////////////////////////////////////////////////////////////////////////// + /** - * Statement ::= {Statement*} | Type id = Expression; | Reference = - * Expression; | Reference ( ArgumentList? ); | if (Expression) Statement - * (else Statement)? | while (Expression) Statement + * * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Statement parseStatement() throws ParsingException, ScanningException { + private Statement parseBlockStatement() throws IOException { + + StatementList stl = new StatementList(); + Token left = accept(Token.TYPE.LBRACKET); + + while(peek(1).type != Token.TYPE.RBRACKET) { + stl.add(parseStatement()); + } + + accept(Token.TYPE.RBRACKET); + + return new BlockStmt(stl, left.posn); + } + + /** + * + * @return + * @throws IOException + */ + private Statement parseIfStatement() throws IOException { + + Token next = accept(Token.TYPE.IF); + + // Conditional + accept(Token.TYPE.LPAREN); + Expression expr = parseExpression(); + accept(Token.TYPE.RPAREN); + + // Body + Statement s1 = parseStatement(); + + // Else Statement + if (peek(1).type == Token.TYPE.ELSE) { + accept(Token.TYPE.ELSE); + Statement s2 = parseStatement(); + return new IfStmt(expr, s1, s2, next.posn); + } + return new IfStmt(expr, s1, next.posn); + } + + /** + * + * @return + * @throws IOException + */ + private Statement parseWhileStatement() throws IOException { + + Token next = accept(Token.TYPE.WHILE); + + // Conditional + accept(Token.TYPE.LPAREN); + Expression e = parseExpression(); + accept(Token.TYPE.RPAREN); + + // Body + Statement s = parseStatement(); + + return new WhileStmt(e, s, next.posn); + } + + /** + * + * @return + * @throws IOException + */ + private Statement parseVarDeclStatement() throws IOException { + + Type type = parseType(); + String name = accept(Token.TYPE.ID).spelling; + VarDecl v = new VarDecl(type, name, type.posn); + + accept(Token.TYPE.EQUALS); + Expression expr = parseExpression(); + accept(Token.TYPE.SEMICOLON); + + return new VarDeclStmt(v, expr, type.posn); + } + + /** + * + * @return + * @throws IOException + */ + private Statement parseReferenceStatement() throws IOException { + + Statement stmt = null; + Reference ref = parseReference(); + + // Reference ( ArgumentList? ) ; + if (peek(1).type == Token.TYPE.LPAREN) { + ExprList el = new ExprList(); + accept(Token.TYPE.LPAREN); + if(peek(1).type != Token.TYPE.RPAREN) { + el = parseArgumentList(); + } + accept(Token.TYPE.RPAREN); + stmt = new CallStmt(ref, el, ref.posn); + } + + // Reference = Expression; + else { + accept(Token.TYPE.EQUALS); + Expression expr = parseExpression(); + stmt = new AssignStmt(ref, expr, ref.posn); + } + + accept(Token.TYPE.SEMICOLON); + return stmt; + } + + /** + * + * @return + * @throws IOException + */ + private Statement parseStatement() throws IOException { + switch (peek(1).type) { - + // { Statement* } case LBRACKET: { - Token leftToken = accept(Token.TYPE.LBRACKET); - StatementList stl = new StatementList(); - while (peek(1).type != Token.TYPE.RBRACKET) { - stl.add(parseStatement()); - } - accept(Token.TYPE.RBRACKET); - - return new BlockStmt(stl, leftToken.posn); + return parseBlockStatement(); } - + // if (Expression) Statement (else Statement)? case IF: { - Token ifToken = accept(Token.TYPE.IF); - accept(Token.TYPE.LPAREN); - Expression e = parseExpression(); - accept(Token.TYPE.RPAREN); - Statement s1 = parseStatement(); - if (peek(1).type == Token.TYPE.ELSE) { - accept(Token.TYPE.ELSE); - Statement s2 = parseStatement(); - return new IfStmt(e, s1, s2, ifToken.posn); - } - - return new IfStmt(e, s1, ifToken.posn); + return parseIfStatement(); } - + // while (Expression) Statement case WHILE: { - Token whileToken = accept(Token.TYPE.WHILE); - accept(Token.TYPE.LPAREN); - Expression e = parseExpression(); - accept(Token.TYPE.RPAREN); - Statement s = parseStatement(); - - return new WhileStmt(e, s, whileToken.posn); + return parseWhileStatement(); } - - // Type id = Expression ; + + // Type id = Expression; case BOOLEAN: case VOID: case INT: case ID: { - - // Must be a type though there is a possibility of a reference - if (peek(1).type != Token.TYPE.ID - || peek(2).type == Token.TYPE.ID - || (peek(2).type == Token.TYPE.LSQUARE && peek(3).type == Token.TYPE.RSQUARE)) { - Type t = parseType(); - String name = accept(Token.TYPE.ID).spelling; - VarDecl v = new VarDecl(t, name, t.posn); - - accept(Token.TYPE.EQUALS); - Expression e = parseExpression(); - accept(Token.TYPE.SEMICOLON); - - return new VarDeclStmt(v, e, t.posn); + + Token.TYPE fst = peek(1).type; + Token.TYPE snd = peek(2).type; + Token.TYPE thd = peek(3).type; + + if(fst != Token.TYPE.ID || snd == Token.TYPE.ID) { + return parseVarDeclStatement(); + } else if(snd == Token.TYPE.LSQUARE && thd == Token.TYPE.RSQUARE) { + return parseVarDeclStatement(); } - + /* Fall Through */ } - + default: { - Statement s = null; - Reference r = parseReference(); - - // Reference ( ArgumentList? ) ; - if (peek(1).type == Token.TYPE.LPAREN) { - ExprList e = new ExprList(); - accept(Token.TYPE.LPAREN); - if (peek(1).type != Token.TYPE.RPAREN) { - e = parseArgumentList(); - } - accept(Token.TYPE.RPAREN); - s = new CallStmt(r, e, r.posn); - } - - // Reference = Expression ; - else { - accept(Token.TYPE.EQUALS); - Expression e = parseExpression(); - s = new AssignStmt(r, e, r.posn); - } - - accept(Token.TYPE.SEMICOLON); - return s; + return parseReferenceStatement(); } } } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // EXPRESSIONS + // + // ///////////////////////////////////////////////////////////////////////////// - /** - * Expression ::= Reference | Reference ( ArgumentList? ) | unop Expression - * | ( Expression ) | num | true | false | new (id() | int [ Expression ] | - * id [ Expression ] ) - * - * @return - * @throws ScanningException - */ - private Expression parseSingleExpression() throws ParsingException, ScanningException { + private Expression parseSingleExpression() throws IOException { - Expression e = null; switch (peek(1).type) { - - // num + case NUM: { - Token number = accept(Token.TYPE.NUM); - IntLiteral i = new IntLiteral(number.spelling, number.posn); - e = new LiteralExpr(i, number.posn); - break; + Token next = accept(Token.TYPE.NUM); + IntLiteral il = new IntLiteral(next.spelling, next.posn); + return new LiteralExpr(il, next.posn); } - // true | false case TRUE: case FALSE: { - Token bool = accept(peek(1).type); - BooleanLiteral b = new BooleanLiteral(bool.spelling, bool.posn); - e = new LiteralExpr(b, bool.posn); - break; + Token next = accept(peek(1).type); + BooleanLiteral bl = new BooleanLiteral(next.spelling, next.posn); + return new LiteralExpr(bl, next.posn); } // ( Expression ) case LPAREN: { accept(Token.TYPE.LPAREN); - e = parseExpression(); + Expression expr = parseExpression(); accept(Token.TYPE.RPAREN); - break; + + return expr; } // unop Expression case UNOP: case BINOP: { if (peek(1).spelling.equals("!") || peek(1).spelling.equals("-")) { - Token opToken = accept(peek(1).type); - Operator o = new Operator(opToken, opToken.posn); - e = new UnaryExpr(o, parseSingleExpression(), opToken.posn); - } else - throw new ParsingException(); - break; + Token next = accept(peek(1).type); + Operator o = new Operator(next, next.posn); + Expression expr = parseSingleExpression(); + return new UnaryExpr(o, expr, next.posn); + } else { + throw new ParsingException(peek(1).posn); + } } // new ( int [ Expression ] | id ( ) | id [ Expression ] ) case NEW: { - Token newToken = accept(Token.TYPE.NEW); + + Token next = accept(Token.TYPE.NEW); if (peek(1).type == Token.TYPE.INT) { accept(Token.TYPE.INT); accept(Token.TYPE.LSQUARE); - Expression e2 = parseExpression(); + Expression expr = parseExpression(); accept(Token.TYPE.RSQUARE); - BaseType b = new BaseType(TypeKind.INT, newToken.posn); - e = new NewArrayExpr(b, e2, newToken.posn); + BaseType b = new BaseType(TypeKind.INT, next.posn); + return new NewArrayExpr(b, expr, next.posn); } else { Token id = accept(Token.TYPE.ID); - Identifier i = new Identifier(id.spelling, id.posn); - ClassType c = new ClassType(i, id.posn); + Identifier ident = new Identifier(id.spelling, id.posn); + ClassType ct = new ClassType(ident, id.posn); if (peek(1).type == Token.TYPE.LPAREN) { accept(Token.TYPE.LPAREN); accept(Token.TYPE.RPAREN); - e = new NewObjectExpr(c, id.posn); + return new NewObjectExpr(ct, next.posn); } else { accept(Token.TYPE.LSQUARE); - Expression e2 = parseExpression(); + Expression expr = parseExpression(); accept(Token.TYPE.RSQUARE); - e = new NewArrayExpr(c, e2, id.posn); + return new NewArrayExpr(ct, expr, next.posn); } } - - break; } // Reference ((ArgumentList?))? case THIS: case ID: { - Reference r = parseReference(); + + Reference ref = parseReference(); + if (peek(1).type == Token.TYPE.LPAREN) { accept(Token.TYPE.LPAREN); ExprList el = new ExprList(); @@ -501,138 +655,139 @@ public class Parser { el = parseArgumentList(); } accept(Token.TYPE.RPAREN); - e = new CallExpr(r, el, r.posn); + return new CallExpr(ref, el, ref.posn); } else { - e = new RefExpr(r, r.posn); + return new RefExpr(ref, ref.posn); } - - break; } - default: - throw new ParsingException(peek(1)); + default: throw new ParsingException(peek(1).posn); } - - return e; } /** - * Disjunction & Initial Call: Expression ::= Expression binop Expression + * Disjunctive * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Expression parseExpression() throws ParsingException, ScanningException { - - Expression e = parseCExpression(); + private Expression parseExpression() throws IOException { + + Expression expr = parseCExpression(); + while (peek(1).spelling.equals("||")) { - Token opToken = accept(Token.TYPE.BINOP); - Operator o = new Operator(opToken, opToken.posn); - e = new BinaryExpr(o, e, parseCExpression(), e.posn); + Token next = accept(Token.TYPE.BINOP); + Operator o = new Operator(next, next.posn); + expr = new BinaryExpr(o, expr, parseCExpression(), expr.posn); } - return e; + return expr; } /** - * Conjunction + * Conjunctive * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Expression parseCExpression() throws ParsingException, ScanningException { + private Expression parseCExpression() throws IOException { - Expression e = parseEExpression(); + Expression expr = parseEExpression(); + while (peek(1).spelling.equals("&&")) { - Token opToken = accept(Token.TYPE.BINOP); - Operator o = new Operator(opToken, opToken.posn); - e = new BinaryExpr(o, e, parseEExpression(), e.posn); + Token next = accept(Token.TYPE.BINOP); + Operator o = new Operator(next, next.posn); + expr = new BinaryExpr(o, expr, parseEExpression(), expr.posn); } - return e; + return expr; } /** * Equality * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Expression parseEExpression() throws ParsingException, ScanningException { + private Expression parseEExpression() throws IOException { - Expression e = parseRExpression(); + Expression expr = parseRExpression(); + while (peek(1).spelling.equals("==") || peek(1).spelling.equals("!=")) { - Token opToken = accept(Token.TYPE.BINOP); - Operator o = new Operator(opToken, opToken.posn); - e = new BinaryExpr(o, e, parseRExpression(), e.posn); + Token next = accept(Token.TYPE.BINOP); + Operator o = new Operator(next, next.posn); + expr = new BinaryExpr(o, expr, parseRExpression(), expr.posn); } - return e; + return expr; } - + /** * Relational * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Expression parseRExpression() throws ParsingException, ScanningException { + private Expression parseRExpression() throws IOException { - Expression e = parseAExpression(); - while (peek(1).spelling.equals("<") || peek(1).spelling.equals("<=") - || peek(1).spelling.equals(">") - || peek(1).spelling.equals(">=")) { - Token opToken = accept(Token.TYPE.BINOP); - Operator o = new Operator(opToken, opToken.posn); - e = new BinaryExpr(o, e, parseAExpression(), e.posn); + Expression expr = parseAExpression(); + + while(peek(1).spelling.equals("<") || peek(1).spelling.equals("<=") + || peek(1).spelling.equals(">") || peek(1).spelling.equals(">=")) { + Token next = accept(Token.TYPE.BINOP); + Operator o = new Operator(next, next.posn); + expr = new BinaryExpr(o, expr, parseAExpression(), expr.posn); } - return e; + return expr; } /** * Additive * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Expression parseAExpression() throws ParsingException, ScanningException { + private Expression parseAExpression() throws IOException { - Expression e = parseMExpression(); + Expression expr = parseMExpression(); + while (peek(1).spelling.equals("+") || peek(1).spelling.equals("-")) { - Token opToken = accept(Token.TYPE.BINOP); - Operator o = new Operator(opToken, opToken.posn); - e = new BinaryExpr(o, e, parseMExpression(), e.posn); + Token next = accept(Token.TYPE.BINOP); + Operator o = new Operator(next, next.posn); + expr = new BinaryExpr(o, expr, parseMExpression(), expr.posn); } - return e; + return expr; } /** * Multiplicative * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Expression parseMExpression() throws ParsingException, ScanningException { - - Expression e = parseSingleExpression(); + private Expression parseMExpression() throws IOException { + + Expression expr = parseSingleExpression(); + while (peek(1).spelling.equals("*") || peek(1).spelling.equals("/")) { - Token opToken = accept(Token.TYPE.BINOP); - Operator o = new Operator(opToken, opToken.posn); - e = new BinaryExpr(o, e, parseSingleExpression(), e.posn); + Token next = accept(Token.TYPE.BINOP); + Operator o = new Operator(next, next.posn); + expr = new BinaryExpr(o, expr, parseSingleExpression(), expr.posn); } - return e; + return expr; } - + + + // ///////////////////////////////////////////////////////////////////////////// + // + // Convenience Methods + // + // ///////////////////////////////////////////////////////////////////////////// + /** - * Sees what the next token is, caching the result. + * * @param lookahead * @return - * @throws ScanningException + * @throws IOException */ - private Token peek(int lookahead) throws ScanningException { + private Token peek(int lookahead) throws IOException { // Cache tokens while (stream.size() < lookahead) { @@ -644,16 +799,16 @@ public class Parser { } /** - * Consumes token or throws exception. + * * @param type * @return - * @throws ParsingException - * @throws ScanningException + * @throws IOException */ - private Token accept(Token.TYPE type) throws ParsingException, ScanningException { + private Token accept(Token.TYPE type) throws IOException { + Token next = peek(1); if(next.type == type) stream.poll(); - else throw new ParsingException(next); + else throw new ParsingException(next.posn); return next; } diff --git a/src/miniJava/SyntacticAnalyzer/ParsingException.java b/src/miniJava/SyntacticAnalyzer/ParsingException.java new file mode 100644 index 0000000..635e52d --- /dev/null +++ b/src/miniJava/SyntacticAnalyzer/ParsingException.java @@ -0,0 +1,16 @@ +package miniJava.SyntacticAnalyzer; + +import java.io.IOException; + +/** + * + */ +public class ParsingException extends IOException { + + private static final long serialVersionUID = 1L; + + public ParsingException(SourcePosition posn) { + super("Parsing error at " + posn); + } + +} \ No newline at end of file diff --git a/src/miniJava/SyntacticAnalyzer/Scanner.java b/src/miniJava/SyntacticAnalyzer/Scanner.java index 3cd0aa8..e3ff840 100644 --- a/src/miniJava/SyntacticAnalyzer/Scanner.java +++ b/src/miniJava/SyntacticAnalyzer/Scanner.java @@ -1,313 +1,306 @@ package miniJava.SyntacticAnalyzer; import java.io.*; -import miniJava.Exceptions.*; public class Scanner { private int col = 1; private int line = 1; + private boolean predefined; private BufferedReader input; - - public Scanner(BufferedReader input) { - this.input = input; - } - - public Scanner(String input) { - StringReader reader = new StringReader(input); - this.input = new BufferedReader(reader); - } - + + /** + * + * @param input + */ + public Scanner(BufferedReader input) { + this(input, false); + } + + /** + * + * @param input + * @param predefined + */ + public Scanner(String input, boolean predefined) { + this(new BufferedReader(new StringReader(input)), predefined); + } + + /** + * + * @param input + * @param predefined + */ + public Scanner(BufferedReader input, boolean predefined) { + this.input = input; + this.predefined = predefined; + } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // Scanning + // + // ///////////////////////////////////////////////////////////////////////////// + /** - * Scans in input, returning next token. * * @return * @throws IOException */ - public Token scan() throws ScanningException { - - String attr = ""; + public Token scan() throws IOException { Token token = null; - + String spelling = ""; + while (token == null) { - - // Check for EOF + int c = read(); - if (c == -1) - return new Token("", Token.TYPE.EOT); + SourcePosition posn = new SourcePosition(col, line); + + if(c == -1) { + token = new Token("", Token.TYPE.EOT, posn); + } else { + spelling += (char) c; + + switch(c) { - // Setup - attr += (char) c; - - switch (c) { - - // Operators - case '*': - token = new Token(attr, Token.TYPE.BINOP); - break; - - case '+': - if (peek('+')) - throw new ScanningException(col, line); - token = new Token(attr, Token.TYPE.BINOP); - break; - - case '-': - if (peek('-')) - throw new ScanningException(col, line); - token = new Token(attr, Token.TYPE.BINOP); - break; - - // Check for comment - case '/': - if (peek('*')) { - read(); - readComment(); - attr = ""; - } else if (peek('/')) { - readLine(); - attr = ""; - } else - token = new Token(attr, Token.TYPE.BINOP); - break; - - // Check for c or c= - case '>': - case '<': - if (peek('=')) - attr += (char) read(); - token = new Token(attr, Token.TYPE.BINOP); - break; - - // Check for ! or != - case '!': - if (!peek('=')) - token = new Token(attr, Token.TYPE.UNOP); - else { - attr += (char) read(); - token = new Token(attr, Token.TYPE.BINOP); - } - break; - - // Check for && or || - case '&': - case '|': - if (!peek((char) c)) - throw new ScanningException(col, line); - else { - attr += (char) read(); - token = new Token(attr, Token.TYPE.BINOP); - } - break; - - // Other Operators - case '=': - if (!peek('=')) - token = new Token(attr, Token.TYPE.EQUALS); - else { - attr += (char) read(); - token = new Token(attr, Token.TYPE.BINOP); - } - break; - - case '.': - token = new Token(attr, Token.TYPE.PERIOD); - break; - - case ',': - token = new Token(attr, Token.TYPE.COMMA); - break; - - case '[': - token = new Token(attr, Token.TYPE.LSQUARE); - break; - - case ']': - token = new Token(attr, Token.TYPE.RSQUARE); - break; - - case '{': - token = new Token(attr, Token.TYPE.LBRACKET); - break; - - case '}': - token = new Token(attr, Token.TYPE.RBRACKET); - break; - - case '(': - token = new Token(attr, Token.TYPE.LPAREN); - break; - - case ')': - token = new Token(attr, Token.TYPE.RPAREN); - break; - - case ';': - token = new Token(attr, Token.TYPE.SEMICOLON); - break; - - default: - - // Identifier or Keyword - if (isAlpha((char) c)) { - for (char n = peek(); isAlpha(n) || isDigit(n);) { - attr += (char) read(); - n = peek(); + // Operators + case '*': + case '+': + case '-': { + if(peek(c)) throw new ScanningException(posn); + token = new Token(spelling, Token.TYPE.BINOP, posn); + break; } + + // Comment + case '/': { + if(peek('*')) { + read(); + readMultiLineComment(); + spelling = ""; + } else if(peek('/')) { + readSingleLineComment(); + spelling = ""; + } else { + token = new Token(spelling, Token.TYPE.BINOP, posn); + } + + break; + } + + // Relational + case '>': + case '<': { + if (peek('=')) spelling += (char) read(); + token = new Token(spelling, Token.TYPE.BINOP, posn); + break; + } + + // Negation + case '!': { + if(peek('=')) { + spelling += (char) read(); + token = new Token(spelling, Token.TYPE.BINOP, posn); + } else { + token = new Token(spelling, Token.TYPE.UNOP, posn); + } + + break; + } + + // Logical + case '&': + case '|': { + if(!peek(c)) { + throw new ScanningException(posn); + } else { + spelling += (char) read(); + token = new Token(spelling, Token.TYPE.BINOP, posn); + } + + break; + } + + // Other Operators + case '=': { + if(peek('=')) { + spelling += (char) read(); + token = new Token(spelling, Token.TYPE.BINOP, posn); + } else { + token = new Token(spelling, Token.TYPE.EQUALS, posn); + } + + break; + } + + // Miscellaneous + case '.': + case ',': + case '[': + case ']': + case '{': + case '}': + case '(': + case ')': + case ';': { + token = new Token(spelling, Token.symbols.get(c), posn); + break; + } + + default: { + + // Identifier or keyword + if(isAlpha(c)) { + int next = peek(); + while(isAlpha(next) || isDigit(next) || next == '_') { + spelling += (char) read(); + next = peek(); + } + + if(Token.keywords.containsKey(spelling)) { + token = new Token(spelling, Token.keywords.get(spelling), posn); + } else { + token = new Token(spelling, Token.TYPE.ID, posn); + } + } + + // Number + else if(isDigit(c)) { + int next = peek(); + while(isDigit(next)) { + spelling += (char) read(); + next = peek(); + } - if (Token.keywords.containsKey(attr)) { - token = new Token(attr, Token.keywords.get(attr)); - } else { - token = new Token(attr, Token.TYPE.ID); + token = new Token(spelling, Token.TYPE.NUM, posn); + } + + // Whitespace + else if(isWhitespace(c)) { + spelling = ""; + } + + // Unrecognized Character + else { + throw new ScanningException(posn); + } } } - - // Number - else if (isDigit((char) c)) { - for (char n = peek(); isDigit(n);) { - attr += (char) read(); - n = peek(); - } - - token = new Token(attr, Token.TYPE.NUM); - } - - // Whitespace - else if (isWhitespace((char) c)) { - attr = ""; - } - - // Unrecognized Character - else - throw new ScanningException(col, line); - ; - - break; } } - token.posn = new SourcePosition(line, col - token.spelling.length()); return token; } + + + // ///////////////////////////////////////////////////////////////////////////// + // + // Convenience Methods + // + // ///////////////////////////////////////////////////////////////////////////// + /** - * Looks at next character in stream without consuming. - * - * @return - * @throws IOException - */ - private char peek() throws ScanningException { - try { - input.mark(1); - int next = input.read(); - input.reset(); - - return next == -1 ? '\0' : (char) next; - } catch (IOException e) { - throw new ScanningException(col, line); - } - } - - /** - * Returns whether passed character is next in stream. - * - * @param c - * @return - * @throws IOException - */ - private boolean peek(char c) throws ScanningException { - try { - input.mark(1); - int next = input.read(); - input.reset(); - - return c == next; - } catch (IOException e) { - throw new ScanningException(col, line); - } - } - - /** - * Alternative reading that keeps track of position. - * - * @return - * @throws IOException - */ - private int read() throws ScanningException { - try { - int next = input.read(); - if (next != '\n' && next != '\r') - col += 1; - else { - col = 1; - line += 1; - if (peek('\r') || peek('\n')) - next = input.read(); - } - - return next; - } catch (IOException e) { - throw new ScanningException(col, line); - } - } - - /** - * Consumes input until an end of comment has been reached. - * - * @throws IOException - */ - private void readComment() throws ScanningException { - char prev = '\0', current = '\0'; - while (prev != '*' || current != '/') { - - prev = current; - - int next = read(); - if (next == -1) - throw new ScanningException(col, line); - else - current = (char) next; - } - } - - /** - * Consumes input until the end of line is reached - * - * @throws IOException - */ - private void readLine() throws ScanningException { - for (int n = 0; n != '\n' && n != '\r' && n != -1; n = read()) { - } - } - - /** - * Tells whether character is alphabetical. * * @param c * @return */ - private boolean isAlpha(char c) { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; + private boolean isAlpha(int c) { + return (c >= 'a' && c <= 'z') + || (c >= 'A' && c <= 'Z') + || (predefined && c == '_'); } - + /** - * Tells whether character is numerical. * * @param c * @return */ - private boolean isDigit(char c) { + private boolean isDigit(int c) { return c >= '0' && c <= '9'; } - + /** - * Tells wheter character is whitespace. * * @param c * @return */ - private boolean isWhitespace(char c) { + private boolean isWhitespace(int c) { return c == ' ' || c == '\n' || c == '\r' || c == '\t'; } + + /** + * + * @return + * @throws IOException + */ + private int peek() throws IOException { + input.mark(1); + int next = input.read(); + input.reset(); + return next; + } + + /** + * + * @param c + * @return + * @throws IOException + */ + private boolean peek(int c) throws IOException { + input.mark(1); + int next = input.read(); + input.reset(); + + return c == next; + } + + /** + * + * @return + * @throws IOException + */ + private int read() throws IOException { + int next = input.read(); + if(next == '\n' || next == '\r') { + col = 1; + line += 1; + } else { + col += 1; + } + + return next; + } + + /** + * + * @throws IOException + */ + private void readSingleLineComment() throws IOException { + col = 1; + line += 1; + input.readLine(); + } + + /** + * + * @throws IOException + */ + private void readMultiLineComment() throws IOException { + int prev = '\0'; + int current = '\0'; + + while(prev != '*' || current != '/') { + prev = current; + current = read(); + + // Unterminated + if(current == -1) { + SourcePosition posn = new SourcePosition(line, col); + throw new ScanningException(posn); + } + } + } } diff --git a/src/miniJava/SyntacticAnalyzer/ScanningException.java b/src/miniJava/SyntacticAnalyzer/ScanningException.java new file mode 100644 index 0000000..6f29677 --- /dev/null +++ b/src/miniJava/SyntacticAnalyzer/ScanningException.java @@ -0,0 +1,16 @@ +package miniJava.SyntacticAnalyzer; + +import java.io.IOException; + +/** + * + */ +public class ScanningException extends IOException { + + private static final long serialVersionUID = 1L; + + public ScanningException(SourcePosition posn) { + super("Scanning error at " + posn); + } + +} diff --git a/src/miniJava/SyntacticAnalyzer/SourcePosition.java b/src/miniJava/SyntacticAnalyzer/SourcePosition.java index 272acc4..072d8fe 100644 --- a/src/miniJava/SyntacticAnalyzer/SourcePosition.java +++ b/src/miniJava/SyntacticAnalyzer/SourcePosition.java @@ -1,11 +1,14 @@ package miniJava.SyntacticAnalyzer; +/** + * + */ public class SourcePosition { public final int col; public final int line; - public SourcePosition(int line, int col) { + public SourcePosition(int col, int line) { this.col = col; this.line = line; } diff --git a/src/miniJava/SyntacticAnalyzer/Token.java b/src/miniJava/SyntacticAnalyzer/Token.java index 08f5abb..ddd35f1 100644 --- a/src/miniJava/SyntacticAnalyzer/Token.java +++ b/src/miniJava/SyntacticAnalyzer/Token.java @@ -2,26 +2,51 @@ package miniJava.SyntacticAnalyzer; import java.util.HashMap; +/** + * + */ public class Token { public enum TYPE { - - // Possible Terminals - ID, NUM, UNOP, BINOP, + + // Terminals + ID, + NUM, + UNOP, + BINOP, + EQUALS, + PERIOD, + COMMA, + LPAREN, + RPAREN, + LSQUARE, + RSQUARE, + LBRACKET, + RBRACKET, + SEMICOLON, // Keywords - IF, ELSE, NEW, INT, VOID, THIS, TRUE, FALSE, CLASS, WHILE, RETURN, BOOLEAN, - - // Declarators - STATIC, PUBLIC, PRIVATE, - - // Other Terminals - EQUALS, PERIOD, COMMA, LPAREN, RPAREN, LSQUARE, RSQUARE, LBRACKET, RBRACKET, SEMICOLON, + IF, + ELSE, + NEW, + INT, + VOID, + THIS, + TRUE, + FALSE, + CLASS, + WHILE, + RETURN, + BOOLEAN, + STATIC, + PUBLIC, + PRIVATE, // End of Token Stream EOT }; + // Pair words with enumeration public final static HashMap keywords; static { keywords = new HashMap(); @@ -41,14 +66,29 @@ public class Token { keywords.put("false", TYPE.FALSE); keywords.put("new", TYPE.NEW); } + + // Pair symbols with enumeration + public final static HashMap symbols; + static { + symbols = new HashMap(); + symbols.put((int) '.', TYPE.PERIOD); + symbols.put((int) ',', TYPE.COMMA); + symbols.put((int) '[', TYPE.LSQUARE); + symbols.put((int) ']', TYPE.RSQUARE); + symbols.put((int) '{', TYPE.LBRACKET); + symbols.put((int) '}', TYPE.RBRACKET); + symbols.put((int) '(', TYPE.LPAREN); + symbols.put((int) ')', TYPE.RPAREN); + symbols.put((int) ';', TYPE.SEMICOLON); + } public final TYPE type; - public SourcePosition posn; public final String spelling; + public final SourcePosition posn; - public Token(String spelling, TYPE type) { + public Token(String spelling, TYPE type, SourcePosition posn) { this.type = type; - this.posn = null; + this.posn = posn; this.spelling = spelling; } } diff --git a/src/tester/Checkpoint1.java b/src/tester/Checkpoint1.java new file mode 100644 index 0000000..64410e8 --- /dev/null +++ b/src/tester/Checkpoint1.java @@ -0,0 +1,71 @@ +package tester; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Scanner; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/* Automated regression tester for Checkpoint 1 tests + * Created by Max Beckman-Harned + * Put your tests in "tests/pa1_tests" folder in your Eclipse workspace directory + */ +public class Checkpoint1 { + + static ExecutorService threadPool = Executors.newCachedThreadPool(); + + public static void main(String[] args) throws IOException, InterruptedException { + File testDir = new File(System.getProperty("java.class.path") + + "/../tests/pa1_tests"); + int failures = 0; + for (File x : testDir.listFiles()) { + int returnCode = runTest(x); + if (x.getName().indexOf("pass") != -1) { + if (returnCode == 0) + System.out.println(x.getName() + " passed successfully!"); + else { + failures++; + System.err.println(x.getName() + + " failed but should have passed!"); + } + } else { + if (returnCode == 4) + System.out.println(x.getName() + " failed successfully!"); + else { + System.err.println(x.getName() + " did not fail properly!"); + failures++; + } + } + } + System.out.println(failures + " failures in all."); + } + + private static int runTest(File x) throws IOException, InterruptedException { + ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path"))); + Process p = pb.start(); + threadPool.execute(new ProcessOutputter(p.getInputStream(), false)); + p.waitFor(); + return p.exitValue(); + } + + static class ProcessOutputter implements Runnable { + private Scanner processOutput; + private boolean output; + + public ProcessOutputter(InputStream _processStream, boolean _output) { + processOutput = new Scanner(_processStream); + output = _output; + } + @Override + public void run() { + while(processOutput.hasNextLine()) { + String line = processOutput.nextLine(); + if (output) + System.out.println(line); + } + } + + + } +} diff --git a/src/tester/Checkpoint2.java b/src/tester/Checkpoint2.java new file mode 100644 index 0000000..d9d7711 --- /dev/null +++ b/src/tester/Checkpoint2.java @@ -0,0 +1,98 @@ +package tester; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.FileInputStream; +import java.util.Scanner; + +/* Automated regression tester for Checkpoint 2 tests + * Created by Max Beckman-Harned + * Put your tests in "tests/pa2_tests" folder in your Eclipse workspace directory + * If you preface your error messages / exceptions with ERROR or *** then they will be displayed if they appear during processing + */ + +public class Checkpoint2 { + + private static class ReturnInfo { + int returnCode; + String ast; + public ReturnInfo(int _returnCode, String _ast) { + returnCode = _returnCode; + ast = _ast; + } + } + + public static void main(String[] args) throws IOException, InterruptedException { + File testDir = new File(System.getProperty("java.class.path") + + "/../tests/pa2_tests"); + int failures = 0; + for (File x : testDir.listFiles()) { + if (x.getName().endsWith("out") || x.getName().startsWith(".")) + continue; + ReturnInfo info = runTest(x); + int returnCode = info.returnCode; + String ast = info.ast; + if (x.getName().indexOf("pass") != -1) { + if (returnCode == 0) { + String actualAST = getAST(new FileInputStream(x.getPath() + ".out")); + if (actualAST.equals(ast)) + System.out.println(x.getName() + " parsed successfully and has a correct AST!"); + else { + System.err.println(x.getName() + " parsed successfully but has an incorrect AST!"); + failures++; + } + } + else { + failures++; + System.err.println(x.getName() + + " failed to be parsed!"); + } + } else { + if (returnCode == 4) + System.out.println(x.getName() + " failed successfully!"); + else { + System.err.println(x.getName() + " did not fail properly!"); + failures++; + } + } + } + System.out.println(failures + " failures in all."); + } + + private static ReturnInfo runTest(File x) throws IOException, InterruptedException { + ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path"))); + pb.redirectErrorStream(true); + Process p = pb.start(); + + String ast = getAST(p.getInputStream()); + p.waitFor(); + int exitValue = p.exitValue(); + return new ReturnInfo(exitValue, ast); + } + + + public static String getAST(InputStream stream) { + Scanner scan = new Scanner(stream); + String ast = null; + while (scan.hasNextLine()) { + String line = scan.nextLine(); + if (line.equals("======= AST Display =========================")) { + line = scan.nextLine(); + while(scan.hasNext() && !line.equals("=============================================")) { + ast += line + "\n"; + line = scan.nextLine(); + } + } + if (line.startsWith("*** ")) + System.out.println(line); + if (line.startsWith("ERROR")) { + System.out.println(line); + while(scan.hasNext()) + System.out.println(scan.next()); + } + } + scan.close(); + return ast; + } +} diff --git a/src/tester/Checkpoint3.java b/src/tester/Checkpoint3.java new file mode 100644 index 0000000..760e1f1 --- /dev/null +++ b/src/tester/Checkpoint3.java @@ -0,0 +1,73 @@ +package tester; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Scanner; + + +/* Automated regression tester for Checkpoint 3 tests + * Created by Max Beckman-Harned + * Put your tests in "tests/pa3_tests" folder in your Eclipse workspace directory + * If you preface your error messages / exceptions with ERROR or *** then they will be displayed if they appear during processing + */ + +public class Checkpoint3 { + + + public static void main(String[] args) throws IOException, InterruptedException { + File testDir = new File(System.getProperty("java.class.path") + + "/../tests/pa3_tests"); + int failures = 0; + for (File x : testDir.listFiles()) { + if (x.getName().endsWith("out") || x.getName().startsWith(".") || x.getName().endsWith("mJAM") || x.getName().endsWith("asm")) + continue; + int returnCode = runTest(x); + if (x.getName().indexOf("pass") != -1) { + if (returnCode == 0) { + System.out.println(x.getName() + " processed successfully!"); + } + else { + failures++; + System.err.println(x.getName() + + " failed to be processed!"); + } + } else { + if (returnCode == 4) + System.out.println(x.getName() + " failed successfully!"); + else { + System.err.println(x.getName() + " did not fail properly!"); + failures++; + } + } + } + System.out.println(failures + " failures in all."); + } + + private static int runTest(File x) throws IOException, InterruptedException { + ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path"))); + pb.redirectErrorStream(true); + Process p = pb.start(); + + processStream(p.getInputStream()); + p.waitFor(); + int exitValue = p.exitValue(); + return exitValue; + } + + + public static void processStream(InputStream stream) { + Scanner scan = new Scanner(stream); + while (scan.hasNextLine()) { + String line = scan.nextLine(); + if (line.startsWith("*** ")) + System.out.println(line); + if (line.startsWith("ERROR")) { + System.out.println(line); + //while(scan.hasNext()) + //System.out.println(scan.next()); + } + } + scan.close(); + } +} diff --git a/src/tester/Checkpoint4.java b/src/tester/Checkpoint4.java new file mode 100644 index 0000000..9ff8089 --- /dev/null +++ b/src/tester/Checkpoint4.java @@ -0,0 +1,112 @@ +package tester; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Scanner; + + +/* Automated regression tester for Checkpoint 4 tests + * Created by Max Beckman-Harned + * Put your tests in "tests/pa4_tests" folder in your Eclipse workspace directory + * If you preface your compiler error messages / exceptions with ERROR or *** then they will be displayed if they appear during processing + */ + +public class Checkpoint4 { + + + public static void main(String[] args) throws IOException, InterruptedException { + File testDir = new File(System.getProperty("java.class.path") + + "/../tests/pa4_tests"); + int failures = 0; + for (File x : testDir.listFiles()) { + if (x.getName().startsWith(".") || x.getName().endsWith("mJAM") || x.getName().endsWith("asm")) + continue; + int returnCode = runTest(x); + if (x.getName().indexOf("pass") != -1) { + if (returnCode == 0) { + try { + int val = executeTest(x); + int expected = Integer.parseInt(x.getName().substring(5,7)); + if (val == expected) + System.out.println(x.getName() + " ran successfully!"); + else { + failures++; + System.err.println(x.getName() + " compiled but did not run successfully--got output " + val); + } + } + catch(Exception ex) { + failures++; + System.err.println(x.getName() + " did not output correctly."); + } + } + else { + failures++; + System.err.println(x.getName() + + " failed to be processed!"); + } + } else { + if (returnCode == 4) + System.out.println(x.getName() + " failed successfully!"); + else { + System.err.println(x.getName() + " did not fail properly!"); + failures++; + } + } + } + System.out.println(failures + " failures in all."); + } + + private static int runTest(File x) throws IOException, InterruptedException { + ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path"))); + pb.redirectErrorStream(true); + Process p = pb.start(); + + processStream(p.getInputStream()); + p.waitFor(); + int exitValue = p.exitValue(); + return exitValue; + } + + private static int executeTest(File x) throws IOException, InterruptedException { + ProcessBuilder pb = new ProcessBuilder("java", "mJAM.Interpreter", x.getPath().replace(".java", ".mJAM")).directory(new File(System.getProperty("java.class.path"))); + Process process = pb.start(); + + Scanner scan = new Scanner(process.getInputStream()); + int num = -1; + while (scan.hasNextLine()) { + String line = scan.nextLine(); + if (line.startsWith(">>> ")) { + num = Integer.parseInt(line.substring(4)); + System.out.println("Result = " + num); + break; + } + } + while (scan.hasNextLine()) { + String line = scan.nextLine(); + if (line.startsWith("*** ")) { + System.out.println(line); + break; + } + } + scan.close(); + + return num; + } + + + public static void processStream(InputStream stream) { + Scanner scan = new Scanner(stream); + while (scan.hasNextLine()) { + String line = scan.nextLine(); + if (line.startsWith("*** ")) + System.out.println(line); + if (line.startsWith("ERROR")) { + System.out.println(line); + //while(scan.hasNext()) + //System.out.println(scan.next()); + } + } + scan.close(); + } +} \ No newline at end of file