Finished expression syntactical analysis

This commit is contained in:
Kyler 2024-03-03 13:41:13 -07:00
parent 8a962bc525
commit 6ede3a4c5e
1 changed files with 38 additions and 10 deletions

View File

@ -915,23 +915,51 @@ def _expression_sa(tokens: list[lexer.Token]) -> Expression:
break break
if tokens[max_operator].value in UnaryOperator: if tokens[max_operator].value in UnaryOperator:
pass if tokens[max_operator].value in (
# if tokens[max_operator].value in ( UnaryOperator.PostfixDecrement,
# UnaryOperator.PostfixDecrement, UnaryOperator.PostfixIncrement,
# UnaryOperator.PostfixIncrement, ) and max_operator == len(tokens) - 1:
# ) and max_operator == len(tokens) - 1: operators = {
# return UnaryExpression( '--': UnaryOperator.PostfixDecrement,
# UnaryOperator(tokens[max_operator].value), '++': UnaryOperator.PostfixIncrement,
# _expression_sa(tokens[:max_operator]) }
# ) return UnaryExpression(
operators[tokens[max_operator].value],
_expression_sa(tokens[:max_operator]),
)
elif tokens[max_operator].value in (
UnaryOperator.PrefixDecrement,
UnaryOperator.PrefixIncrement,
) and max_operator == 0:
operators = {
'--': UnaryOperator.PrefixDecrement,
'++': UnaryOperator.PrefixIncrement,
}
return UnaryExpression(
operators[tokens[max_operator].value],
_expression_sa(tokens[max_operator+1:]),
)
elif max_operator == 0:
return UnaryExpression(
UnaryOperator(tokens[max_operator].value),
_expression_sa(tokens[max_operator+1:]),
)
else: raise CompilerError(
"Operator Precedence Error", tokens[max_operator].file_info)
elif tokens[max_operator].value in BinaryOperator: elif tokens[max_operator].value in BinaryOperator:
pass return BinaryExpression(
BinaryOperator(tokens[max_operator].value),
_expression_sa(tokens[:max_operator]),
_expression_sa(tokens[max_operator+1:]),
)
elif tokens[max_operator].value in TernaryOperator: elif tokens[max_operator].value in TernaryOperator:
condition = _expression_sa(tokens[:max_operator]) condition = _expression_sa(tokens[:max_operator])
del tokens[:max_operator] del tokens[:max_operator]
true_expr = _expression_sa(_get_nested_group(tokens, ('?', ':'))) true_expr = _expression_sa(_get_nested_group(tokens, ('?', ':')))
false_expr = _expression_sa(tokens) false_expr = _expression_sa(tokens)
return TernaryExpression(condition, true_expr, false_expr) return TernaryExpression(condition, true_expr, false_expr)
else: raise CompilerError(
"Expression Error", tokens[max_operator].file_info)
def _statement_sa(tokens: list[lexer.Token]) -> Statement: def _statement_sa(tokens: list[lexer.Token]) -> Statement:
token = tokens.pop(0) token = tokens.pop(0)