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; }