Example #1
0
  private Statement createStatement(Element element) {
    String kind = element.getAttribute("kind");

    if (kind.equals("Assign")) {
      Assign stmt = IrFactory.eINSTANCE.createAssign();
      doAnnotations(stmt, element);
      stmt.setTarget(createVariableReference(getChild(element, "Var")));
      stmt.setExpression(createExpression(getChild(element, "Expr")));

      return stmt;
    }
    if (kind.equals("Call")) {
      ProcCall stmt = IrFactory.eINSTANCE.createProcCall();
      doAnnotations(stmt, element);
      stmt.setProcedure((Declaration) findIrObject(element.getAttribute("decl-id")));
      List<Element> args = getChildren(getChild(element, "Args"), "Expr");
      for (Element arg : args) {
        stmt.getInParameters().add(createExpression(arg));
      }

      return stmt;
    }
    if (kind.equals("While")) {
      WhileLoop stmt = IrFactory.eINSTANCE.createWhileLoop();
      doAnnotations(stmt, element);
      stmt.setCondition(createExpression(getChild(element, "Expr")));
      stmt.setBody((Block) createStatement(getChild(element, "Stmt")));

      return stmt;
    }
    if (kind.equals("ForEach")) {
      ForEach stmt = IrFactory.eINSTANCE.createForEach();
      doAnnotations(stmt, element);
      List<Element> generators = getChildren(element, "Generator");
      for (Element g : generators) {
        stmt.getGenerators().add(createGenerator(g));
      }
      stmt.setBody((Block) createStatement(getChild(element, "Stmt")));

      return stmt;
    }
    if (kind.equals("If")) {
      IfStatement stmt = IrFactory.eINSTANCE.createIfStatement();
      doAnnotations(stmt, element);
      stmt.setCondition(createExpression(getChild(element, "Expr")));
      List<Element> stmts = getChildren(element, "Stmt");
      stmt.setThenBlock((Block) createStatement(stmts.get(0)));
      if (stmts.size() == 2) {
        stmt.setElseBlock((Block) createStatement(stmts.get(1)));
      }
      return stmt;
    }
    if (kind.equals("Block")) {
      Block stmt = IrFactory.eINSTANCE.createBlock();
      String id = element.getAttribute("id");
      stmt.setId(id);
      doAnnotations(stmt, element);
      stmt.setOuter((Scope) findIrObject(element.getAttribute("outer-scope")));

      this.addIrObject(id, stmt);

      List<Element> decls = getChildren(element, "Decl");
      for (Element e : decls) {
        stmt.getDeclarations().add(createDeclaration(e));
      }

      List<Element> stmts = getChildren(element, "Stmt");
      for (Element e : stmts) {
        stmt.getStatements().add(createStatement(e));
      }

      return stmt;
    } else if (kind.equals("ReturnValue")) {
      ReturnValue stmt = IrFactory.eINSTANCE.createReturnValue();
      stmt.setValue((Expression) getChild(element, "Expr"));

      return stmt;
    }

    assert (false);
    return null;
  }