Add optional semicolon at the end of statements and move loop parser from factor to expression (change precedence)
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from smnp.ast.node.model import Node
|
||||
from smnp.ast.parser import Parser
|
||||
from smnp.token.type import TokenType
|
||||
|
||||
|
||||
class Statement(Node):
|
||||
@@ -13,11 +14,24 @@ def StatementParser(input):
|
||||
from smnp.ast.node.ret import ReturnParser
|
||||
from smnp.ast.node.throw import ThrowParser
|
||||
|
||||
return Parser.oneOf(
|
||||
IfElseStatementParser,
|
||||
ExpressionParser,
|
||||
BlockParser,
|
||||
ReturnParser,
|
||||
ThrowParser,
|
||||
name="statement"
|
||||
)(input)
|
||||
return withSemicolon(
|
||||
Parser.oneOf(
|
||||
IfElseStatementParser,
|
||||
ExpressionParser, # Must be above BlockParser because of Map's syntax with curly braces
|
||||
BlockParser,
|
||||
ReturnParser,
|
||||
ThrowParser,
|
||||
name="statement"
|
||||
), optional=True)(input)
|
||||
|
||||
|
||||
def withSemicolon(parser, optional=False, doAssert=False):
|
||||
semicolonParser = Parser.optional(Parser.terminal(TokenType.SEMICOLON)) if optional else Parser.terminal(
|
||||
TokenType.SEMICOLON, doAssert=doAssert)
|
||||
|
||||
return Parser.allOf(
|
||||
parser,
|
||||
semicolonParser,
|
||||
createNode=lambda stmt, semicolon: stmt,
|
||||
name="semicolon" + "?" if optional else ""
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user