37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
from smnp.ast.node.extend import ExtendParser
|
|
from smnp.ast.node.function import FunctionDefinitionParser
|
|
from smnp.ast.node.imports import ImportParser
|
|
from smnp.ast.node.model import Node, ParseResult
|
|
from smnp.ast.node.statement import StatementParser
|
|
from smnp.ast.parser import Parser
|
|
from smnp.error.syntax import SyntaxException
|
|
|
|
|
|
class Program(Node):
|
|
def __init__(self):
|
|
super().__init__((-1, -1))
|
|
|
|
def ProgramParser(input):
|
|
def parse(input):
|
|
root = Program()
|
|
|
|
# Start Symbol
|
|
startSymbolParser = Parser.oneOf(
|
|
ImportParser,
|
|
FunctionDefinitionParser,
|
|
ExtendParser,
|
|
StatementParser,
|
|
exception=lambda inp: SyntaxException(f"Invalid statement: {inp.currentToEndOfLine()}", inp.current().pos),
|
|
name="start symbol"
|
|
)
|
|
|
|
while input.hasCurrent():
|
|
result = startSymbolParser(input)
|
|
|
|
if result.result:
|
|
root.append(result.node)
|
|
|
|
return ParseResult.OK(root)
|
|
|
|
return Parser(parse, name="program")(input)
|