Пример #1
0
  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;
  }
Пример #2
0
  @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;
  }