private Expression createExpression(Element element) { String kind = element.getAttribute("kind"); if (kind.equals("Unary")) { UnaryExpression expr = IrFactory.eINSTANCE.createUnaryExpression(); expr.setId(element.getAttribute("id")); doAnnotations(expr, element); expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); expr.setOperator(UtilIR.unmarshall(element.getAttribute("operator"))); expr.setOperand(createExpression(getChild(element, "Expr"))); // expr.setType(createType(getChild(element, "Type"))); return expr; } else if (kind.equals("Binary")) { BinaryExpression expr = IrFactory.eINSTANCE.createBinaryExpression(); expr.setId(element.getAttribute("id")); doAnnotations(expr, element); expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); expr.setOperator(UtilIR.unmarshall(element.getAttribute("operator"))); List<Element> operands = getChildren(element, "Expr"); expr.setOperand1(createExpression(operands.get(0))); expr.setOperand2(createExpression(operands.get(1))); // expr.setType(createType(getChild(element, "Type"))); return expr; } else if (kind.equals("Call")) { FunctionCall expr = IrFactory.eINSTANCE.createFunctionCall(); expr.setId(element.getAttribute("id")); doAnnotations(expr, element); expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); expr.setFunction(createExpression(getChild(element, "Expr"))); List<Element> args = getChildren(getChild(element, "Args"), "Expr"); for (Element arg : args) { expr.getParameters().add(createExpression(arg)); } // expr.setType(createType(getChild(element, "Type"))); return expr; } else if (kind.equals("Construction")) { TypeConstructorCall expr = IrFactory.eINSTANCE.createTypeConstructorCall(); expr.setId(element.getAttribute("id")); doAnnotations(expr, element); expr.setName(element.getAttribute("name")); expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); expr.setTypedef((Declaration) findIrObject(element.getAttribute("typedef-id"))); List<Element> args = getChildren(getChild(element, "Args"), "Expr"); for (Element arg : args) { expr.getParameters().add(createExpression(arg)); } // expr.setType(createType(getChild(element, "Type"))); return expr; } else if (kind.equals("If")) { IfExpression expr = IrFactory.eINSTANCE.createIfExpression(); expr.setId(element.getAttribute("id")); doAnnotations(expr, element); expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); List<Element> exprs = getChildren(element, "Expr"); expr.setCondition(createExpression(exprs.get(0))); expr.setThenExpression(createExpression(exprs.get(1))); expr.setElseExpression(createExpression(exprs.get(2))); // expr.setType(createType(getChild(element, "Type"))); return expr; } else if (kind.equals("Var")) { VariableExpression expr = IrFactory.eINSTANCE.createVariableExpression(); expr.setId(element.getAttribute("id")); doAnnotations(expr, element); Element child = getChild(element, "Type"); if (child != null) { expr.setType(createType(child)); } expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); expr.setVariable((Declaration) findIrObject(element.getAttribute("decl-id"))); Element indices = getChild(element, "Indices"); if (indices != null) { for (Element index : getChildren(indices, "Expr")) { expr.getIndex().add(createExpression(index)); } } Element members = getChild(element, "Members"); if (members != null) { for (Element member : getChildren(members, "Member")) { expr.getMember().add(createMember(member)); } } return expr; } else if (kind.equals("Lambda")) { LambdaExpression expr = IrFactory.eINSTANCE.createLambdaExpression(); String id = element.getAttribute("id"); expr.setId(id); doAnnotations(expr, element); addIrObject(id, expr); expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); expr.setOuter((Scope) findIrObject(element.getAttribute("outer-scope"))); expr.setType(createType(getChild(element, "Type"))); List<Element> declarations = getChildren(element, "Decl"); for (Element e : declarations) { Declaration var = (Declaration) createDeclaration(e); expr.getDeclarations().add(var); if (var instanceof Variable && ((Variable) var).isParameter()) expr.getParameters().add((Variable) var); } expr.setBody(createExpression(getChild(element, "Expr"))); return expr; } else if (kind.equals("Proc")) { ProcExpression expr = IrFactory.eINSTANCE.createProcExpression(); String id = element.getAttribute("id"); expr.setId(id); doAnnotations(expr, element); addIrObject(id, expr); expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); expr.setOuter((Scope) findIrObject(element.getAttribute("outer-scope"))); expr.setType(createType(getChild(element, "Type"))); List<Element> declarations = getChildren(element, "Decl"); for (Element e : declarations) { Declaration var = (Declaration) createDeclaration(e); expr.getDeclarations().add(var); if (var instanceof Variable && ((Variable) var).isParameter()) expr.getParameters().add((Variable) var); } expr.setBody((Block) createStatement(getChild(element, "Stmt"))); return expr; } else if (kind.equals("List")) { ListExpression expr = IrFactory.eINSTANCE.createListExpression(); expr.setId(element.getAttribute("id")); doAnnotations(expr, element); expr.setContext((Scope) findIrObject(element.getAttribute("context-scope"))); List<Element> generators = getChildren(element, "Generator"); for (Element g : generators) { expr.getGenerators().add(createGenerator(g)); } List<Element> exprs = getChildren(element, "Expr"); for (Element e : exprs) { expr.getExpressions().add(createExpression(e)); } // expr.setType(createType(getChild(element, "Type"))); return expr; } else if (kind.equals("literal-integer")) { IntegerLiteral expr = IrFactory.eINSTANCE.createIntegerLiteral(); String value = element.getAttribute("value"); expr.setValue(Long.parseLong(value)); expr.setType(TypeSystem.createTypeInt()); return expr; } else if (kind.equals("literal-float")) { FloatLiteral expr = IrFactory.eINSTANCE.createFloatLiteral(); String value = element.getAttribute("value"); expr.setValue(Double.parseDouble(value)); expr.setType(TypeSystem.createTypeFloat()); return expr; } else if (kind.equals("literal-bool")) { BooleanLiteral expr = IrFactory.eINSTANCE.createBooleanLiteral(); String value = element.getAttribute("value"); expr.setValue(Boolean.parseBoolean(value)); expr.setType(TypeSystem.createTypeBool()); return expr; } else if (kind.equals("literal-string")) { StringLiteral expr = IrFactory.eINSTANCE.createStringLiteral(); String value = element.getAttribute("value"); expr.setValue(value); expr.setType(TypeSystem.createTypeString()); return expr; } assert (false); return null; }
@Override public Stream caseNetwork(Network network) { s = new Stream( folder + File.separator + UtilIR.namespace2Path(network.getType().getNamespace()) + File.separator + network.getType().getName() + ".dot"); java.util.Date date = new java.util.Date(); s.println(); s.println("/* --- CAL Dotty Printer " + new Timestamp(date.getTime()) + " --- */"); s.println("digraph " + network.getType().getName() + "{"); s.inc(); s.println("node [shape=none];"); s.println("rankdir=LR;"); for (ActorInstance instance : network.getActors()) { caseActorInstance(instance); } for (Connection c : network.getConnections()) { doSwitch(c); } /* Network input ports */ List<Port> inputPorts = network.getInputPorts(); if (inputPorts.size() > 0) { s.println("__INs" + " [label=<"); s.println("<TABLE BORDER=\"1\" CELLBORDER=\"0\" CELLSPACING=\"0\">"); s.println("<TR><TD COLSPAN=\"2\">INs</TD></TR>"); s.inc(); for (int i = 0; i < inputPorts.size(); i++) { String in = inputPorts.get(i).getName(); s.println("<TR><TD></TD><TD ALIGN=\"RIGHT\" PORT=\"" + in + "\">" + in + "</TD></TR>"); } s.printlnDec("</TABLE>>];"); } /* Network output ports */ List<Port> outputPorts = network.getOutputPorts(); if (outputPorts.size() > 0) { s.println("__OUTs" + " [label=<"); s.println("<TABLE BORDER=\"1\" CELLBORDER=\"0\" CELLSPACING=\"0\">"); s.printlnInc("<TR><TD COLSPAN=\"2\">OUTs</TD></TR>"); for (int i = 0; i < outputPorts.size(); i++) { String out = outputPorts.get(i).getName(); s.println("<TR><TD ALIGN=\"LEFT\" PORT=\"" + out + "\">" + out + "</TD><TD></TD></TR>"); } s.printlnDec("</TABLE>>];"); } s.println(); s.println(); s.println("}"); return s; }