diff --git a/smnp/ast/node/condition.py b/smnp/ast/node/condition.py index 8aceac3..5880eb1 100644 --- a/smnp/ast/node/condition.py +++ b/smnp/ast/node/condition.py @@ -1,5 +1,9 @@ +from smnp.ast.node.expression import MaxPrecedenceExpressionParser from smnp.ast.node.model import Node from smnp.ast.node.none import NoneNode +from smnp.ast.node.statement import StatementParser +from smnp.ast.parser import Parser +from smnp.token.type import TokenType class IfElse(Node): @@ -40,3 +44,31 @@ class IfElse(Node): return node +def IfElseStatementParser(input): + ifStatementParser = Parser.allOf( + Parser.terminalParser(TokenType.IF), + Parser.terminalParser(TokenType.OPEN_PAREN), + MaxPrecedenceExpressionParser, + Parser.terminalParser(TokenType.CLOSE_PAREN), + StatementParser, + createNode=lambda _, __, condition, ___, ifStatement: IfElse.createNode(ifStatement, condition), + name="if statement" + ) + + ifElseStatementParser = Parser.allOf( + Parser.terminalParser(TokenType.IF), + Parser.terminalParser(TokenType.OPEN_PAREN), + MaxPrecedenceExpressionParser, + Parser.terminalParser(TokenType.CLOSE_PAREN), + StatementParser, + Parser.terminalParser(TokenType.ELSE), + StatementParser, + createNode=lambda _, __, condition, ___, ifStatement, ____, elseStatement: IfElse.createNode(ifStatement, condition, elseStatement), + name="if-else statement" + ) + + return Parser.oneOf( + ifElseStatementParser, + ifStatementParser, + name="if-else/if statement" + )(input) \ No newline at end of file diff --git a/smnp/ast/node/expression.py b/smnp/ast/node/expression.py index f3f83e7..f1f63b1 100644 --- a/smnp/ast/node/expression.py +++ b/smnp/ast/node/expression.py @@ -1,4 +1,3 @@ -from smnp.ast.node.condition import IfElse from smnp.ast.node.operator import BinaryOperator from smnp.ast.node.term import TermParser from smnp.ast.node.valuable import Valuable @@ -38,6 +37,7 @@ def Expression3Parser(input): def Expression4Parser(input): + from smnp.ast.node.condition import IfElse exprParser = Parser.leftAssociativeOperatorParser( Expression3Parser, [TokenType.OR], diff --git a/smnp/ast/node/statement.py b/smnp/ast/node/statement.py index 205b21f..d8f37fe 100644 --- a/smnp/ast/node/statement.py +++ b/smnp/ast/node/statement.py @@ -10,7 +10,9 @@ class Statement(Node): def StatementParser(input): from smnp.ast.node.block import BlockParser + from smnp.ast.node.condition import IfElseStatementParser parser = Parser.oneOf( + IfElseStatementParser, BlockParser, MaxPrecedenceExpressionParser ) diff --git a/smnp/ast/parser.py b/smnp/ast/parser.py index 0aebc8d..802700b 100644 --- a/smnp/ast/parser.py +++ b/smnp/ast/parser.py @@ -115,7 +115,6 @@ class Parser: return ParseResult.OK(node) - return Parser(extendedParser, name=name, parsers=parsers)