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

Yacc(Bison)语法解析报错:输入=却提示期待=符号求助

问题根源与解决方法

核心问题

你的Flex词法分析器没有将=符号返回给Yacc解析器,导致解析器从未接收到=这个关键token,因此一直报错"expecting ="。

具体看Flex代码中的assign规则:

{assign} {printf("Assignment Operator\n");}

这里只打印了日志,但没有返回任何token给Yacc。Yacc的语法规则S : id "=" E期望接收到'='字符token,但Flex根本没传递这个信号,解析器自然认为=从未出现。

另外,你的arith规则同样存在这个问题:匹配到+、-等运算符时,只打印日志不返回对应token,后续测试a=5+6这类带加减的表达式也会失败。

修复步骤

1. 修复Flex的运算符返回逻辑

修改Flex中assign和arith的处理块,添加对应的token返回语句:

{assign} {
    printf("Assignment Operator\n");
    // 对于单纯的=,直接返回'=';如果需要支持复合赋值(如+=),需在Yacc中扩展语法
    if (strcmp(yytext, "=") == 0) {
        return '=';
    }
    // 其他复合赋值可根据需求处理,暂时忽略或报错
}

{arith} {
    printf("Arithmetic Operator\n");
    // 返回对应的运算符字符
    return yytext[0];
}

2. 修正INT的正则匹配(可选但重要)

当前Flex中INT的正则是[-]?[0-9]+,会直接匹配带负号的整数(如-4),但Yacc语法中已经定义了一元负号UMINUS规则,应该让Flex只匹配非负整数,负号交给Yacc处理:

INT [0-9]+

这样输入-4时,Flex会先返回'-' token,再返回INT token,Yacc就能正确匹配"-" E %prec UMINUS规则。

3. 验证修改效果

修复后,测试a=0时,Flex会依次返回:

  1. id token(对应a)
  2. '=' token
  3. INT token(对应0)
    Yacc解析器就能正确匹配S : id "=" E规则,不会再报错。

额外注意点

  • 你的Yacc代码中定义了ID token但从未使用,建议清理冗余定义,避免混淆。
  • 确保strdup的内存后续正确释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Stack Overflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:10:53