public override object VisitExp([NotNull] SLangGrammarParser.ExpContext context) { Visit(context.simpleExpr()); if (context.exp() != null) { var op = context.BoolEq() ?? context.BoolG() ?? context.BoolGeq() ?? context.BoolL() ?? context.BoolLeq() ?? context.BoolNeq(); cppText.Write($" {op.GetText()} "); Visit(context.exp()); } return(null); }
public override object VisitExp([NotNull] SLangGrammarParser.ExpContext context) { // что можно сравнивать в языке? // int и float и char и bool только между собой -- все простые типы кроме строк // указатели любого типа только между собой if (context.exp() != null) { var leftResultType = (Visit(context.simpleExpr()) as ExpressionResult)?.Type; var rightResultType = (Visit(context.exp()) as ExpressionResult)?.Type; var allowedTypes = new[] { SlangSimpleType.Int, SlangSimpleType.Real, SlangSimpleType.Boolean, SlangSimpleType.Character }; var relOp = context.BoolEq() ?? context.BoolNeq() ?? context.BoolG() ?? context.BoolGeq() ?? context.BoolL() ?? context.BoolLeq(); if ((leftResultType is SlangSimpleType lt && rightResultType is SlangSimpleType rt && lt.Equals(rt) && allowedTypes.Contains(lt)) || ((leftResultType is SlangPointerType || leftResultType is SlangNullType) && (rightResultType is SlangPointerType || rightResultType is SlangNullType))) { return(new ExpressionResult(SlangSimpleType.Boolean, ExpressionValueType.Value)); } ThrowInvalidTypesForBinaryOperationException(relOp.Symbol, file, leftResultType, rightResultType); } return(Visit(context.simpleExpr()) as ExpressionResult); }