public override IVecValue VisitUnary([NotNull] VectorizeParser.UnaryContext context) { var expr = context.expression(); if (expr is VectorizeParser.VarContext var) { var name = var.ID().GetText(); var oldValue = CurrentScope[name]; IVecValue newValue; switch (context.op.Text) { case "++": newValue = oldValue.Add(VecInt.One); break; case "--": newValue = oldValue.Subtract(VecInt.One); break; default: throw new InvalidOperationException($"Unknown operator '{context.op.Text}'!"); } CurrentScope[name] = newValue; return(oldValue); } else { throw new InvalidOperationException("Increment can only be used with variables!"); } }
/// <summary> /// Exit a parse tree produced by the <c>Unary</c> /// labeled alternative in <see cref="VectorizeParser.expression"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitUnary([NotNull] VectorizeParser.UnaryContext context) { }
/// <summary> /// Visit a parse tree produced by the <c>Unary</c> /// labeled alternative in <see cref="VectorizeParser.expression"/>. /// <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 VisitUnary([NotNull] VectorizeParser.UnaryContext context) { return(VisitChildren(context)); }