public static UnifiedExpression CreateIterationStatement(XElement node) { Contract.Requires(node != null); Contract.Requires(node.Name() == "iteration_statement"); /* * iteration_statement * : 'while' '(' expression ')' statement | 'do' statement 'while' '(' expression ')' ';' | 'for' '(' expression_statement expression_statement expression? ')' statement */ var first = node.FirstElement().Value; var body = UnifiedBlock.Create( CreateStatement(node.FirstElement("statement"))); switch (first) { case "while": return (UnifiedWhile.Create( CreateExpression(node.NthElement(2)).First(), body)); case "do": return (UnifiedDoWhile.Create( CreateExpression(node.NthElement(4)).First(), body)); case "for": var step = node.Element("expression") != null? CreateExpression ( node . FirstElement ( "expression")) . First () : null; return(UnifiedFor.Create( CreateExpressionStatement(node.NthElement(2)), CreateExpressionStatement(node.NthElement(3)), step, body)); default: throw new InvalidOperationException(); } }
public UnifiedElement VisitForStatement( ForStatement forStmt, object data) { // C#はstatementは一つのStatementあるいはBlockなためFirstOrDefaultで問題ない。 // 複数あるのはVBを表す場合のため。 var initStmt = forStmt.Initializers .Select(s => s.TryAcceptForExpression(this)) .FirstOrDefault(); var condExpr = forStmt.Condition.TryAcceptForExpression(this); var stepStmt = forStmt.Iterators .Select(s => s.TryAcceptForExpression(this)) .FirstOrDefault(); var body = forStmt.EmbeddedStatement.TryAcceptForExpression(this). ToBlock(); return(UnifiedFor.Create(initStmt, condExpr, stepStmt, body)); }