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.model import Node
|
||||||
from smnp.ast.node.none import NoneNode
|
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):
|
class IfElse(Node):
|
||||||
@@ -40,3 +44,31 @@ class IfElse(Node):
|
|||||||
return 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.operator import BinaryOperator
|
||||||
from smnp.ast.node.term import TermParser
|
from smnp.ast.node.term import TermParser
|
||||||
from smnp.ast.node.valuable import Valuable
|
from smnp.ast.node.valuable import Valuable
|
||||||
@@ -38,6 +37,7 @@ def Expression3Parser(input):
|
|||||||
|
|
||||||
|
|
||||||
def Expression4Parser(input):
|
def Expression4Parser(input):
|
||||||
|
from smnp.ast.node.condition import IfElse
|
||||||
exprParser = Parser.leftAssociativeOperatorParser(
|
exprParser = Parser.leftAssociativeOperatorParser(
|
||||||
Expression3Parser,
|
Expression3Parser,
|
||||||
[TokenType.OR],
|
[TokenType.OR],
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ class Statement(Node):
|
|||||||
def StatementParser(input):
|
def StatementParser(input):
|
||||||
from smnp.ast.node.block import BlockParser
|
from smnp.ast.node.block import BlockParser
|
||||||
|
|
||||||
|
from smnp.ast.node.condition import IfElseStatementParser
|
||||||
parser = Parser.oneOf(
|
parser = Parser.oneOf(
|
||||||
|
IfElseStatementParser,
|
||||||
BlockParser,
|
BlockParser,
|
||||||
MaxPrecedenceExpressionParser
|
MaxPrecedenceExpressionParser
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -115,7 +115,6 @@ class Parser:
|
|||||||
return ParseResult.OK(node)
|
return ParseResult.OK(node)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return Parser(extendedParser, name=name, parsers=parsers)
|
return Parser(extendedParser, name=name, parsers=parsers)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user