Create if-else statement
This commit is contained in:
@@ -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)
|
||||
@@ -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],
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -115,7 +115,6 @@ class Parser:
|
||||
return ParseResult.OK(node)
|
||||
|
||||
|
||||
|
||||
return Parser(extendedParser, name=name, parsers=parsers)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user