public override DynObj VisitArithmaticExpr([NotNull] KittenGrammarParser.ArithmaticExprContext context) { var LHS = Visit(context.left); var RHS = Visit(context.right); var op = context.op.Text; if (LHS.t == vType.Number && RHS.t == vType.Number) { switch (op) { case "+": return(DNumber(LHS.NumberVal + RHS.NumberVal)); case "-": return(DNumber(LHS.NumberVal - RHS.NumberVal)); case "*": return(DNumber(LHS.NumberVal * RHS.NumberVal)); case "/": return(DNumber(LHS.NumberVal / RHS.NumberVal)); } } else if (LHS.t == vType.String && RHS.t == vType.String) { if (op == "+") { return(DString(LHS.StringVal + RHS.StringVal)); } } else { ReportError("InvalidTypeError", $"LHS type {LHS.typeName} and RHS type {RHS.typeName} used on operator \"{op}\"", context.start.Line); } return(base.VisitArithmaticExpr(context)); }
/// <summary> /// Exit a parse tree produced by the <c>arithmaticExpr</c> /// labeled alternative in <see cref="KittenGrammarParser.expr"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitArithmaticExpr([NotNull] KittenGrammarParser.ArithmaticExprContext context) { }
/// <summary> /// Visit a parse tree produced by the <c>arithmaticExpr</c> /// labeled alternative in <see cref="KittenGrammarParser.expr"/>. /// <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 VisitArithmaticExpr([NotNull] KittenGrammarParser.ArithmaticExprContext context) { return(VisitChildren(context)); }