PLY:C解析器中的令牌转移问题

时间:2020-03-06 14:28:58  来源:igfitidea点击:

我正在使用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,因此我的操作会在正确的时间执行。