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
相关产品推荐
相关产品推荐

