有没有办法解析PLX中的lex和yacc文件(Python Lex-Yacc)

时间:2017-12-01 06:25:44

标签: compiler-construction yacc lex ply

众所周知,PLY试图实现Lex和Yacc在Python中所做的事情。我想知道该库是否提供了一种方法来解析/转换/转换.l(lex文件)或.y(yacc文件)本身到PLY使用的语法定义。

这是我用.l和.y文件的用例,我现在想用PLY解析用上述语言编写的文件,这样我就可以像原始语言一样处理令牌定义说明它是。

1 个答案:

答案 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无法做到这一点,并且使用大量模式可能会对性能产生重大影响(尽管如此,词汇分析现在很少成为性能瓶颈。)