重新初始化 PLY 解析器

Posted

技术标签:

【中文标题】重新初始化 PLY 解析器【英文标题】:re-initializing PLY parser 【发布时间】:2016-12-21 00:36:46 【问题描述】:

我使用 PLY 编写了一个解析器,它可以满足我的需要。 现在,我想使用解析器类解析多个文件。 我不想为每个文件实例化解析器类,而是对所有文件重复使用相同的实例化类(这样我就可以在解析器类中积累一些结果)。

一个文件的解析可能无法很好地完成,因此我想在输入另一个文件之前重新初始化解析器。

的正确方法是什么? (或者,我不应该重用解析器?)

【问题讨论】:

(免责声明:我不使用 PLY。)如果您举例说明您想要保留的数据类型以及原因,您可能会得到更多答案。如果 PLY 确实 有一个安全的重新初始化方法,我怀疑它会留下 un-重新初始化您想要保留的确切值。 ...就此而言,将每个解析器中要保留的数据累积在字典中,或者每个解析文件在一个字典中,不是更好吗? 我正在编写一个 Verilog 解析器,它将处理多个 Verilog 文件。其中一些可能包含错误,因此解析器在解析文件时可能会以有趣的状态停止。我认为重用解析器可能是个好主意,这样就不需要拆除解析器对象并构建一个新的解析器对象。此外,我可以保留类中多个输入文件的解析结果。 “其中一些可能包含错误,因此解析器可能会在一个有趣的状态下停止”,结合“我可以保留来自多个输入文件的解析结果”,听起来你会从第一个混合错误种文件入二中效果不错。但是我不在我的领域,所以我会把这个问题留给其他人。不过,我建议您 edit 您对问题的评论中的详细信息 --- 他们不会在这里被注意到。 Pyparsing 包括一个 verilog 解析器作为其示例的一部分 - 即使您仍然选择使用 PLY,此代码也可以让您深入了解您在自己的解析器实现中需要什么。 【参考方案1】:

如果你想对多个文件重用同一个解析器,但每次都重置堆栈,你可以使用restart函数:

parser = yacc.yacc()
for file in file_list:
    with open(file) as fp:
       parser.parse(fp.read())
       ... # accumulate logging info
       parser.restart() # this discards the entire parsing stack and resets the parser to its initial state

更多信息请访问official documentation。

【讨论】:

以上是关于重新初始化 PLY 解析器的主要内容,如果未能解决你的问题,请参考以下文章

ORB_SLAM2 源码解析 单目初始化器Initializer

重新加载 rails 初始化器

在 Android 8 之前的应用程序重新启动后,AltBeacon 未检测到 iBeacon

动态重新初始化或销毁 Bootstrap 日期选择器

SpringBoot初始化器解析

python词法语法解析模块ply