示例#1
0
        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);
        }
示例#2
0
        //-----------------------------------------------------------
        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);
        }
示例#4
0
        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
                       ));
        }