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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:39:22