public override object VisitSimpleExpr([NotNull] SLangGrammarParser.SimpleExprContext context) { Visit(context.term()); if (context.simpleExpr() != null) { var op = context.AddOp() ?? context.SubOp() ?? context.BoolOr(); cppText.Write($" {op.GetText()} "); Visit(context.simpleExpr()); } return(null); }
public override object VisitSimpleExpr([NotNull] SLangGrammarParser.SimpleExprContext context) { if (context.simpleExpr() != null) { var leftResultType = (Visit(context.term()) as ExpressionResult)?.Type; var rightResultType = (Visit(context.simpleExpr()) as ExpressionResult)?.Type; var opToken = context.AddOp() ?? context.SubOp() ?? context.BoolOr(); var allowedTypes = new[] { SlangSimpleType.Int, SlangSimpleType.Real }; if (context.BoolOr() == null && (leftResultType is SlangSimpleType lt && rightResultType is SlangSimpleType rt && lt.Equals(rt) && allowedTypes.Contains(lt))) { return(new ExpressionResult(leftResultType, ExpressionValueType.Value)); } if (context.BoolOr() != 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.term()) as ExpressionResult); }