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

