public override object VisitTerm([NotNull] SLangGrammarParser.TermContext context) { Visit(context.signedFactor()); if (context.term() != null) { var op = context.MulOp() ?? context.DivOp() ?? context.BoolAnd(); cppText.Write($" {op.GetText()} "); Visit(context.term()); } return(null); }
public override object VisitTerm([NotNull] SLangGrammarParser.TermContext context) { if (context.term() != null) { var leftResultType = (Visit(context.signedFactor()) as ExpressionResult)?.Type; var rightResultType = (Visit(context.term()) as ExpressionResult)?.Type; var opToken = context.MulOp() ?? context.DivOp() ?? context.BoolAnd(); var allowedTypes = new[] { SlangSimpleType.Int, SlangSimpleType.Real }; if (leftResultType is SlangSimpleType lt && rightResultType is SlangSimpleType rt && lt.Equals(rt) && allowedTypes.Contains(lt)) { return(new ExpressionResult(leftResultType, ExpressionValueType.Value)); } if (context.BoolAnd() != null && (leftResultType is SlangSimpleType ltB && rightResultType is SlangSimpleType rtB && ltB.Equals(rtB) && ltB.Equals(SlangSimpleType.Boolean))) { return(new ExpressionResult(leftResultType, ExpressionValueType.Value)); } ThrowInvalidTypesForBinaryOperationException(opToken.Symbol, file, leftResultType, rightResultType); } return(Visit(context.signedFactor()) as ExpressionResult); }
/// <summary> /// Exit a parse tree produced by <see cref="SLangGrammarParser.term"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitTerm([NotNull] SLangGrammarParser.TermContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="SLangGrammarParser.term"/>. /// <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 VisitTerm([NotNull] SLangGrammarParser.TermContext context) { return(VisitChildren(context)); }