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); }
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)), });
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); } } }
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) { }