From 46a6e73f5df8c5663ff49c8db449c85b3e4e71fb Mon Sep 17 00:00:00 2001 From: Joshua Potter Date: Fri, 21 Feb 2014 22:34:37 -0500 Subject: [PATCH] AST Generation Construct an AST. --- docs/PA2.pdf | Bin 0 -> 180320 bytes .../src/miniJava/AbstractSyntaxTrees/AST.java | 27 + .../AbstractSyntaxTrees/ASTDisplay.java | 353 ++++++++++++ .../AbstractSyntaxTrees/ArrayType.java | 24 + .../AbstractSyntaxTrees/AssignStmt.java | 24 + .../AbstractSyntaxTrees/BaseType.java | 19 + .../AbstractSyntaxTrees/BinaryExpr.java | 26 + .../AbstractSyntaxTrees/BlockStmt.java | 22 + .../AbstractSyntaxTrees/BooleanLiteral.java | 19 + .../AbstractSyntaxTrees/CallExpr.java | 24 + .../AbstractSyntaxTrees/CallStmt.java | 24 + .../AbstractSyntaxTrees/ClassDecl.java | 24 + .../AbstractSyntaxTrees/ClassDeclList.java | 34 ++ .../AbstractSyntaxTrees/ClassType.java | 22 + .../AbstractSyntaxTrees/Declaration.java | 20 + .../AbstractSyntaxTrees/Declarators.java | 14 + .../AbstractSyntaxTrees/ExprList.java | 33 ++ .../AbstractSyntaxTrees/Expression.java | 16 + .../AbstractSyntaxTrees/FieldDecl.java | 24 + .../AbstractSyntaxTrees/FieldDeclList.java | 34 ++ .../miniJava/AbstractSyntaxTrees/IdRef.java | 22 + .../AbstractSyntaxTrees/Identifier.java | 20 + .../miniJava/AbstractSyntaxTrees/IfStmt.java | 33 ++ .../AbstractSyntaxTrees/IndexedRef.java | 24 + .../AbstractSyntaxTrees/IntLiteral.java | 19 + .../miniJava/AbstractSyntaxTrees/Literal.java | 15 + .../AbstractSyntaxTrees/LiteralExpr.java | 22 + .../AbstractSyntaxTrees/LocalDecl.java | 16 + .../AbstractSyntaxTrees/MemberDecl.java | 26 + .../AbstractSyntaxTrees/MethodDecl.java | 26 + .../AbstractSyntaxTrees/MethodDeclList.java | 34 ++ .../AbstractSyntaxTrees/NewArrayExpr.java | 24 + .../miniJava/AbstractSyntaxTrees/NewExpr.java | 15 + .../AbstractSyntaxTrees/NewObjectExpr.java | 22 + .../AbstractSyntaxTrees/Operator.java | 22 + .../miniJava/AbstractSyntaxTrees/Package.java | 22 + .../AbstractSyntaxTrees/ParameterDecl.java | 20 + .../ParameterDeclList.java | 33 ++ .../AbstractSyntaxTrees/QualifiedRef.java | 25 + .../miniJava/AbstractSyntaxTrees/RefExpr.java | 22 + .../AbstractSyntaxTrees/Reference.java | 16 + .../AbstractSyntaxTrees/Statement.java | 16 + .../AbstractSyntaxTrees/StatementList.java | 33 ++ .../AbstractSyntaxTrees/Terminal.java | 18 + .../miniJava/AbstractSyntaxTrees/ThisRef.java | 21 + .../miniJava/AbstractSyntaxTrees/Type.java | 21 + .../AbstractSyntaxTrees/TypeKind.java | 16 + .../AbstractSyntaxTrees/UnaryExpr.java | 24 + .../miniJava/AbstractSyntaxTrees/VarDecl.java | 19 + .../AbstractSyntaxTrees/VarDeclStmt.java | 24 + .../miniJava/AbstractSyntaxTrees/Visitor.java | 57 ++ .../AbstractSyntaxTrees/WhileStmt.java | 24 + miniJava/src/miniJava/Compiler.java | 12 +- .../miniJava/SyntacticAnalyzer/Parser.java | 520 ++++++++++++------ .../miniJava/SyntacticAnalyzer/Scanner.java | 2 +- .../SyntacticAnalyzer/SourcePosition.java | 12 + .../src/miniJava/SyntacticAnalyzer/Token.java | 6 +- .../{SyntacticAnalyzer => }/grammar.txt | 6 +- miniJava/src/miniJava/stratified.txt | 50 ++ miniJava/test.java | 15 +- 60 files changed, 1985 insertions(+), 172 deletions(-) create mode 100644 docs/PA2.pdf create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/AST.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ASTDisplay.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ArrayType.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/AssignStmt.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/BaseType.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/BinaryExpr.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/BlockStmt.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/BooleanLiteral.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/CallExpr.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/CallStmt.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ClassDecl.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ClassDeclList.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ClassType.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Declaration.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Declarators.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ExprList.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Expression.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/FieldDecl.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/FieldDeclList.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/IdRef.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Identifier.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/IfStmt.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/IndexedRef.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/IntLiteral.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Literal.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/LiteralExpr.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/LocalDecl.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/MemberDecl.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/MethodDecl.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/MethodDeclList.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/NewArrayExpr.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/NewExpr.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/NewObjectExpr.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Operator.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Package.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ParameterDecl.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ParameterDeclList.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/QualifiedRef.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/RefExpr.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Reference.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Statement.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/StatementList.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Terminal.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/ThisRef.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Type.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/TypeKind.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/UnaryExpr.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/VarDecl.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/VarDeclStmt.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/Visitor.java create mode 100644 miniJava/src/miniJava/AbstractSyntaxTrees/WhileStmt.java create mode 100644 miniJava/src/miniJava/SyntacticAnalyzer/SourcePosition.java rename miniJava/src/miniJava/{SyntacticAnalyzer => }/grammar.txt (89%) create mode 100644 miniJava/src/miniJava/stratified.txt diff --git a/docs/PA2.pdf b/docs/PA2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..895503d5693e09f6af9c89cf8f6a37fd4f5e5fd4 GIT binary patch literal 180320 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 R visit(Visitor v, A o); + + public SourcePosition posn; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/ASTDisplay.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ASTDisplay.java new file mode 100644 index 0000000..be328a3 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ASTDisplay.java @@ -0,0 +1,353 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/ArrayType.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ArrayType.java new file mode 100644 index 0000000..d8a5358 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ArrayType.java @@ -0,0 +1,24 @@ +/** + * 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; + } + diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/AssignStmt.java b/miniJava/src/miniJava/AbstractSyntaxTrees/AssignStmt.java new file mode 100644 index 0000000..1a6db99 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/AssignStmt.java @@ -0,0 +1,24 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/BaseType.java b/miniJava/src/miniJava/AbstractSyntaxTrees/BaseType.java new file mode 100644 index 0000000..38ad09f --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/BaseType.java @@ -0,0 +1,19 @@ +/** + * 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); + } +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/BinaryExpr.java b/miniJava/src/miniJava/AbstractSyntaxTrees/BinaryExpr.java new file mode 100644 index 0000000..91fcc28 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/BinaryExpr.java @@ -0,0 +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; +} \ No newline at end of file diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/BlockStmt.java b/miniJava/src/miniJava/AbstractSyntaxTrees/BlockStmt.java new file mode 100644 index 0000000..933909c --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/BlockStmt.java @@ -0,0 +1,22 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/BooleanLiteral.java b/miniJava/src/miniJava/AbstractSyntaxTrees/BooleanLiteral.java new file mode 100644 index 0000000..47b5f3f --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/BooleanLiteral.java @@ -0,0 +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); + } +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/CallExpr.java b/miniJava/src/miniJava/AbstractSyntaxTrees/CallExpr.java new file mode 100644 index 0000000..1e17bbb --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/CallExpr.java @@ -0,0 +1,24 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/CallStmt.java b/miniJava/src/miniJava/AbstractSyntaxTrees/CallStmt.java new file mode 100644 index 0000000..a8aa63e --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/CallStmt.java @@ -0,0 +1,24 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/ClassDecl.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ClassDecl.java new file mode 100644 index 0000000..bd776a8 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ClassDecl.java @@ -0,0 +1,24 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/ClassDeclList.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ClassDeclList.java new file mode 100644 index 0000000..489de35 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ClassDeclList.java @@ -0,0 +1,34 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/ClassType.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ClassType.java new file mode 100644 index 0000000..980d07f --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ClassType.java @@ -0,0 +1,22 @@ +/** + * 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; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/Declaration.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Declaration.java new file mode 100644 index 0000000..2be0aae --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Declaration.java @@ -0,0 +1,20 @@ +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +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 String name; + public Type type; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/Declarators.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Declarators.java new file mode 100644 index 0000000..b42e736 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Declarators.java @@ -0,0 +1,14 @@ +package miniJava.AbstractSyntaxTrees; + +public class Declarators { + + public Declarators(boolean isPrivate, boolean isStatic, Type mt) { + this.isPrivate = isPrivate; + this.isStatic = isStatic; + this.mt = mt; + } + + public boolean isPrivate; + public boolean isStatic; + public Type mt; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/ExprList.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ExprList.java new file mode 100644 index 0000000..1a55c0d --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ExprList.java @@ -0,0 +1,33 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/Expression.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Expression.java new file mode 100644 index 0000000..2c33a62 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Expression.java @@ -0,0 +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); + } + +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/FieldDecl.java b/miniJava/src/miniJava/AbstractSyntaxTrees/FieldDecl.java new file mode 100644 index 0000000..5802447 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/FieldDecl.java @@ -0,0 +1,24 @@ +/** + * 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); + } +} + diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/FieldDeclList.java b/miniJava/src/miniJava/AbstractSyntaxTrees/FieldDeclList.java new file mode 100644 index 0000000..2f6d96c --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/FieldDeclList.java @@ -0,0 +1,34 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/IdRef.java b/miniJava/src/miniJava/AbstractSyntaxTrees/IdRef.java new file mode 100644 index 0000000..bf62d7d --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/IdRef.java @@ -0,0 +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; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/Identifier.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Identifier.java new file mode 100644 index 0000000..ebffefa --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Identifier.java @@ -0,0 +1,20 @@ +/** + * 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); + } + +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/IfStmt.java b/miniJava/src/miniJava/AbstractSyntaxTrees/IfStmt.java new file mode 100644 index 0000000..b22c31f --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/IfStmt.java @@ -0,0 +1,33 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/IndexedRef.java b/miniJava/src/miniJava/AbstractSyntaxTrees/IndexedRef.java new file mode 100644 index 0000000..c226b3f --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/IndexedRef.java @@ -0,0 +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; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/IntLiteral.java b/miniJava/src/miniJava/AbstractSyntaxTrees/IntLiteral.java new file mode 100644 index 0000000..7926b9a --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/IntLiteral.java @@ -0,0 +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); + } +} \ No newline at end of file diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/Literal.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Literal.java new file mode 100644 index 0000000..5c0f5cc --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Literal.java @@ -0,0 +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); + } +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/LiteralExpr.java b/miniJava/src/miniJava/AbstractSyntaxTrees/LiteralExpr.java new file mode 100644 index 0000000..49ab09f --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/LiteralExpr.java @@ -0,0 +1,22 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/LocalDecl.java b/miniJava/src/miniJava/AbstractSyntaxTrees/LocalDecl.java new file mode 100644 index 0000000..ce86df1 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/LocalDecl.java @@ -0,0 +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); + } + +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/MemberDecl.java b/miniJava/src/miniJava/AbstractSyntaxTrees/MemberDecl.java new file mode 100644 index 0000000..6db1e30 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/MemberDecl.java @@ -0,0 +1,26 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/MethodDecl.java b/miniJava/src/miniJava/AbstractSyntaxTrees/MethodDecl.java new file mode 100644 index 0000000..276dfd1 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/MethodDecl.java @@ -0,0 +1,26 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/MethodDeclList.java b/miniJava/src/miniJava/AbstractSyntaxTrees/MethodDeclList.java new file mode 100644 index 0000000..f9b98a9 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/MethodDeclList.java @@ -0,0 +1,34 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/NewArrayExpr.java b/miniJava/src/miniJava/AbstractSyntaxTrees/NewArrayExpr.java new file mode 100644 index 0000000..4d16a72 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/NewArrayExpr.java @@ -0,0 +1,24 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/NewExpr.java b/miniJava/src/miniJava/AbstractSyntaxTrees/NewExpr.java new file mode 100644 index 0000000..6e7876a --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/NewExpr.java @@ -0,0 +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); + } +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/NewObjectExpr.java b/miniJava/src/miniJava/AbstractSyntaxTrees/NewObjectExpr.java new file mode 100644 index 0000000..1f8b134 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/NewObjectExpr.java @@ -0,0 +1,22 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/Operator.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Operator.java new file mode 100644 index 0000000..88e291d --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Operator.java @@ -0,0 +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); + } + + public R visit(Visitor v, A o) { + return v.visitOperator(this, o); + } + + public Token token; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/Package.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Package.java new file mode 100644 index 0000000..dc29d7d --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Package.java @@ -0,0 +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; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/ParameterDecl.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ParameterDecl.java new file mode 100644 index 0000000..1bbee69 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ParameterDecl.java @@ -0,0 +1,20 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/ParameterDeclList.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ParameterDeclList.java new file mode 100644 index 0000000..64ae1cc --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ParameterDeclList.java @@ -0,0 +1,33 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/QualifiedRef.java b/miniJava/src/miniJava/AbstractSyntaxTrees/QualifiedRef.java new file mode 100644 index 0000000..3659a45 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/QualifiedRef.java @@ -0,0 +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; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/RefExpr.java b/miniJava/src/miniJava/AbstractSyntaxTrees/RefExpr.java new file mode 100644 index 0000000..48917dc --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/RefExpr.java @@ -0,0 +1,22 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/Reference.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Reference.java new file mode 100644 index 0000000..7ba8450 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Reference.java @@ -0,0 +1,16 @@ +/** + * miniJava Abstract Syntax Tree classes + * @author prins + * @version COMP 520 (v2.2) + */ +package miniJava.AbstractSyntaxTrees; + +import miniJava.SyntacticAnalyzer.SourcePosition; + +public abstract class Reference extends AST +{ + public Reference(SourcePosition posn){ + super(posn); + } + +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/Statement.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Statement.java new file mode 100644 index 0000000..4fa1af9 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Statement.java @@ -0,0 +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); + } + +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/StatementList.java b/miniJava/src/miniJava/AbstractSyntaxTrees/StatementList.java new file mode 100644 index 0000000..2b21f76 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/StatementList.java @@ -0,0 +1,33 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/Terminal.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Terminal.java new file mode 100644 index 0000000..5b3f7e6 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Terminal.java @@ -0,0 +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; +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/ThisRef.java b/miniJava/src/miniJava/AbstractSyntaxTrees/ThisRef.java new file mode 100644 index 0000000..3beab4e --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/ThisRef.java @@ -0,0 +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); + } + +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/Type.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Type.java new file mode 100644 index 0000000..cbcaa10 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Type.java @@ -0,0 +1,21 @@ +/** + * 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; + +} + + \ No newline at end of file diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/TypeKind.java b/miniJava/src/miniJava/AbstractSyntaxTrees/TypeKind.java new file mode 100644 index 0000000..b6bd818 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/TypeKind.java @@ -0,0 +1,16 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/UnaryExpr.java b/miniJava/src/miniJava/AbstractSyntaxTrees/UnaryExpr.java new file mode 100644 index 0000000..6bff8ce --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/UnaryExpr.java @@ -0,0 +1,24 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/VarDecl.java b/miniJava/src/miniJava/AbstractSyntaxTrees/VarDecl.java new file mode 100644 index 0000000..3fe19a8 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/VarDecl.java @@ -0,0 +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); + } +} diff --git a/miniJava/src/miniJava/AbstractSyntaxTrees/VarDeclStmt.java b/miniJava/src/miniJava/AbstractSyntaxTrees/VarDeclStmt.java new file mode 100644 index 0000000..b960b2e --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/VarDeclStmt.java @@ -0,0 +1,24 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/Visitor.java b/miniJava/src/miniJava/AbstractSyntaxTrees/Visitor.java new file mode 100644 index 0000000..74506e0 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/Visitor.java @@ -0,0 +1,57 @@ +/** + * 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/miniJava/src/miniJava/AbstractSyntaxTrees/WhileStmt.java b/miniJava/src/miniJava/AbstractSyntaxTrees/WhileStmt.java new file mode 100644 index 0000000..d76ac87 --- /dev/null +++ b/miniJava/src/miniJava/AbstractSyntaxTrees/WhileStmt.java @@ -0,0 +1,24 @@ +/** + * 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/miniJava/src/miniJava/Compiler.java b/miniJava/src/miniJava/Compiler.java index 40fe744..c850c20 100644 --- a/miniJava/src/miniJava/Compiler.java +++ b/miniJava/src/miniJava/Compiler.java @@ -1,7 +1,10 @@ package miniJava; import java.io.*; + import miniJava.SyntacticAnalyzer.*; +import miniJava.AbstractSyntaxTrees.*; +import miniJava.AbstractSyntaxTrees.Package; public class Compiler { @@ -16,18 +19,19 @@ public class Compiler { try(FileReader input = new FileReader(args[0])) { + // Setup Scanner scanner = new Scanner(new BufferedReader(input)); Parser parser = new Parser(scanner); - parser.parse(); + Package p = parser.parse(); - System.out.println("Works"); + // Display + ASTDisplay display = new ASTDisplay(); + display.showTree(p); System.exit(0); } catch(FileNotFoundException e) { - System.out.println("Not Found"); System.exit(rc); } catch(IOException e) { - System.out.println("Not Works"); System.exit(rc); } } diff --git a/miniJava/src/miniJava/SyntacticAnalyzer/Parser.java b/miniJava/src/miniJava/SyntacticAnalyzer/Parser.java index 068cf4b..6930c9a 100644 --- a/miniJava/src/miniJava/SyntacticAnalyzer/Parser.java +++ b/miniJava/src/miniJava/SyntacticAnalyzer/Parser.java @@ -2,6 +2,8 @@ package miniJava.SyntacticAnalyzer; import java.io.*; import java.util.LinkedList; +import miniJava.AbstractSyntaxTrees.*; +import miniJava.AbstractSyntaxTrees.Package; public class Parser { @@ -13,191 +15,271 @@ public class Parser { this.stream = new LinkedList(); } - /** * Program ::= (ClassDeclaration)* eot + * @return * @throws IOException */ - public void parse() throws IOException { - while(peek(1).type == Token.TYPE.CLASS) parseClassDeclaration(); + public Package parse() throws IOException { + ClassDeclList decls = new ClassDeclList(); + while(peek(1).type == Token.TYPE.CLASS) { + decls.add(parseClassDeclaration()); + } + accept(Token.TYPE.EOT); + return new Package(decls, null); } - /** * ClassDeclaration ::= * class id { * (Declarators id (; | MethodDeclaration))* * } + * @return * @throws IOException */ - private void parseClassDeclaration() throws IOException { + private ClassDecl parseClassDeclaration() throws IOException { // Class Header accept(Token.TYPE.CLASS); - accept(Token.TYPE.ID); + String cn = accept(Token.TYPE.ID).spelling; accept(Token.TYPE.LBRACKET); + // Setup + FieldDeclList fdl = new FieldDeclList(); + MethodDeclList mdl = new MethodDeclList(); + // Class Body while(peek(1).type != Token.TYPE.RBRACKET) { - parseDeclarators(); - accept(Token.TYPE.ID); - if(peek(1).type == Token.TYPE.SEMICOLON) accept(Token.TYPE.SEMICOLON); - else parseMethodDeclaration(); + Declarators d = parseDeclarators(); + String name = accept(Token.TYPE.ID).spelling; + FieldDecl f = new FieldDecl(d.isPrivate, d.isStatic, d.mt, name, null); + + // Field Declarations + if(peek(1).type == Token.TYPE.SEMICOLON) { + accept(Token.TYPE.SEMICOLON); + fdl.add(f); + } + + // Method Declarations + else mdl.add(parseMethodDeclaration(f)); } - accept(Token.TYPE.RBRACKET); + accept(Token.TYPE.RBRACKET); + return new ClassDecl(cn, fdl, mdl, null); } + /** + * Declarators ::= (public | private)? static? Type + * @return + * @throws IOException + */ + private Declarators parseDeclarators() throws IOException { + + // Visibility + boolean isPrivate = false; + if(peek(1).type == Token.TYPE.PUBLIC) { + accept(Token.TYPE.PUBLIC); + } else if(peek(1).type == Token.TYPE.PRIVATE) { + isPrivate = true; + accept(Token.TYPE.PRIVATE); + } + + // Class Methods + boolean isStatic = false; + if(peek(1).type == Token.TYPE.STATIC) { + isStatic = true; + accept(Token.TYPE.STATIC); + } + + Type t = parseType(); + return new Declarators(isPrivate, isStatic, t); + } /** - * MethodDeclaration ::= + * * MethodDeclaration ::= * (ParameterList?) { * Statement* (return Expression ;)? * } + * @param f describes the declaratory aspect of the method + * @return * @throws IOException */ - private void parseMethodDeclaration() throws IOException { - + private MethodDecl parseMethodDeclaration(FieldDecl f) throws IOException { + // Method Header accept(Token.TYPE.LPAREN); - if(peek(1).type != Token.TYPE.RPAREN) parseParameterList(); + + // Parameter List + ParameterDeclList pdl = new ParameterDeclList(); + 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(); while(peek(1).type != Token.TYPE.RBRACKET) { if(peek(1).type == Token.TYPE.RETURN) { accept(Token.TYPE.RETURN); - parseExpression(); + re = parseExpression(); accept(Token.TYPE.SEMICOLON); break; } - parseStatement(); + stl.add(parseStatement()); } accept(Token.TYPE.RBRACKET); + return new MethodDecl(f, pdl, stl, re, null); } - - /** - * Declarators ::= (public | private)? static? Type - * @throws IOException - */ - private void parseDeclarators() throws IOException { - - if(peek(1).type == Token.TYPE.PUBLIC) accept(Token.TYPE.PUBLIC); - else if(peek(1).type == Token.TYPE.PRIVATE) accept(Token.TYPE.PRIVATE); - - if(peek(1).type == Token.TYPE.STATIC) accept(Token.TYPE.STATIC); - parseType(); - } - - /** * Type ::= boolean | void | int ([])? | id ([])? + * @return * @throws IOException */ - private void parseType() throws IOException { + private Type parseType() throws IOException { - Token.TYPE type = peek(1).type; - - switch(type) { + switch(peek(1).type) { case BOOLEAN: - case VOID: - accept(type); - break; + accept(Token.TYPE.BOOLEAN); + return new BaseType(TypeKind.BOOLEAN, null); + + case VOID: + accept(Token.TYPE.VOID); + return new BaseType(TypeKind.VOID, null); + + case INT: { + accept(Token.TYPE.INT); + BaseType b = new BaseType(TypeKind.INT, null); - case INT: - case ID: - accept(type); if(peek(1).type == Token.TYPE.LSQUARE) { accept(Token.TYPE.LSQUARE); accept(Token.TYPE.RSQUARE); + return new ArrayType(b, null); } - break; + + return b; + } + + case ID: { + String cn = accept(peek(1).type).spelling; + Identifier i = new Identifier(cn, null); + ClassType c = new ClassType(i, null); + + if(peek(1).type == Token.TYPE.LSQUARE) { + accept(Token.TYPE.LSQUARE); + accept(Token.TYPE.RSQUARE); + return new ArrayType(c, null); + } + + return c; + } default: throw new IOException(); } } - /** * ParameterList ::= Type id (, Type id)* + * @return * @throws IOException */ - private void parseParameterList() throws IOException { - parseType(); - accept(Token.TYPE.ID); + private ParameterDeclList parseParameterList() throws IOException { + + ParameterDeclList decls = new ParameterDeclList(); + + // First Parameter + Type t = parseType(); + String name = accept(Token.TYPE.ID).spelling; + decls.add(new ParameterDecl(t, name, null)); + + // Remainder of List while(peek(1).type == Token.TYPE.COMMA) { accept(Token.TYPE.COMMA); - parseType(); - accept(Token.TYPE.ID); + t = parseType(); + name = accept(Token.TYPE.ID).spelling; + decls.add(new ParameterDecl(t, name, null)); } + + return decls; } - /** * ArgumentList ::= Expression (, Expression)* + * @return * @throws IOException */ - private void parseArgumentList() throws IOException { - parseExpression(); + private ExprList parseArgumentList() throws IOException { + ExprList e = new ExprList(); + e.add(parseExpression()); while(peek(1).type == Token.TYPE.COMMA) { accept(Token.TYPE.COMMA); - parseExpression(); + e.add(parseExpression()); } + + return e; } - /** * Reference ::= BaseRef (. BaseRef)* + * @return * @throws IOException */ - private void parseReference() throws IOException { - parseBaseRef(); + private Reference parseReference() throws IOException { + Reference r = parseBaseRef(); while(peek(1).type == Token.TYPE.PERIOD) { accept(Token.TYPE.PERIOD); - accept(Token.TYPE.ID); + String name = accept(Token.TYPE.ID).spelling; + Identifier id = new Identifier(name, null); + r = new QualifiedRef(r, id, null); + if(peek(1).type == Token.TYPE.LSQUARE) { accept(Token.TYPE.LSQUARE); - parseExpression(); + Expression e = parseExpression(); accept(Token.TYPE.RSQUARE); + r = new IndexedRef(r, e, null); + } + } + + return r; + } + + /** + * BaseRef ::= this | id ([ Expression])? + * @return + * @throws IOException + */ + private Reference parseBaseRef() throws IOException { + + switch(peek(1).type) { + case THIS: + accept(Token.TYPE.THIS); + return new ThisRef(null); + + // id ([ Expression])? + default: { + String id = accept(Token.TYPE.ID).spelling; + Identifier i = new Identifier(id, null); + IdRef r = new IdRef(i, null); + + if(peek(1).type == Token.TYPE.LSQUARE) { + accept(Token.TYPE.LSQUARE); + Expression e = parseExpression(); + accept(Token.TYPE.RSQUARE); + return new IndexedRef(r, e, null); + } + + return r; } } } - - /** - * BaseRef ::= this | id ([ Expression])? - * @throws IOException - */ - private void parseBaseRef() throws IOException { - - switch(peek(1).type) { - - // this - case THIS: - accept(Token.TYPE.THIS); - break; - - // id ([ Expression])? - default: - accept(Token.TYPE.ID); - if(peek(1).type == Token.TYPE.LSQUARE) { - accept(Token.TYPE.LSQUARE); - parseExpression(); - accept(Token.TYPE.RSQUARE); - } - break; - } - } - - /** * Statement ::= * {Statement*} @@ -206,82 +288,100 @@ public class Parser { * | Reference ( ArgumentList? ); * | if (Expression) Statement (else Statement)? * | while (Expression) Statement + * @return * @throws IOException */ - private void parseStatement() throws IOException { + private Statement parseStatement() throws IOException { switch(peek(1).type) { // { Statement* } - case LBRACKET: + case LBRACKET: { accept(Token.TYPE.LBRACKET); + StatementList stl = new StatementList(); while(peek(1).type != Token.TYPE.RBRACKET) { - parseStatement(); + stl.add(parseStatement()); } accept(Token.TYPE.RBRACKET); - break; + + return new BlockStmt(stl, null); + } // if (Expression) Statement (else Statement)? - case IF: + case IF: { accept(Token.TYPE.IF); accept(Token.TYPE.LPAREN); - parseExpression(); + Expression e = parseExpression(); accept(Token.TYPE.RPAREN); - parseStatement(); + Statement s1 = parseStatement(); if(peek(1).type == Token.TYPE.ELSE) { accept(Token.TYPE.ELSE); - parseStatement(); + Statement s2 = parseStatement(); + return new IfStmt(e, s1, s2, null); } - break; + + return new IfStmt(e, s1, null); + } // while (Expression) Statement - case WHILE: + case WHILE: { accept(Token.TYPE.WHILE); accept(Token.TYPE.LPAREN); - parseExpression(); + Expression e = parseExpression(); accept(Token.TYPE.RPAREN); - parseStatement(); - break; + Statement s = parseStatement(); + + return new WhileStmt(e, s, null); + } // Type id = Expression ; - case BOOLEAN: - case VOID: - case INT: - case ID: + 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 + 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)) { - parseType(); - accept(Token.TYPE.ID); + Type t = parseType(); + String name = accept(Token.TYPE.ID).spelling; + VarDecl v = new VarDecl(t, name, null); + accept(Token.TYPE.EQUALS); - parseExpression(); + Expression e = parseExpression(); accept(Token.TYPE.SEMICOLON); - break; + + return new VarDeclStmt(v, e, null); } /* Fall Through */ + } + + default: { + Statement s = null; + Reference r = parseReference(); - // Reference = Expression ; | Reference ( ArgumentList? ) ; - default: - 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) parseArgumentList(); + if(peek(1).type != Token.TYPE.RPAREN) { + e = parseArgumentList(); + } accept(Token.TYPE.RPAREN); - } else { + s = new CallStmt(r, e, null); + } + + // Reference = Expression ; + else { accept(Token.TYPE.EQUALS); - parseExpression(); + Expression e = parseExpression(); + s = new AssignStmt(r, e, null); } accept(Token.TYPE.SEMICOLON); - break; - } + return s; + } + } } - /** * Expression ::= * Reference @@ -291,92 +391,198 @@ public class Parser { * | ( Expression ) * | num | true | false * | new (id() | int [ Expression ] | id [ Expression ] ) + * @return * @throws IOException */ - private void parseExpression() throws IOException { + private Expression parseExpression() throws IOException { + Expression e = null; switch(peek(1).type) { - // num | true | false - case NUM: - case TRUE: - case FALSE: - accept(peek(1).type); + // num + case NUM: { + String number = accept(Token.TYPE.NUM).spelling; + IntLiteral i = new IntLiteral(number, null); + e = new LiteralExpr(i, null); break; + } + + // true | false + case TRUE: + case FALSE: { + String bool = accept(peek(1).type).spelling; + BooleanLiteral b = new BooleanLiteral(bool, null); + e = new LiteralExpr(b, null); + break; + } // ( Expression ) - case LPAREN: + case LPAREN: { accept(Token.TYPE.LPAREN); - parseExpression(); + e = parseExpression(); accept(Token.TYPE.RPAREN); break; + } // unop Expression case UNOP: - accept(Token.TYPE.UNOP); - parseExpression(); - break; - - // Must be a minus sign - case BINOP: - if(peek(1).attr.equals("-")) { - accept(Token.TYPE.BINOP); - parseExpression(); - } + case BINOP: { + if(peek(1).spelling.equals("!") || peek(1).spelling.equals("-")) { + Operator o = new Operator(accept(peek(1).type), null); + e = new UnaryExpr(o, parseExpression(), null); + } else throw new IOException(); break; + } // new ( int [ Expression ] | id ( ) | id [ Expression ] ) - case NEW: + case NEW: { accept(Token.TYPE.NEW); if(peek(1).type == Token.TYPE.INT) { accept(Token.TYPE.INT); accept(Token.TYPE.LSQUARE); - parseExpression(); + Expression e2 = parseExpression(); accept(Token.TYPE.RSQUARE); + + BaseType b = new BaseType(TypeKind.INT, null); + e = new NewArrayExpr(b, e2, null); } else { - accept(Token.TYPE.ID); + String cn = accept(Token.TYPE.ID).spelling; + Identifier i = new Identifier(cn, null); + ClassType c = new ClassType(i, null); if(peek(1).type == Token.TYPE.LPAREN){ accept(Token.TYPE.LPAREN); accept(Token.TYPE.RPAREN); - } - - else { + e = new NewObjectExpr(c, null); + } else { accept(Token.TYPE.LSQUARE); - parseExpression(); + Expression e2 = parseExpression(); accept(Token.TYPE.RSQUARE); + e = new NewArrayExpr(c, e2, null); } } break; + } - // Reference | Reference (ArgumentList?) - case THIS: - case ID: - parseReference(); + // Reference ((ArgumentList?))? + case THIS: case ID: { + Reference r = parseReference(); if(peek(1).type == Token.TYPE.LPAREN) { accept(Token.TYPE.LPAREN); - if(peek(1).type != Token.TYPE.RPAREN) parseArgumentList(); + ExprList el = new ExprList(); + if(peek(1).type != Token.TYPE.RPAREN) { + el = parseArgumentList(); + } accept(Token.TYPE.RPAREN); + e = new CallExpr(r, el, null); + } else { + e = new RefExpr(r, null); } - break; - // Expression binop Expression - default: - accept(Token.TYPE.BINOP); - parseExpression(); break; + } + + default: + throw new IOException(); } // Expression binop Expression if(peek(1).type == Token.TYPE.BINOP) { - accept(Token.TYPE.BINOP); - parseExpression(); + Operator o = new Operator(accept(Token.TYPE.BINOP), null); + e = new BinaryExpr(o, e, parseDExpression(), null); } + + return e; + } + + /** + * Disjunction + * @throws IOException + */ + private Expression parseDExpression() throws IOException { + Expression e = parseCExpression(); + while(peek(1).spelling.equals("||")) { + Operator o = new Operator(accept(Token.TYPE.BINOP), null); + e = new BinaryExpr(o, e, parseCExpression(), null); + } + + return e; + } + + /** + * Conjunction + * @throws IOException + */ + private Expression parseCExpression() throws IOException { + Expression e = parseEExpression(); + while(peek(1).spelling.equals("&&")) { + Operator o = new Operator(accept(Token.TYPE.BINOP), null); + e = new BinaryExpr(o, e, parseEExpression(), null); + } + + return e; + } + + /** + * Equality + * @throws IOException + */ + private Expression parseEExpression() throws IOException { + Expression e = parseRExpression(); + while(peek(1).spelling.equals("==") || peek(1).spelling.equals("!=")) { + Operator o = new Operator(accept(Token.TYPE.BINOP), null); + e = new BinaryExpr(o, e, parseRExpression(), null); + } + + return e; + } + + /** + * Relational + * @throws IOException + */ + 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(">")) { + Operator o = new Operator(accept(Token.TYPE.BINOP), null); + e = new BinaryExpr(o, e, parseAExpression(), null); + } + + return e; + } + + /** + * Additive + * @throws IOException + */ + private Expression parseAExpression() throws IOException { + Expression e = parseMExpression(); + while(peek(1).spelling.equals("+") || peek(1).spelling.equals("-")) { + Operator o = new Operator(accept(Token.TYPE.BINOP), null); + e = new BinaryExpr(o, e, parseMExpression(), null); + } + + return e; + } + + /** + * Multiplicative + * @throws IOException + */ + private Expression parseMExpression() throws IOException { + Expression e = parseExpression(); + while(peek(1).spelling.equals("*") || peek(1).spelling.equals("/")) { + Operator o = new Operator(accept(Token.TYPE.BINOP), null); + e = new BinaryExpr(o, e, parseExpression(), null); + } + + return e; } @@ -401,9 +607,11 @@ public class Parser { * Consumes token or throws exception. * @throws IOException */ - private void accept(Token.TYPE type) throws IOException { + private Token accept(Token.TYPE type) throws IOException { Token next = peek(1); if(next.type == type) stream.poll(); else throw new IOException(); + + return next; } } diff --git a/miniJava/src/miniJava/SyntacticAnalyzer/Scanner.java b/miniJava/src/miniJava/SyntacticAnalyzer/Scanner.java index 49cb14d..98a6cb2 100644 --- a/miniJava/src/miniJava/SyntacticAnalyzer/Scanner.java +++ b/miniJava/src/miniJava/SyntacticAnalyzer/Scanner.java @@ -153,7 +153,7 @@ public class Scanner { break; } } - System.out.println(token.type); + return token; } diff --git a/miniJava/src/miniJava/SyntacticAnalyzer/SourcePosition.java b/miniJava/src/miniJava/SyntacticAnalyzer/SourcePosition.java new file mode 100644 index 0000000..38ddb6c --- /dev/null +++ b/miniJava/src/miniJava/SyntacticAnalyzer/SourcePosition.java @@ -0,0 +1,12 @@ +package miniJava.SyntacticAnalyzer; + +public class SourcePosition { + + public final int col; + public final int line; + + public SourcePosition(int line, int col) { + this.col = col; + this.line = line; + } +} diff --git a/miniJava/src/miniJava/SyntacticAnalyzer/Token.java b/miniJava/src/miniJava/SyntacticAnalyzer/Token.java index f2593b2..7c78681 100644 --- a/miniJava/src/miniJava/SyntacticAnalyzer/Token.java +++ b/miniJava/src/miniJava/SyntacticAnalyzer/Token.java @@ -69,10 +69,10 @@ public class Token { } public final TYPE type; - public final String attr; + public final String spelling; - public Token(String attr, TYPE type) { + public Token(String spelling, TYPE type) { this.type = type; - this.attr = attr; + this.spelling = spelling; } } diff --git a/miniJava/src/miniJava/SyntacticAnalyzer/grammar.txt b/miniJava/src/miniJava/grammar.txt similarity index 89% rename from miniJava/src/miniJava/SyntacticAnalyzer/grammar.txt rename to miniJava/src/miniJava/grammar.txt index 0cf2bc3..b0947d8 100644 --- a/miniJava/src/miniJava/SyntacticAnalyzer/grammar.txt +++ b/miniJava/src/miniJava/grammar.txt @@ -31,10 +31,10 @@ Statement ::= | while (Expression) Statement Expression ::= - Reference - | Reference ( ArgumentList? ) + Reference ((ArgumentList?))? | unop Expression | Expression binop Expression | ( Expression ) | num | true | false - | new (id() | int [ Expression ] | id [ Expression ] ) \ No newline at end of file + | new (id() | int [ Expression ] | id [ Expression ] ) + \ No newline at end of file diff --git a/miniJava/src/miniJava/stratified.txt b/miniJava/src/miniJava/stratified.txt new file mode 100644 index 0000000..fd62abf --- /dev/null +++ b/miniJava/src/miniJava/stratified.txt @@ -0,0 +1,50 @@ +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)* + + + + + \ No newline at end of file diff --git a/miniJava/test.java b/miniJava/test.java index eb38ef4..b4ffe40 100644 --- a/miniJava/test.java +++ b/miniJava/test.java @@ -1,7 +1,12 @@ -// PA1 parse assign fail -class Test { +// Simple PA2 Example +class PA2 { - void p(int a) { - that.this = 4; - } + public boolean c; + + public static void main(String[] args) { + if(x > 1) + x = 1 + 2 * x; + else + b[3].a = 4; + } } \ No newline at end of file