YACC报错解析:‘tac.y’第85行产生式左部出现token的含义
理解YACC报错:
a token appears on the lhs of a production 错误的核心含义
这个报错直白点说就是:你把一个终结符(token)放到了产生式的左部(LHS),但YACC的语法规则明确要求——产生式的左部必须是非终结符(non-terminal),也就是用来推导其他语法单元的符号,而不是直接对应输入里实际存在的标记(比如关键字、标识符这类token)。
你的代码问题出在哪
看你提供的代码片段:
%union{ struct attribute{ char name[20]; char type[20]; }attr; } %token <attr> ID %token <attr> E %token <attr> T // 这里是关键错误!
你用%token把T声明成了一个终结符,但在第85行的产生式里:
T: INT { strcpy($$.type,"int"); } | REAL { strcpy($$.type,"real"); }
你又把T作为产生式的左部,这就完全冲突了。YACC会认为T是一个要从输入里读取的标记,而不是一个可以用来定义语法规则的非终结符,所以直接抛出了这个错误。
修复方案
把T的声明从%token改成%type就行,因为T是你用来推导类型(INT/REAL)的非终结符,需要用%type来关联它的属性:
%union{ struct attribute{ char name[20]; char type[20]; }attr; } %token <attr> ID %token <attr> E %type <attr> T // 修正为%type
这样YACC就会把T识别为非终结符,允许它出现在产生式的左部,你的语法规则就能正常工作了。
内容的提问来源于stack exchange,提问作者vinoth gopi
相关产品推荐
相关产品推荐

