public Node IfStatement() { var result = new IfStatement(); var ifClause = new IfClause() { AnchorToken = Expect(TokenCategory.IF) }; ifClause.Add(Expression()); Expect(TokenCategory.THEN); while (firstOfStatement.Contains(CurrentToken)) { ifClause.Add(Statement()); } result.Add(ifClause); while (CurrentToken == TokenCategory.ELSEIF) { var elseIfClause = new ElseIfClause() { AnchorToken = Expect(TokenCategory.ELSEIF) }; elseIfClause.Add(Expression()); Expect(TokenCategory.THEN); while (firstOfStatement.Contains(CurrentToken)) { elseIfClause.Add(Statement()); } result.Add(elseIfClause); } if (CurrentToken == TokenCategory.ELSE) { var elseClause = new ElseClause() { AnchorToken = Expect(TokenCategory.ELSE) }; while (firstOfStatement.Contains(CurrentToken)) { elseClause.Add(Statement()); } result.Add(elseClause); } Expect(TokenCategory.END); Expect(TokenCategory.SEMICOLON); return(result); }
//----------------------------------------------------------- private string Visit(ElseIfClause node, Table table, string nextClauseLabel) { string retString = Visit((dynamic)node[0], table); retString += "\t\tbrfalse " + nextClauseLabel + "\n"; for (int i = 1; i < node.Count(); i++) { retString += Visit((dynamic)node[i], table); } return(retString); }
//----------------------------------------------------------- private Type Visit(ElseIfClause node, Table table) { Type condType = Visit((dynamic)node[0], table); if (condType != Type.BOOLEAN) { throw new SemanticError("If condition must be evaluated to a boolean value", node[0].AnchorToken); } for (var i = 1; i < node.Count(); i++) { Visit((dynamic)node[i], table); } return(Type.VOID); }
private Body /*!*/ MakeBody(Statements /*!*/ statements, List <RescueClause> rescueClauses, ElseIfClause elseIf, SourceSpan elseIfLocation, Statements ensureStatements, SourceSpan location) { Debug.Assert(elseIf == null || elseIf.Condition == null); if (elseIf != null && rescueClauses == null) { ErrorSink.Add(_sourceUnit, "else without rescue is useless", elseIfLocation, -1, Severity.Warning); } return(new Body( statements, rescueClauses, (elseIf != null) ? elseIf.Statements : null, ensureStatements, location )); }