mirror of
https://github.com/Zandercraft/Aurora-lang.git
synced 2026-10-30 04:49:21 +00:00
Add if, eli, else support
This commit is contained in:
@@ -25,4 +25,8 @@ power : atom (POW factor)*
|
|||||||
|
|
||||||
atom : INT|FLOAT|IDENTIFIER
|
atom : INT|FLOAT|IDENTIFIER
|
||||||
: LPAREN expr RPAREN
|
: LPAREN expr RPAREN
|
||||||
|
|
||||||
|
if-expr : KEYWORD:if expr KEYWORD:then expr
|
||||||
|
(KEYWORD:eli expr KEYWORD:then expr)*
|
||||||
|
(KEYWORD:el expr)
|
||||||
```
|
```
|
||||||
|
|||||||
112
aurora.py
112
aurora.py
@@ -131,7 +131,11 @@ KEYWORDS = [
|
|||||||
'set',
|
'set',
|
||||||
'and',
|
'and',
|
||||||
'or',
|
'or',
|
||||||
'not'
|
'not',
|
||||||
|
'if',
|
||||||
|
'then',
|
||||||
|
'eli',
|
||||||
|
'else'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -355,6 +359,13 @@ class UnaryOperationNode:
|
|||||||
return f'({self.operation}, {self.node})'
|
return f'({self.operation}, {self.node})'
|
||||||
|
|
||||||
|
|
||||||
|
class IfNode:
|
||||||
|
def __init__(self, cases, else_case):
|
||||||
|
self.cases = cases
|
||||||
|
self.else_case = else_case
|
||||||
|
self.pos_start = self.cases[0][0].pos_start
|
||||||
|
self.pos_end = (self.else_case or self.cases[len(self.cases) - 1][0]).pos_end
|
||||||
|
|
||||||
####################
|
####################
|
||||||
# PARSER RESULT
|
# PARSER RESULT
|
||||||
####################
|
####################
|
||||||
@@ -458,6 +469,12 @@ class Parser:
|
|||||||
self.current_token.pos_start, self.current_token.pos_end,
|
self.current_token.pos_start, self.current_token.pos_end,
|
||||||
"Expected ')'"
|
"Expected ')'"
|
||||||
))
|
))
|
||||||
|
elif token.matches(TT_KEYWORD, 'if'):
|
||||||
|
if_expr = result.register(self.if_expr())
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
|
||||||
|
return result.success(if_expr)
|
||||||
|
|
||||||
return result.failure(InvalidSyntaxErr(
|
return result.failure(InvalidSyntaxErr(
|
||||||
token.pos_start,
|
token.pos_start,
|
||||||
@@ -552,6 +569,72 @@ class Parser:
|
|||||||
))
|
))
|
||||||
return result.success(node)
|
return result.success(node)
|
||||||
|
|
||||||
|
def if_expr(self):
|
||||||
|
result = ParsedResult()
|
||||||
|
cases = []
|
||||||
|
else_case = None
|
||||||
|
|
||||||
|
if not self.current_token.matches(TT_KEYWORD, 'if'):
|
||||||
|
return result.failure(InvalidSyntaxErr(
|
||||||
|
self.current_token.pos_start,
|
||||||
|
self.current_token.pos_end,
|
||||||
|
"Expected 'if'"
|
||||||
|
))
|
||||||
|
|
||||||
|
result.register_advancement()
|
||||||
|
self.advance()
|
||||||
|
|
||||||
|
condition = result.register(self.expr())
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
|
||||||
|
if not self.current_token.matches(TT_KEYWORD, 'then'):
|
||||||
|
return result.failure(InvalidSyntaxErr(
|
||||||
|
self.current_token.pos_start,
|
||||||
|
self.current_token.pos_end,
|
||||||
|
"Expected 'then'"
|
||||||
|
))
|
||||||
|
|
||||||
|
result.register_advancement()
|
||||||
|
self.advance()
|
||||||
|
|
||||||
|
expr = result.register(self.expr())
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
cases.append((condition, expr))
|
||||||
|
|
||||||
|
while self.current_token.matches(TT_KEYWORD, 'eli'):
|
||||||
|
result.register_advancement()
|
||||||
|
self.advance()
|
||||||
|
|
||||||
|
condition = result.register(self.expr())
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
|
||||||
|
if not self.current_token.matches(TT_KEYWORD, 'then'):
|
||||||
|
return result.failure(InvalidSyntaxErr(
|
||||||
|
self.current_token.pos_start,
|
||||||
|
self.current_token.pos_end,
|
||||||
|
"Expected 'then'"
|
||||||
|
))
|
||||||
|
|
||||||
|
result.register_advancement()
|
||||||
|
self.advance()
|
||||||
|
|
||||||
|
expr = result.register(self.expr())
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
cases.append((condition, expr))
|
||||||
|
|
||||||
|
if self.current_token.matches(TT_KEYWORD, 'else'):
|
||||||
|
result.register_advancement()
|
||||||
|
self.advance()
|
||||||
|
|
||||||
|
else_case = result.register(self.expr())
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
return result.success(IfNode(cases, else_case))
|
||||||
|
|
||||||
def binary_operation(self, lfunc, operations, rfunc=None):
|
def binary_operation(self, lfunc, operations, rfunc=None):
|
||||||
if rfunc is None:
|
if rfunc is None:
|
||||||
rfunc = lfunc
|
rfunc = lfunc
|
||||||
@@ -654,6 +737,9 @@ class Number:
|
|||||||
def not_op(self):
|
def not_op(self):
|
||||||
return Number(1 if self.value == 0 else 0).set_context(self.context), None
|
return Number(1 if self.value == 0 else 0).set_context(self.context), None
|
||||||
|
|
||||||
|
def is_true(self):
|
||||||
|
return self.value != 0
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
copy = Number(self.value)
|
copy = Number(self.value)
|
||||||
copy.set_pos(self.pos_start, self.pos_end)
|
copy.set_pos(self.pos_start, self.pos_end)
|
||||||
@@ -795,6 +881,30 @@ class Interpreter:
|
|||||||
return result.failure(error)
|
return result.failure(error)
|
||||||
return result.success(number.set_pos(node.pos_start, node.pos_end))
|
return result.success(number.set_pos(node.pos_start, node.pos_end))
|
||||||
|
|
||||||
|
def visit_IfNode(self, node: IfNode, context):
|
||||||
|
result = RuntimeResult()
|
||||||
|
|
||||||
|
for condition, expr, in node.cases:
|
||||||
|
condition_value = result.register(self.visit(condition, context))
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
|
||||||
|
if condition_value.is_true():
|
||||||
|
expr_value = result.register(self.visit(expr, context))
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
|
||||||
|
return result.success(expr_value)
|
||||||
|
|
||||||
|
if node.else_case:
|
||||||
|
else_value = result.register(self.visit(node.else_case, context))
|
||||||
|
if result.error:
|
||||||
|
return result
|
||||||
|
|
||||||
|
return result.success(else_value)
|
||||||
|
|
||||||
|
return result.success(None)
|
||||||
|
|
||||||
|
|
||||||
####################
|
####################
|
||||||
# RUNNER
|
# RUNNER
|
||||||
|
|||||||
2
main.py
2
main.py
@@ -31,7 +31,7 @@ def interactive_shell():
|
|||||||
|
|
||||||
if error:
|
if error:
|
||||||
print(error.as_string())
|
print(error.as_string())
|
||||||
else:
|
elif result:
|
||||||
print(result)
|
print(result)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
# Handle keyboard interrupts and gracefully shut down.
|
# Handle keyboard interrupts and gracefully shut down.
|
||||||
|
|||||||
Reference in New Issue
Block a user