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

Python PLY:C解析器中的令牌转移问题,python,parsing,yacc,ply,Python,Parsing,Yacc,Ply,我正在使用PLY编写一个C解析器,最近遇到了一个问题。 此代码: typedef int my_type; my_type x; 是正确的C代码,因为my_类型是以前定义为 这样使用的。我通过在 词法分析器用来区分类型和类型的解析器 简单标识符 但是,尽管类型声明规则以SEMI(“;”标记)结尾,PLY在决定是否使用第一行之前将标记my_type从第二行移动。因此,我没有机会将类型符号表中的更新传递给lexer和它 将my_类型视为标识符而不是类型 有什么解决办法吗 完整代码位于: 我不知道如

我正在使用PLY编写一个C解析器,最近遇到了一个问题。 此代码:

typedef int my_type;
my_type x;
是正确的C代码,因为my_类型是以前定义为 这样使用的。我通过在 词法分析器用来区分类型和类型的解析器 简单标识符

但是,尽管类型声明规则以SEMI(“;”标记)结尾,PLY在决定是否使用第一行之前将标记
my_type
从第二行移动。因此,我没有机会将类型符号表中的更新传递给lexer和它 将my_类型视为标识符而不是类型

有什么解决办法吗

完整代码位于: 我不知道如何从中创建一个较小的示例

编辑:


问题解决了。请参阅下面的解决方案。

我认为您需要将ID是否为TYPEID的检查从c_lexer.py移到c_parser.py

正如您所说的,因为解析器正在展望1个令牌,所以您不能在lexer中做出决定

相反,改变解析器来检查ID,看看它们在声明中是否是TYPEID,如果不是,则生成一个错误


正如Pax Diablo在其出色的回答中所说,lexer/tokenizer的工作不是对代币做出这样的决定。这是解析器的工作。

不确定为什么要在词法分析器中进行这种级别的分析

词法分析可能用于将输入流分离为词法标记(数字、换行、关键字等)。解析阶段应该进行这种级别的分析,包括对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]
def p_decl_body(self,p):
“”“decl\u body:declaration\u specifiers init\u declarator\u list\u opt”
"""
#         
def p_声明(自我,p):
“声明:decl_body SEMI
"""
p[0]=p[1]

decl\u body
总是在SEMI移入令牌之前减少,因此我的操作会在正确的时间执行。

我同意。每当我遇到这些问题时,通常是因为我试图让lexer做得太多了。但是我现在使用ANTLR而不是LEX和YACC(不太老,无法更改)。