Пример #1
0
		private void ConsumeUnary(TokenID startOp)							
		{
			Advance();
			ParseExpressionSegment();
			while (precedence[(int)curtok.ID] > precedence[(int)startOp])
			{
				ParseExpressionSegment();
			}
            ExpressionNode node = exprStack.Pop();
			UnaryExpression uNode = new UnaryExpression(startOp, node.RelatedToken);
			uNode.Child = node;
			exprStack.Push(uNode);
		}
Пример #2
0
        private ExpressionNode ParseSubexpression(int precBound)
        {
            ExpressionNode expr;
            switch (curtok.ID)
            {
                case TokenID.Plus:
                case TokenID.Minus:
                case TokenID.Not:
                case TokenID.Tilde:
                case TokenID.PlusPlus:
                case TokenID.MinusMinus:
                case TokenID.BAnd:
                case TokenID.Star:
                    {
                        UnaryExpression unExpr = new UnaryExpression(curtok.ID, curtok);
                        Advance();
                        unExpr.Child = ParseSubexpression(PRECEDENCE_UNARY);
                        expr = unExpr;
                        break;
                    }

                default:
                    expr = ParsePrimaryExpression();
                    break;
            }
            return ParseSubexpression(precBound, expr);
        }
Пример #3
0
        private void ParsePreprocessorExpressionSegment(int oldLine)
        {
            int startStackCount = exprStack.Count;
            TokenID startToken = curtok.ID;
            switch (curtok.ID)
            {
                case TokenID.True:
                    exprStack.Push(new BooleanPrimitive(true, curtok));
                    Advance();
                    break;

                case TokenID.False:
                    exprStack.Push(new BooleanPrimitive(false, curtok));
                    Advance();
                    break;

                case TokenID.And:
                case TokenID.Or:
                    Advance();
                    if (!SameLine(oldLine)) return;

                    BinaryExpression bNode = new BinaryExpression(startToken, curtok);
                    bNode.Left = exprStack.Pop();
                    exprStack.Push(bNode); // push node
                    ParsePreprocessorExpressionSegment(oldLine); // right side
                    // consume now or let next op consume?
                    while (precedence[(int)curtok.ID] > precedence[(int)startToken] && curtok.Line == oldLine)
                    {
                        ParsePreprocessorExpressionSegment(oldLine);
                    }

                    bNode.Right = exprStack.Pop();
                    break;

                case TokenID.Not:
                    Advance();
                    do
                    {
                        if (!SameLine(oldLine)) return;
                        ParsePreprocessorExpressionSegment(oldLine);
                    }
                    while (precedence[(int)curtok.ID] >= precedence[(int)TokenID.LParen]);      // LParen for precedence of unary operator

                    ExpressionNode node = exprStack.Pop();
                    UnaryExpression uNode = new UnaryExpression(startToken, node.RelatedToken);
                    uNode.Child = node;
                    exprStack.Push(uNode);
                    break;

                case TokenID.LParen:
                    Advance();
                    if (!SameLine(oldLine)) return;
                    exprStack.Push(new ParenthesizedExpression(ParsePreprocessorExpression()));
                    if (!SameLine(oldLine)) return;
                    AssertAndAdvance(TokenID.RParen);
                    break;


                case TokenID.Ident:
                    exprStack.Push(ParseIdentifierOrKeyword(false, false, false, false, false));
                    break;

                default:
                    if (Lexer.IsKeyWord(curtok.ID))
                    {
                        // in this case a key word is used like a variable name.
                        goto case TokenID.Ident;
                    }
                    else
                    {
                        ReportError("Unexpected token", curtok);
                    }
                    break;
            }
        }
Пример #4
0
        public virtual object VisitUnaryExpression(UnaryExpression unaryExpression, object data)
        {
            stackMap.Push(unaryExpression);
             unaryExpression.Child.AcceptVisitor(this, data);

             stackMap.Pop();
             return null;

        }