public override ParserRuleContext VisitUnaryExpr([NotNull] StructuredTextParser.UnaryExprContext context)
            {
                var result = new VisualBasicParser.UnaryExprContext(_contextStack.Peek(), 0);

                if (context.operand != null)
                {
                    int type;
                    switch (context.operand.Type)
                    {
                    case StructuredTextParser.PLUS: type = VisualBasicParser.PLUS; break;

                    case StructuredTextParser.MINUS: type = VisualBasicParser.MINUS; break;

                    case StructuredTextParser.NOT: return(ParseNotExpr(context));

                    default: throw new InvalidOperationException();
                    }
                    result.AddChild(new CommonToken(type, context.operand.Text));
                }

                var dummyChild = new VisualBasicParser.PowerExprContext(result, 0);

                result.AddChild(dummyChild);
                _contextStack.Push(dummyChild);
                dummyChild.AddChild(Visit(context.rhs));
                _contextStack.Pop();
                return(result);
            }
            private ParserRuleContext ParseNotExpr([NotNull] StructuredTextParser.UnaryExprContext context)
            {
                var result = new VisualBasicParser.UnaryExprContext(_contextStack.Peek(), 0);

                AddChild(result, parent =>
                {
                    var notExpr = new VisualBasicParser.NotExprContext(parent, 0);
                    notExpr.AddChild(new CommonToken(VisualBasicParser.NOT, "NOT"));
                    AddChild(notExpr, parent2 =>
                    {
                        _contextStack.Push(parent2);
                        var primaryExpr = (VisualBasicParser.PrimaryExprContext)Visit(context.rhs);
                        _contextStack.Pop();
                        return(primaryExpr);
                    });
                    return(notExpr);
                });
                return(result);
            }
            public override ParserRuleContext VisitPowerExpr([NotNull] StructuredTextParser.PowerExprContext context)
            {
                var unaryExpr = (VisualBasicParser.UnaryExprContext)Visit(context.lhs);

                if (context.rhs == null)
                {
                    return(unaryExpr);
                }

                VisualBasicParser.PowerExprContext powerExpr;
                if (unaryExpr.ChildCount == 1)
                {
                    powerExpr = unaryExpr.rhs;
                }
                else
                {
                    powerExpr = new VisualBasicParser.PowerExprContext(null, 0);
                    AddChild(powerExpr, parent =>
                    {
                        unaryExpr.Parent = parent;
                        return(unaryExpr);
                    });
                }

                foreach (var rhs in context.unaryExpr().Skip(1))
                {
                    powerExpr.AddChild(new CommonToken(VisualBasicParser.HAT, "^"));
                    AddChild(powerExpr, parent =>
                    {
                        _contextStack.Push(parent);
                        var unary = (VisualBasicParser.UnaryExprContext)Visit(rhs);
                        _contextStack.Pop();
                        return(unary);
                    });
                }

                var result = new VisualBasicParser.UnaryExprContext((ParserRuleContext)unaryExpr.Parent, 0);

                result.AddChild(powerExpr);
                powerExpr.Parent = result;
                return(result);
            }
Beispiel #4
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="VisualBasicParser.unaryExpr"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitUnaryExpr([NotNull] VisualBasicParser.UnaryExprContext context)
 {
     return(VisitChildren(context));
 }