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); }
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); }
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; } }
public virtual object VisitUnaryExpression(UnaryExpression unaryExpression, object data) { stackMap.Push(unaryExpression); unaryExpression.Child.AcceptVisitor(this, data); stackMap.Pop(); return null; }