当前位置: 首页>>代码示例>>Python>>正文


Python Register.add_parsers方法代码示例

本文整理汇总了Python中register.Register.add_parsers方法的典型用法代码示例。如果您正苦于以下问题:Python Register.add_parsers方法的具体用法?Python Register.add_parsers怎么用?Python Register.add_parsers使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在register.Register的用法示例。


在下文中一共展示了Register.add_parsers方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。

示例1: parse

# 需要导入模块: from register import Register [as 别名]
# 或者: from register.Register import add_parsers [as 别名]
def parse(stream, register_map, register=None, parsers=None, state=None, builder=None, document_root=False):
    if builder is None:
        builder = TreeBuilder()

    # prepare the stream for parsing
    if isinstance(stream, str):
        stream = stream.decode('utf-8')
    stream = stream.replace('\r\n', '\n').replace('\r', '\n')  # normalize newlines

    if builder.root is None:
        if document_root is True:
            from document import DocumentNode
            builder.set_root(DocumentNode())
            hack_root = False
        else:
            from node import Node
            builder.set_root(Node())
            hack_root = True
    else:
        hack_root = False

    remembered_actual_node = builder.actual_node

    if register is None:
        register = Register([p for p in register_map])
        register.visit_register_map(register_map)
        if parsers is not None:
            register.add_parsers(parsers)

    opened_text_node = None

    whole_stream = stream
    while len(stream) > 0:
        assert isinstance(stream, unicode) == True, stream
        try:
            macro, stream_new = register.resolve_macro(stream, builder, state, whole_stream)
            if macro is not None and stream_new is not None:
                # negation in effect?
                if opened_text_node is not None and opened_text_node.content.endswith(NEGATION_CHAR):
                    # don't forget to eat negation char!
                    opened_text_node.content = opened_text_node.content[:-1]
                    raise ParserRollback("Negation resolved")

                logging.debug('Resolved macro %s' % macro)
                stream_new = register_map.pre_hooks(stream_new, macro, builder)
                macro.expand(builder=builder, state=state)
                register_map.post_hooks(macro, builder)
                stream = stream_new
                opened_text_node = None
            else:
                #logging.debug('Macro not resolved, add text node')
                node, stream = _get_text_node(stream, register, register_map, builder, state, opened_text_node=opened_text_node, whole_stream=whole_stream)
                if opened_text_node is None:
                    builder.append(node, move_actual=False)
                opened_text_node = node
        except (ParserRollback, MacroCallError):
            # badly resolved macro
            logging.debug('ParserRollback caught, forcing text char')
            node, stream = _get_text_node(stream, register, register_map, builder, state, True, opened_text_node=opened_text_node, whole_stream=whole_stream)
            if opened_text_node is None:
                builder.append(node, move_actual=False)
            opened_text_node=node

    if hack_root is True:
        builder.move_up()

    # make sure that we have ended where we have begun
    assert builder.actual_node == remembered_actual_node, "remembered %s, but actual node is %s" % (remembered_actual_node, builder.actual_node)

    if hack_root is False:
        return builder.root
    else:
        return builder.root.children
开发者ID:Almad,项目名称:sneakylang,代码行数:75,代码来源:parser.py


注:本文中的register.Register.add_parsers方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。