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

Bison解析器多行输入报$end错误:原因及解决办法求助

问题解答

1. $end的含义

$end是Bison内置的标记,代表输入流的结束。报错信息里的"expecting $end",意思是解析器处理完第一个符合语法的语句后,认为输入应该到此结束,但它又读取到了第二行的内容(比如a=0开头的id),因此触发语法错误。

2. 解决方法

你的语法规则中,起始符号S仅定义了单个赋值语句,解析器处理完一个S后就期望输入结束。要支持多行输入(多个语句),需要修改语法规则,让起始符号可以匹配多个语句,示例如下:

修改后的核心语法规则

%%
// 定义可以匹配多个语句的起始符号
S_list : S
       | S_list '\n' S   // 支持换行分隔多个语句
       | S_list ';' S    // 支持分号分隔多个语句
       ;

// 原有的单个语句规则保持不变,添加换行输出提升可读性
S : id assign E { $$ = newOpNode($2, newIDNode($1), $3); printSyntaxTree($$); printf("\n"); }
  ;

// 原有的表达式规则E保持不变
E : E arith E { $$ = newOpNode($2, $1, $3); }
  | "(" E ")" { $$ = $2; }
  | "-" E %prec UMINUS { $$ = newOpNode(UMINUS, 0, $2); }
  | id { $$ = newIDNode($1); }
  | INT { $$ = newIntNode($1); }
  | FLOAT { $$ = newDoubleNode($1); }
  ;
%%

额外注意事项

  • 确保Flex词法分析器正确处理换行符,将\n作为独立标记返回,这样语法规则才能识别换行作为语句分隔符。
  • 你的语法树代码中OP_NODE被定义为'+',但算术运算符不止+,建议将OP_NODE改为独立标识(比如'O'),然后在printSyntaxTree函数中根据value.op输出具体运算符,避免符号混淆。

内容的提问来源于stack exchange,提问作者Hello World

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:14:56