Create if-else statement

This commit is contained in:
Bartłomiej Pluta
2019-07-11 09:32:05 +02:00
parent a13c87db14
commit 60b54c357d
4 changed files with 35 additions and 2 deletions

View File

@@ -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)

View File

@@ -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],

View File

@@ -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
) )

View File

@@ -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)