You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:41:06