Beispiel #1
0
    def __unary(self) -> Expr:
        if self.__match(TokenType.BANG, TokenType.MINUS):
            operator = token_to_unary_operator(self.__previous())
            inner_expr = self.__unary()
            expr = exprs.Unary(operator, inner_expr)
            expr.span = SourceSpan.from_spans(operator.span, inner_expr.span)
            return expr

        return self.__primary()
Beispiel #2
0
    def __multiplication(self) -> Expr:
        expr = self.__unary()

        while self.__match(TokenType.SLASH, TokenType.STAR):
            operator = token_to_binary_operator(self.__previous())
            right = self.__unary()
            new_expr = exprs.Binary(expr, operator, right)
            new_expr.span = SourceSpan.from_spans(expr.span, right.span)
            expr = new_expr

        return expr
Beispiel #3
0
    def __equality(self) -> Expr:
        expr = self.__comparison()

        while self.__match(TokenType.BANG_EQUAL, TokenType.EQUAL_EQUAL):
            operator = token_to_binary_operator(self.__previous())
            right = self.__comparison()
            new_expr = exprs.Binary(expr, operator, right)
            new_expr.span = SourceSpan.from_spans(expr.span, right.span)
            expr = new_expr

        return expr
Beispiel #4
0
    def __comparison(self) -> Expr:
        expr = self.__addition()

        while self.__match(TokenType.GREATER, TokenType.GREATER_EQUAL, TokenType.LESS, TokenType.LESS_EQUAL):
            operator = token_to_binary_operator(self.__previous())
            right = self.__addition()
            new_expr = exprs.Binary(expr, operator, right)
            new_expr.span = SourceSpan.from_spans(expr.span, right.span)
            expr = new_expr

        return expr
Beispiel #5
0
    def __primary(self) -> Expr:
        def literal(value) -> Expr:
            expr = exprs.Literal(value)
            expr.span = self.__previous().span
            return expr

        if self.__match(TokenType.FALSE):
            return literal(False)
        if self.__match(TokenType.TRUE):
            return literal(True)

        if self.__match(TokenType.NUMBER, TokenType.STRING):
            return literal(self.__previous().literal)

        if self.__match(TokenType.LEFT_PAREN):
            start = self.__previous()
            expr = exprs.Grouping(self.expression())
            end = self.__consume(TokenType.RIGHT_PAREN, 'Expected \')\' after expression')
            expr.span = SourceSpan.from_spans(start.span, end.span)
            return expr

        raise ParserException(self.__peek(), 'Expected expression')