コード例 #1
0
        /// <summary>
        /// Process the term2 rule.
        /// </summary>
        /// <remarks>
        ///
        /// term2 ::= '*' factor term2 |
        ///           '/' factor term2 |
        ///           {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseTerm2()
        {
            if (Tokeniser.Next(TokenType.Multiply))
            {
                EvalNode op    = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Multiply, ParseFactor(), Language);
                EvalNode term2 = ParseTerm2();
                if (term2 != null)
                {
                    term2.Prepend(op);
                }
                return(op);
            }

            if (Tokeniser.Next(TokenType.Divide))
            {
                EvalNode op    = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Divide, ParseFactor(), Language);
                EvalNode term2 = ParseTerm2();
                if (term2 != null)
                {
                    term2.Prepend(op);
                }
                return(op);
            }

            return(null);
        }
コード例 #2
0
        /// <summary>
        /// Parse the 'expression2' rule.
        /// </summary>
        /// <remarks>
        ///
        /// expression2 ::= '+' term expression2 |
        ///                 '-' term expression2 |
        ///                 {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseExpression2()
        {
            if (Tokeniser.Next(TokenType.Plus))
            {
                EvalNode op    = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Add, ParseTerm(), Language);
                EvalNode expr2 = ParseExpression2();
                if (expr2 != null)
                {
                    expr2.Prepend(op);
                }
                return(op);
            }

            if (Tokeniser.Next(TokenType.Minus))
            {
                EvalNode op    = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Subtract, ParseTerm(), Language);
                EvalNode expr2 = ParseExpression2();
                if (expr2 != null)
                {
                    expr2.Prepend(op);
                }
                return(op);
            }

            return(null);
        }
コード例 #3
0
        /// <summary>
        /// Process the term2 rule.
        /// </summary>
        /// <remarks>
        ///
        /// term2 ::= '*' factor term2 |
        ///           '/' factor term2 |
        ///           {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseTerm2()
        {
            if (Tokeniser.Next(TokenType.Multiply))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Multiply, ParseFactor(), Language);
                EvalNode term2 = ParseTerm2();
                if (term2 != null)
                    term2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.Divide))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Divide, ParseFactor(), Language);
                EvalNode term2 = ParseTerm2();
                if (term2 != null)
                    term2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #4
0
        /// <summary>
        /// Parse the 'expression2' rule.
        /// </summary>
        /// <remarks>
        /// 
        /// expression2 ::= '+' term expression2 |
        ///                 '-' term expression2 |
        ///                 {empty}
        ///                 
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseExpression2()
        {
            if (Tokeniser.Next(TokenType.Plus))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Add, ParseTerm(), Language);
                EvalNode expr2 = ParseExpression2();
                if (expr2 != null)
                    expr2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.Minus))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Subtract, ParseTerm(), Language);
                EvalNode expr2 = ParseExpression2();
                if (expr2 != null)
                    expr2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #5
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Parse the 'equality2' rule.
        /// </summary>
        /// <remarks>
        ///
        /// equality2 ::= '==' relational equality2 |
        ///               '!=' relational equality2 |
        ///               {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseEquality2()
        {
            if (Tokeniser.Next(TokenType.DoubleEqual))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Equal, ParseRelational(), Language);
                EvalNode equality2 = ParseEquality2();
                if (equality2 != null)
                    equality2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.NotEqual))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.NotEqual, ParseRelational(), Language);
                EvalNode equality2 = ParseEquality2();
                if (equality2 != null)
                    equality2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #6
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Process the 'addsub2VB' rule.
        /// </summary>
        /// <remarks>
        ///
        /// addsub2VB ::= '+' modVB addsub2VB |
        ///               '-' modVB addsub2VB |
        ///               {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseAddSub2VB()
        {
            if (Tokeniser.Next(TokenType.Plus))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Add, ParseModVB(), Language);
                EvalNode addsub2 = ParseAddSub2VB();
                if (addsub2 != null)
                    addsub2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.Minus))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Subtract, ParseModVB(), Language);
                EvalNode addsub2 = ParseAddSub2VB();
                if (addsub2 != null)
                    addsub2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #7
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Process the 'term2' rule.
        /// </summary>
        /// <remarks>
        ///
        /// term2 ::= '*' factor term2 |
        ///           '/' factor term2 |
        ///           '%' factor term2 |
        ///           {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected override EvalNode ParseTerm2()
        {
            if (Tokeniser.Next(TokenType.Remainder))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Remainder, ParseFactor(), Language);
                EvalNode term2 = ParseTerm2();
                if (term2 != null)
                    term2.Prepend(op);
                return op;
            }

            // Base handles '*' and '/'
            return base.ParseTerm2();
        }
コード例 #8
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Parse the 'relational2VB' rule.
        /// </summary>
        /// <remarks>
        ///
        /// relational2VB ::= '&lt;'     shiftVB relational2VB |
        ///                   '>'        shiftVB relational2VB |
        ///                   '&lt;='    shiftVB relational2VB |
        ///                   '>='       shiftVB relational2VB |
        ///                   '='        shiftVB relational2VB |
        ///                   '&lt;&gt;' shiftVB relational2VB |
        ///                   {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseRelational2VB()
        {
            if (Tokeniser.Next(TokenType.LessThan))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.LessThan, ParseShiftVB(), Language);
                EvalNode relate2 = ParseRelational2VB();
                if (relate2 != null)
                    relate2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.GreaterThan))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.GreaterThan, ParseShiftVB(), Language);
                EvalNode relate2 = ParseRelational2VB();
                if (relate2 != null)
                    relate2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.LessThanEqual))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.LessThanEqual, ParseShiftVB(), Language);
                EvalNode relate2 = ParseRelational2VB();
                if (relate2 != null)
                    relate2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.GreaterThanEqual))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.GreaterThanEqual, ParseShiftVB(), Language);
                EvalNode relate2 = ParseRelational2VB();
                if (relate2 != null)
                    relate2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.Equal))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Equal, ParseShiftVB(), Language);
                EvalNode relate2 = ParseRelational2VB();
                if (relate2 != null)
                    relate2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.LessGreater))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.NotEqual, ParseShiftVB(), Language);
                EvalNode relate2 = ParseRelational2VB();
                if (relate2 != null)
                    relate2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #9
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Process the 'mod2VB' rule.
        /// </summary>
        /// <remarks>
        ///
        /// mod2VB ::= 'Mod' intdivVB mod2VB |
        ///            {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseMod2VB()
        {
            if (Tokeniser.Next(TokenType.KeywordMod))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.Remainder, ParseIntDivVB(), Language);
                EvalNode mod2 = ParseMod2VB();
                if (mod2 != null)
                    mod2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #10
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Parse the 'logicalXor2VB' rule.
        /// </summary>
        /// <remarks>
        ///
        /// logicalXor2VB ::= 'Xor' logicalOrVB logicalXor2VB |
        ///                   {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseLogicalXor2VB()
        {
            if (Tokeniser.Next(TokenType.KeywordXor))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.LogicalXor, ParseLogicalOrVB(), Language);
                EvalNode xor2 = ParseLogicalXor2VB();
                if (xor2 != null)
                    xor2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #11
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Parse the 'logicalOr2VB' rule.
        /// </summary>
        /// <remarks>
        ///
        /// logicalOr2VB ::= 'Or' logicalAndVB logicalOr2VB |
        ///                  'OrElse' logicalAndVB logicalOr2VB |
        ///                  {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseLogicalOr2VB()
        {
            if (Tokeniser.Next(TokenType.KeywordOr))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.LogicalOr, ParseLogicalAndVB(), Language);
                EvalNode or2 = ParseLogicalOr2VB();
                if (or2 != null)
                    or2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.KeywordOrElse))
            {
                EvalNode op = new EvalNodeCondLogicOp(EvalNodeCondLogicOp.CompareOp.Or, ParseLogicalAndVB(), Language);
                EvalNode or2 = ParseLogicalOr2VB();
                if (or2 != null)
                    or2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #12
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Parse the 'logicalOr2' rule.
        /// </summary>
        /// <remarks>
        ///
        /// logicalOr2 ::= '|' logicalXor logicalOr2 |
        ///                {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseLogicalOr2()
        {
            if (Tokeniser.Next(TokenType.Or))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.LogicalOr, ParseLogicalXor(), Language);
                EvalNode or2 = ParseLogicalOr2();
                if (or2 != null)
                    or2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #13
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Parse the 'logicalAnd2VB' rule.
        /// </summary>
        /// <remarks>
        ///
        /// logicalAnd2VB ::= 'And' logicalNotVB logicalAnd2VB |
        ///                   'AndAlso' logicalNotVB logicalAnd2VB |
        ///                   {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseLogicalAnd2VB()
        {
            if (Tokeniser.Next(TokenType.KeywordAnd))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.LogicalAnd, ParseLogicalNotVB(), Language);
                EvalNode and2 = ParseLogicalAnd2VB();
                if (and2 != null)
                    and2.Prepend(op);
                return op;
            }

            if (Tokeniser.Next(TokenType.KeywordAndAlso))
            {
                EvalNode op = new EvalNodeCondLogicOp(EvalNodeCondLogicOp.CompareOp.And, ParseLogicalNotVB(), Language);
                EvalNode and2 = ParseLogicalAnd2VB();
                if (and2 != null)
                    and2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #14
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Parse the 'logicalAnd2' rule.
        /// </summary>
        /// <remarks>
        ///
        /// logicalAnd2 ::= '&amp;' equality logicalAnd2 |
        ///                 {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseLogicalAnd2()
        {
            if (Tokeniser.Next(TokenType.And))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.LogicalAnd, ParseEquality(), Language);
                EvalNode and2 = ParseLogicalAnd2();
                if (and2 != null)
                    and2.Prepend(op);
                return op;
            }

            return null;
        }
コード例 #15
0
ファイル: Eval.cs プロジェクト: ComponentFactory/Quicksilver
        /// <summary>
        /// Process the 'intdiv2VB' rule.
        /// </summary>
        /// <remarks>
        ///
        /// intdiv2VB ::= '\' termVB intdiv2VB |
        ///               {empty}
        ///
        /// </remarks>
        /// <returns>Parsed node.</returns>
        protected virtual EvalNode ParseIntDiv2VB()
        {
            if (Tokeniser.Next(TokenType.BackSlash))
            {
                EvalNode op = new EvalNodeBinaryOp(EvalNodeBinaryOp.BinaryOp.IntegerDivide, ParseTermVB(), Language);
                EvalNode intdiv2 = ParseIntDiv2VB();
                if (intdiv2 != null)
                    intdiv2.Prepend(op);
                return op;
            }

            return null;
        }