众所周知,PLY试图实现Lex和Yacc在Python中所做的事情。我想知道该库是否提供了一种方法来解析/转换/转换.l(lex文件)或.y(yacc文件)本身到PLY使用的语法定义。
这是我用.l和.y文件的用例,我现在想用PLY解析用上述语言编写的文件,这样我就可以像原始语言一样处理令牌定义说明它是。
答案 0 :(得分:2)
不是我知道的。
语法规范非常相似,通常可以复制和粘贴。请注意,Ply解析器函数p_*
对应于单个产品,而不是非终端; Ply允许您将两个制作组合成相同的动作功能,以防动作相同,但对于机械翻译,最好从每个制作开始一个功能并稍后进行优化。另请注意,Ply没有实现默认操作$$ = $1
(Ply术语中的p[0] = p[1]
),因此必须明确这些操作(在这种情况下,所有具有默认操作的产品都可以合并为一个解析器)动作功能。)
Ply没有实施中规则行动;如果您现有的yacc / bison解析器依赖于它们,则必须将其删除。 Bison的-v
输出在这里很有用。
由于Ply依赖于Python的正则表达式库,因此可能需要更改正则表达式,特别是如果它们使用(f)lex宏定义。此外,在Ply中使用模式正则表达式变量会改变模式接受顺序;你可能想在一开始就避免这些。 (即使使用模式功能,Ply也不会实现最大咀嚼,但至少可以控制接受顺序。)
与(F)lex不同,Ply无法优化大量正则表达式。在(F)lex扫描仪定义中,通常使用每个关键字的单独模式,依靠扫描仪生成器来生成实际上高效的类似trie的状态机。 Ply无法做到这一点,并且使用大量模式可能会对性能产生重大影响(尽管如此,词汇分析现在很少成为性能瓶颈。)