예제 #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;
  }