You need to enable JavaScript to run this app. 开发运算符识别程序时执行bison -yd cy命令未生成y.tab.c文件
优惠活动
大模型
产品
解决方案
定价
更多

开发运算符识别程序时执行bison -yd cy命令未生成y.tab.c文件

编译失败的核心原因

第一类:操作命令的低级错误

首先最容易忽略的是,你输入的编译命令根本没指向你的p3.y文件
你现在执行的命令是bison -yd cy,参数里指定要处理的文件是cy,完全不是你编写的语法源码文件p3.y,Bison根本读取不到你的语法内容,自然不可能生成预期的y.tab.c文件。正确的基础编译命令应该是明确指定输入源文件:bison -yd p3.y。

第二类:p3.y源码本身的语法错误,会直接让Bison编译中断

就算你把命令里的文件名改对,以下问题也会让Bison直接抛出语法错误、终止运行,根本走不到生成输出文件的步骤:

  • 引用了从未声明的Token:在operador_asignacion规则里用到了MINUSEQUAL,但你在文件开头的Token声明列表里根本没提过这个标记,Flex词法文件里也没有对应"-="的匹配分支返回这个token,Bison遇到未定义的标识符会直接报语法错误。
  • 规则书写时的字符拼接错误:在expresion_logica规则里,你写了expresion '<''> ' expresion,这里把小于、大于两个字符字面量错误挤在了一起,还多打了空格,Bison解析时会把这段内容识别为非法的字符常量,直接触发解析失败。
  • 结合性声明逻辑错误:你把右括号)设为左结合、左括号(设为右结合,完全和常规括号的匹配逻辑相反,加上你提前写了%expect 2表示预期只有2个冲突,实际生成的冲突数远大于这个值的话,Bison会直接返回非0退出码。
  • 代码块的头文件缺失:%{引入的C代码里只用了stdio.h,后续用到的字符串操作函数(strncpy、strcat等)需要引入string.h,这个问题不影响Bison生成y.tab.c,但会在后续gcc编译阶段报未定义引用的错误,属于提前要修的隐患。

第三类:Flex文件的联动适配问题

你的p3.l里存在和语法文件不匹配的逻辑,就算Bison顺利生成了y.tab.c,后续编译运行也会出问题:

  • 根本没有写"/*"的匹配分支来进入多行注释状态,定义的COMENTARIOML状态从头到尾没有被触发过,属于冗余无效代码。
  • 没有"-="的匹配规则,就算Bison里声明了MINUSEQUAL,词法分析阶段也识别不到这个操作符,会导致后续语法分析时报错。
修正流程
  1. 把编译命令的输入参数改成正确的p3.y,先确保Bison能读到你的语法源文件,这是最基础的前提。
  2. 在p3.y的Token声明区补上缺失的MINUSEQUAL标记声明,让Bison认识这个自定义标记。
  3. 把expresion_logica里错误拼接的<>规则改成正确的关系判断规则,对应你词法里识别的">="、"<="这类操作符。
  4. 删掉不合理的括号结合性声明,不要单独为(、)设置左右结合属性,避免生成大量无意义的冲突。
  5. 在p3.l里补充"-="的匹配分支,返回MINUSEQUAL,同时补上"/*"触发进入多行注释状态的规则,让之前定义的COMENTARIOML状态能正常工作。
  6. 在p3.y的开头C代码块里补上#include <string.h>,解决后续gcc编译时的字符串函数未声明问题。

内容的提问来源于stack exchange,提问作者daniel flores cruz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 08:45:04