Flex&Bison简易解析器编译正常但输出不符预期求助
我最近在用Flex和Bison搭建一个简易解析器,编译环节一切正常,也能生成对应的输出文件,但运行时的结果完全不符合预期。比如当我输入Integer X := 13时,程序会抛出语法错误,紧接着下一行还会输出13,这和我预想的行为完全相悖。
以下是我目前的词法分析器代码(部分内容未粘贴完整):
%{ #include <stdio.h> #include <stdlib.h> #include "y.tab.h" int yyerror(char *errormsg); %} number [0-9] digit {number}+ letter [a-zA-Z] bigletter [A-Z] any [a-zA-Z0-9] identifier {bi...
问题排查方向&解决方案
从你遇到的现象和给出的代码片段来看,核心问题大概率出在词法规则定义不完整、token匹配优先级错误,或者语法规则不匹配上,我给你梳理几个关键排查点:
补全标识符规则:你代码里的
identifier {bi...明显未完成,推测你想定义以大写字母开头的标识符?比如正确的规则应该是identifier {bigletter}{any}*,如果规则残缺,Flex无法正确识别X这个标识符,直接导致Bison语法匹配失败。关键字优先匹配:
Integer作为关键字,必须放在标识符规则之前定义,否则Flex会优先匹配更长的标识符规则,把Integer当成普通标识符处理。示例规则:"Integer" { return INTEGER; }复合符号的词法定义:
:=是一个整体的赋值符号,需要单独定义规则,不能让Flex拆成:和=两个独立token:":=" { return ASSIGN; }否则你的语法规则(比如
declaration : TYPE ID ASSIGN NUMBER ;)会因token不匹配直接抛出语法错误。数字token的处理逻辑:你定义了
digit规则,但没指定对应的动作。需要把数字文本转换成数值并传递给Bison,同时返回对应的token:{digit} { yylval = atoi(yytext); return NUMBER; }缺失这一步的话,Flex可能直接输出数字文本,就会出现你看到的单独输出
13的情况。开启调试模式定位问题:
- Flex编译时加
-d参数,生成的调试信息会显示每个输入字符被匹配成了什么token; - Bison编译时加
-d -v参数,生成的y.output文件会详细展示语法分析的状态流转,帮你快速找到匹配失败的节点。
- Flex编译时加
内容的提问来源于stack exchange,提问作者John Joshua Cruz Mascareñas

