Ubuntu下运行Lex&Yacc程序时遇‘parser name defined to default:"parse"’错误求助
问题解决:Yacc报错「parser name defined to default :"parse"」
错误根源
Ubuntu系统中yacc命令默认指向的是byacc(Berkeley Yacc),而非你安装的bison(GNU Yacc)。两者默认生成的解析器函数名不匹配:
- byacc 默认生成
parse()函数 - bison 默认生成
yyparse()函数
你的代码里调用的是yyparse(),和byacc的默认设定冲突,因此触发该错误提示。
修复方案
1. 切换使用bison编译语法文件
直接用bison命令替代yacc,确保生成匹配代码调用的解析器函数:
bison -d 1b.y
2. 修正代码中的语法/声明问题
你的代码存在几处小问题,需调整才能正常运行:
(1)1b.lex中yylval的声明补全
原代码缺少类型声明,修改为:
%{ #include "y.tab.h" extern int yylval; // 补充int类型 %}
(2)1b.y中语法规则的换行修正
原代码中input和exp规则连写导致语法错误,拆分换行:
%% input:exp {printf("%d\n",$$);exit(0);} exp:exp'+'exp {$$=$1+$3;} |exp'-'exp{$$=$1-$3;} |exp'*'exp{$$=$1*$3;} |exp'/'exp { if($3==0){printf("Divide by Zero\n");exit(0);} else $$=$1/$3;} |'('exp')'{$$=$2;} |num{$$=$1;}; %%
(3)1b.y中yyerror函数的参数补全
标准yyerror需要接收字符串参数,修正为:
int yyerror(char *s) { printf("error: %s\n", s); exit(0); }
3. 完整编译运行流程
按以下命令顺序执行:
# 处理词法文件 flex 1b.lex # 处理语法文件并生成头文件 bison -d 1b.y # 编译生成可执行程序 gcc lex.yy.c y.tab.c -o calculator # 运行计算器 ./calculator
安装步骤优化说明
你安装的工具中,flex+bison已完全满足需求,无需重复安装byacc(你执行了两次install byacc命令),建议保留flex和bison即可。
内容的提问来源于stack exchange,提问作者Brain Damage
相关产品推荐
相关产品推荐

