PLY中词法识别ASSIGN Token但语法分析报错的问题排查
PLY语法解析报错“illegal token =”排查思路
- 核对语法规则与词法Token名的一致性
确认词法定义的Token名是ASSIGN后,检查所有语法规则中是否统一使用ASSIGN来指代赋值符号=,避免出现语法里写EQUALS但词法输出ASSIGN的名称不匹配情况,PLY对Token名的大小写、拼写严格敏感。 - 检查语法规则是否覆盖赋值语句场景
测试代码中的int r = 1;是变量声明+赋值的结构,需确认语法规则中是否有对应处理逻辑,比如是否定义了类似declaration : TYPE ID ASSIGN expr ';'的规则。若语法规则完全没涉及ASSIGNToken,解析器遇到时会直接判定为非法token。 - 验证Token列表是否包含ASSIGN
确保在PLY的tokens全局列表中明确列出ASSIGN,PLY仅会处理该列表内的Token,哪怕词法能识别,未加入列表的Token在语法解析阶段会被视为非法。 - 手动打印词法分析结果确认输出
不要仅凭主观判断,通过代码打印实际Token流,确认=对应的确实是ASSIGN:
排查是否存在词法规则冲突,导致lexer = lex.lex() lexer.input("main factorial_iterativo() { int r = 1;}") while True: tok = lexer.token() if not tok: break print(f"{tok.type}: {tok.value}")=被其他规则意外匹配成了别的Token。 - 排查语法规则的优先级与冲突
若Token本身无问题,可自定义错误处理函数打印解析状态,查看当前Token栈和待匹配Token的情况,排查是否因移进/归约冲突、优先级设置不当导致解析器无法识别ASSIGN:def p_error(p): if p: print(f"Error at token {p.type}: {p.value}, position {p.lexpos}") # 打印当前解析栈 print("Parser stack:", [symbol.type for symbol in parser.symstack]) else: print("Unexpected end of input") parser.error = p_error - 检查词法规则的精确性
确保ASSIGN的正则表达式是精确匹配=(比如r'='),避免存在其他规则的正则(如r'=.+')会优先匹配包含=的更长字符串,导致单独的=无法被识别为ASSIGN。
内容的提问来源于stack exchange,提问作者javier alejandro
相关产品推荐
相关产品推荐

