public bool EnterTermExpr(TermExpressionSyntax termExpr, WaddleContext ctx)
        {
            if (termExpr.Left.Accept(TypeVisitor) != TypeSymbol.Integer)
            {
                throw new SemanticErrorException($"Not an Integer @({termExpr.Left.StartToken.LineNumber}{termExpr.Left.StartToken.CharPosition}).");
            }
            if (termExpr.Right.Accept(TypeVisitor) != TypeSymbol.Integer)
            {
                throw new SemanticErrorException($"Not an Integer @({termExpr.Right.StartToken.LineNumber}{termExpr.Right.StartToken.CharPosition}).");
            }

            return(true);
        }
Beispiel #2
0
 private TypeSymbol WaddleExpression(ExpressionSyntax exprStmt)
 {
     return(exprStmt switch
     {
         LogicalExpressionSyntax logicalExpr => WaddleLogicalExpr(logicalExpr),
         ProductExpressionSyntax productExpr => WaddleProductExpr(productExpr),
         RelationalExpressionSyntax relationalExpr => WaddleRelationalExpr(relationalExpr),
         TermExpressionSyntax termExpr => WaddleTermExpr(termExpr),
         InvocationExpressionSyntax invocationExpr => WaddleInvocationExpr(invocationExpr),
         BoolLiteralAtom _ => TypeSymbol.Bool,
         IntegerLiteralAtom _ => TypeSymbol.Integer,
         StringLiteralAtom _ => TypeSymbol.String,
         IdentifierAtom identifierAtom => _currentFunction?.Variables[identifierAtom.Identifier].Type
         ?? throw new SemanticErrorException($"{identifierAtom.Identifier} does not have a type"),
         _ => throw new ArgumentOutOfRangeException(nameof(exprStmt)),
     });
Beispiel #3
0
        private ExpressionSyntax ParseTermExpression()
        {
            var startToken        = CurrentToken;
            ExpressionSyntax left = ParseProductExpression();

            while (true)
            {
                switch (CurrentToken.Type)
                {
                case TokenType.Plus:
                    Next();
                    left = new TermExpressionSyntax(startToken, left, ParseProductExpression(), TermOperator.Plus);
                    break;

                case TokenType.Minus:
                    Next();
                    left = new TermExpressionSyntax(startToken, left, ParseProductExpression(), TermOperator.Minus);
                    break;

                default:
                    return(left);
                }
            }
        }
Beispiel #4
0
 public virtual TResult Visit(TermExpressionSyntax syntax)
 {
     return(DefaultResult);
 }
 public override TypeSymbol Visit(TermExpressionSyntax syntax)
 {
     return(GetTermType(syntax.Left.Accept(this), syntax.Right.Accept(this)));
 }
 public void LeaveTermExpr(TermExpressionSyntax termExpr, WaddleContext ctx)
 {
 }