Ejemplo n.º 1
0
def toFlatDesiredNode(iterableNodeType, parser):
    def parse(input):
        result = parser(input)

        if result.result:
            value = flattenList(result.node)
            node = iterableNodeType(result.node.pos)
            node.children.clear()
            for v in value:
                node.append(v)
            return ParseResult.OK(node)

        return ParseResult.FAIL()

    return Parser(parse, "flat", [parser])
Ejemplo n.º 2
0
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)