PLY:C解析器中的令牌转移问题
我正在使用PLY编写C解析器,最近遇到了问题。
这段代码:
typedef int my_type; my_type x;
是正确的C代码,因为my_type之前被定义为类型
被这样使用。我通过在
词法分析器用来区分类型和类型的解析器
简单标识符。
然而,尽管类型声明规则以SEMI(";"令牌)结尾,但PLY在确定它是由第一行完成之前将令牌my_type从第二行移开。因此,我没有机会将类型符号表中的更新传递给词法分析器及其
将my_type视为标识符而不是类型。
有任何解决办法吗?
完整的代码位于:http://code.google.com/p/pycparser/source/browse/trunk/src/c_parser.py
不知道该如何创建一个较小的示例。
编辑:
问题解决了。请参阅下面的我的解决方案。
解决方案
我认为我们需要将ID是否为TYPEID的检查从c_lexer.py移至c_parser.py。
如我们所说,由于解析器正在寻找1个令牌,因此我们无法在词法分析器中做出该决定。
相反,更改解析器以检查ID,以查看它们是否为声明中的TYPEID,如果不是,则生成错误。
正如Pax Diablo在他的出色回答中所说,词法分析器/令牌生成器的工作不是就令牌做出此类决定。那就是解析器的工作。
不知道为什么要在词法分析器中进行这种级别的分析。
词法分析可能应该用于将输入流分离为词法标记(数字,换行,关键字等)。在分析阶段应该是在分析阶段,包括对typedef等的表查找。
这就是我一直将lexx和yacc(我选择的工具)之间的职责分开的方式。
在Dave Beazley(PLY的创建者)的帮助下,我的问题得以解决。
这个想法是使用特殊的子规则并在其中执行操作。就我而言,我将"声明"规则拆分为:
def p_decl_body(self, p): """ decl_body : declaration_specifiers init_declarator_list_opt """ # <<Handle the declaration here>> def p_declaration(self, p): """ declaration : decl_body SEMI """ p[0] = p[1]
总是在移入SEMI之后的令牌之前减少decl_body
,因此我的操作会在正确的时间执行。