package synthesijer; import java.io.PrintWriter; import synthesijer.ast.Expr; import synthesijer.ast.Method; import synthesijer.ast.Module; import synthesijer.ast.Statement; import synthesijer.ast.SynthesijerAstTypeVisitor; import synthesijer.ast.SynthesijerAstVisitor; import synthesijer.ast.expr.ArrayAccess; import synthesijer.ast.expr.AssignExpr; import synthesijer.ast.expr.AssignOp; import synthesijer.ast.expr.BinaryExpr; import synthesijer.ast.expr.CondExpr; import synthesijer.ast.expr.FieldAccess; import synthesijer.ast.expr.Ident; import synthesijer.ast.expr.Literal; import synthesijer.ast.expr.MethodInvocation; import synthesijer.ast.expr.NewArray; import synthesijer.ast.expr.NewClassExpr; import synthesijer.ast.expr.ParenExpr; import synthesijer.ast.expr.SynthesijerExprVisitor; import synthesijer.ast.expr.TypeCast; import synthesijer.ast.expr.UnaryExpr; import synthesijer.ast.statement.BlockStatement; import synthesijer.ast.statement.BreakStatement; import synthesijer.ast.statement.ContinueStatement; import synthesijer.ast.statement.DoWhileStatement; import synthesijer.ast.statement.ExprStatement; import synthesijer.ast.statement.ForStatement; import synthesijer.ast.statement.IfStatement; import synthesijer.ast.statement.ReturnStatement; import synthesijer.ast.statement.SkipStatement; import synthesijer.ast.statement.SwitchStatement; import synthesijer.ast.statement.SynchronizedBlock; import synthesijer.ast.statement.TryStatement; import synthesijer.ast.statement.VariableDecl; import synthesijer.ast.statement.WhileStatement; import synthesijer.ast.type.ArrayRef; import synthesijer.ast.type.ArrayType; import synthesijer.ast.type.ChannelType; import synthesijer.ast.type.ComponentRef; import synthesijer.ast.type.ComponentType; import synthesijer.ast.type.MultipleType; import synthesijer.ast.type.MySelfType; import synthesijer.ast.type.PrimitiveTypeKind; /** * A visitor class to dump module hierarchy of AST as XML. * * @author miyo * */ public class DumpAsXMLVisitor implements SynthesijerAstVisitor, SynthesijerExprVisitor, SynthesijerAstTypeVisitor{ private final PrintWriter dest; public DumpAsXMLVisitor(PrintWriter dest){ this.dest = dest; } @Override public void visitModule(Module o){ dest.printf("<module name=\"%s\">\n", o.getName()); dest.println("<variables>"); for(VariableDecl v: o.getVariableDecls()){ v.accept(this); } dest.println("</variables>"); dest.println("<methods>"); for(Method m: o.getMethods()){ m.accept(this); } dest.println("</methods>"); dest.printf("</module>\n"); } @Override public void visitMethod(Method o) { String options = ""; options += " unsynthesizableFlag=\"%b\""; options += " autoFlag=\"%b\""; options += " synchronizedFlag=\"%b\""; options += " privateFlag=\"%b\""; options += " rawFlag=\"%b\""; options += " combinationFlag=\"%b\""; options += " parallelFlag=\"%b\""; options += " noWaitFlag=\"%b\""; options += " constructorFlag=\"%b\""; dest.printf("<method name=\"%s\"" + options + ">\n", SynthesijerUtils.escapeXML(o.getName()), o.isUnsynthesizable(), o.isAuto(), o.isSynchronized(), o.isPrivate(), o.isRaw(), o.isCombination(), o.isParallel(), o.isNoWait(), o.isConstructor()); o.getType().accept(this); o.getBody().accept(this); dest.printf("</method>\n"); } @Override public void visitArrayAccess(ArrayAccess o) { dest.printf("<expr kind=\"%s\">", "ArrayAccess"); dest.printf("<indexed>"); o.getIndexed().accept(this); dest.printf("</indexed>"); dest.printf("<index>"); o.getIndex().accept(this); dest.printf("</index>"); dest.printf("</expr>", "ArrayAccess"); } @Override public void visitAssignExpr(AssignExpr o) { dest.printf("<expr kind=\"%s\">", "AssignExpr"); dest.printf("<lhs>"); o.getLhs().accept(this); dest.printf("</lhs>"); dest.printf("<rhs>"); o.getRhs().accept(this); dest.printf("</rhs>"); dest.printf("</expr>\n"); } @Override public void visitAssignOp(AssignOp o) { dest.printf("<expr kind=\"%s\" op=\"%s\">", "AssignOp", SynthesijerUtils.escapeXML(o.getOp().toString())); dest.printf("<lhs>"); o.getLhs().accept(this); dest.printf("</lhs>"); dest.printf("<rhs>"); o.getRhs().accept(this); dest.printf("</rhs>"); dest.printf("</expr>", "AssignOp"); } @Override public void visitBinaryExpr(BinaryExpr o) { dest.printf("<expr kind=\"%s\" op=\"%s\">", "BinaryExpr", o.getOp().toString()); dest.printf("<lhs>\n"); o.getLhs().accept(this); dest.printf("</lhs>\n"); dest.printf("<rhs>\n"); o.getRhs().accept(this); dest.printf("</rhs>\n"); dest.printf("</expr>\n"); } @Override public void visitFieldAccess(FieldAccess o) { dest.printf("<expr kind=\"%s\" ident=\"%s\">", "FieldAccess", o.getIdent().getSymbol()); o.getSelected().accept(this); dest.printf("</expr>"); } @Override public void visitIdent(Ident o) { dest.printf("<expr kind=\"%s\" value=\"%s\"/>", "Ident", o.getSymbol()); } @Override public void visitLitral(Literal o) { dest.printf("<expr kind=\"%s\" ", "Literal"); dest.printf("value=\"%s\" type=\"%s\"", o.getValueAsStr(), o.getType()); dest.printf("/>"); } @Override public void visitMethodInvocation(MethodInvocation o) { dest.printf("<expr kind=\"%s\">", "MethodInvocation"); dest.printf("<method name=\"%s\">", o.getMethodName()); Expr method = o.getMethod(); if(method instanceof FieldAccess){ method.accept(this); } dest.printf("</method>\n"); dest.printf("<params>\n"); for(Expr expr: o.getParameters()){ expr.accept(this); } dest.printf("</params>\n"); dest.printf("</expr>"); } @Override public void visitNewArray(NewArray o) { dest.printf("<expr kind=\"%s\">", "NewArray"); dest.printf("<dimension>"); for(Expr expr: o.getDimExpr()){ expr.accept(this); } dest.printf("</dimension>"); dest.println("</expr>"); } @Override public void visitNewClassExpr(NewClassExpr o) { dest.printf("<expr kind=\"%s\" class=\"%s\">", "NewClass", o.getClassName()); dest.printf("<params>"); for(Expr expr: o.getParameters()){ expr.accept(this); } dest.printf("</params>"); dest.printf("</expr>"); } @Override public void visitParenExpr(ParenExpr o) { dest.printf("<expr kind=\"%s\">", "ParenExpr"); o.getExpr().accept(this); dest.printf("</expr>"); } @Override public void visitTypeCast(TypeCast o) { dest.printf("<expr kind=\"%s\">", "TypeCast"); o.getExpr().accept(this); dest.printf("</expr>", "TypeCast"); } @Override public void visitUnaryExpr(UnaryExpr o) { dest.printf("<expr kind=\"%s\" op=\"%s\">", "UnaryExpr", o.getOp()); dest.printf("<arg>\n"); o.getArg().accept(this); dest.printf("</arg>\n"); dest.printf("</expr>\n"); } @Override public void visitCondExpr(CondExpr o){ dest.printf("<type kind=\"select\">\n"); dest.printf("<cond>\n"); o.getCond().accept(this); dest.printf("</cond>\n"); dest.printf("<true>\n"); o.getTruePart().accept(this); dest.printf("</true>\n"); dest.printf("<false>\n"); o.getFalsePart().accept(this); dest.printf("</false>\n"); dest.printf("</type>\n"); } @Override public void visitBlockStatement(BlockStatement o) { dest.printf("<statement type=\"block\">\n"); for(Statement s: o.getStatements()){ s.accept(this); } dest.printf("</statement>\n"); } @Override public void visitBreakStatement(BreakStatement o) { dest.printf("<statement type=\"break\"/>\n"); } @Override public void visitContinueStatement(ContinueStatement o) { dest.printf("<statement type=\"continue\"/>\n"); } @Override public void visitExprStatement(ExprStatement o) { dest.printf("<statement type=\"expr\">\n"); o.getExpr().accept(this); dest.printf("</statement>\n"); } @Override public void visitForStatement(ForStatement o) { dest.printf("<statement type=\"for\">\n"); dest.printf("<init>\n"); for (Statement s : o.getInitializations()){ s.accept(this); } dest.printf("</init>\n"); dest.printf("<condition>\n"); o.getCondition().accept(this); dest.printf("</condition>"); dest.printf("<update>\n"); for (Statement s : o.getUpdates()) s.accept(this); dest.printf("</update>"); dest.printf("<body>\n"); o.getBody().accept(this); dest.printf("</body>\n"); dest.printf("</statement>\n"); } @Override public void visitIfStatement(IfStatement o) { dest.printf("<statement type=\"if\">\n"); dest.printf("<condition>\n"); o.getCondition().accept(this); dest.printf("</condition>\n"); dest.printf("<then>\n"); o.getThenPart().accept(this); dest.printf("</then>\n"); if(o.getElsePart() != null){ dest.printf("<else>\n"); o.getElsePart().accept(this); dest.printf("</else>\n"); } dest.printf("</statement>\n"); } @Override public void visitReturnStatement(ReturnStatement o) { dest.printf("<statement type=\"return\">\n"); if(o.getExpr() != null) o.getExpr().accept(this); dest.printf("</statement>\n"); } @Override public void visitSkipStatement(SkipStatement o) { dest.printf("<statement type=\"skip\"/>\n"); } @Override public void visitSwitchStatement(SwitchStatement o) { dest.printf("<statement type=\"switch\">\n"); dest.printf("<selector>\n"); o.getSelector().accept(this); dest.printf("</selector>\n"); dest.printf("<elements>\n"); for(SwitchStatement.Elem elem: o.getElements()){ elem.accept(this); } dest.printf("</elements>\n"); dest.printf("</statement>\n"); } public void visitSwitchCaseElement(SwitchStatement.Elem o){ dest.printf("<element>\n"); dest.printf("<pattern>\n"); o.getPattern().accept(this); dest.printf("</pattern>\n"); dest.printf("<statements>\n"); for(Statement s: o.getStatements()) s.accept(this); dest.printf("</statements>\n"); dest.printf("</element>\n"); } @Override public void visitSynchronizedBlock(SynchronizedBlock o) { dest.printf("<statement type=\"synchronized\">\n"); visitBlockStatement(o); dest.printf("</statement>>\n"); } @Override public void visitTryStatement(TryStatement o) { dest.printf("<statement type=\"try\">"); o.getBody().accept(this); dest.printf("</statement>"); } @Override public void visitVariableDecl(VariableDecl o) { dest.printf("<var name=\"%s\">\n", o.getVariable().getName()); o.getVariable().getType().accept(this); if(o.getInitExpr() != null) o.getInitExpr().accept(this); dest.printf("</var>"); } @Override public void visitWhileStatement(WhileStatement o) { dest.printf("<statement type=\"while\">\n"); dest.printf("<condition>\n"); o.getCondition().accept(this); dest.printf("</condition>\n"); dest.printf("<body>\n"); o.getBody().accept(this); dest.printf("</body>\n"); dest.printf("</statement>\n"); } @Override public void visitDoWhileStatement(DoWhileStatement o) { dest.printf("<statement type=\"do-while\">\n"); dest.printf("<condition>\n"); o.getCondition().accept(this); dest.printf("</condition>\n"); dest.printf("<body>\n"); o.getBody().accept(this); dest.printf("</body>\n"); dest.printf("</statement>\n"); } @Override public void visitArrayType(ArrayType o) { dest.printf("<type kind=\"array\">\n"); o.getElemType().accept(this); dest.printf("</type>\n"); } @Override public void visitArrayRef(ArrayRef o){ dest.printf("<type kind=\"array_ref\">\n"); o.getRefType().accept(this); dest.printf("</type>\n"); } @Override public void visitComponentRef(ComponentRef o){ dest.printf("<type kind=\"component_ref\">\n"); o.getRefType().accept(this); dest.printf("</type>\n"); } @Override public void visitComponentType(ComponentType o) { dest.printf("<type kind=\"component\" name=\"%s\"/>\n", o.getName()); } @Override public void visitMySelfType(MySelfType o) { dest.printf("<type kind=\"myself\"/>\n"); } @Override public void visitPrimitiveTypeKind(PrimitiveTypeKind o) { dest.printf("<type kind=\"primitive\" name=\"%s\"/>\n", o.toString()); } @Override public void visitMultipleType(MultipleType o){ dest.printf("<type kind=\"multiple\">\n"); for(int i = 0; i < o.size(); i++){ o.get(i).accept(this); } dest.printf("</type>\n"); } @Override public void visitChannelType(ChannelType o){ dest.printf("<type kind=\"channel\">\n"); o.getElemType().accept(this); dest.printf("</type>\n"); } }