Lex文件Assi6.l无法执行,请求排查第13行错误
Flex文件(Assi6.l)无输出问题排查
问题背景
作业要求用YACC+Flex实现编译器语法分析阶段,验证C语言变量声明的类型与语法。编写的Assi6.l文件无法执行且无输出,需排查第13行问题。
原代码
%{ #include<stdio.h> #include<y.tab.h> int a; %} datatype int|float|char|string|boolean digits [0-9] letters [A-Za-z] identifiers {letters}({letters}|{digits})* comma , SC ; %% {datatype}{return datatype;} {identifiers}{return identifiers;} {comma} {return comma;} {SC} {return SC;} \n {return 0;} %%
核心问题(第13行)
第13行{datatype}{return datatype;}违反了Flex规则的语法要求:正则模式和对应的动作代码之间必须有空格或换行分隔。
没有空格的情况下,Flex会把{datatype}{return datatype;}整体解析成一个正则表达式,而非"匹配datatype后执行return动作",导致这条规则完全不生效。第14行的标识符规则也存在同样问题。
其他影响运行的问题
- 未处理空白字符(空格、制表符):输入中的空格、Tab会被视为未匹配字符,导致扫描中断或异常
- 记号未定义:
datatype、identifiers等返回值需要在YACC语法文件中通过%token指令提前定义,否则编译时会出现未定义错误 - 非标准类型:
string、boolean不是标准C的基本数据类型,若要兼容标准C语法需调整
修正后的代码示例
%{ #include<stdio.h> #include<y.tab.h> %} datatype int|float|char|string|boolean digits [0-9] letters [A-Za-z] identifiers {letters}({letters}|{digits})* comma , SC ; %% {datatype} { return datatype; } {identifiers} { return identifiers; } {comma} { return comma; } {SC} { return SC; } [ \t] { /* 忽略空白字符 */ } \n { return 0; } . { /* 处理未匹配字符,可选 */ } %%
内容的提问来源于stack exchange,提问作者Pooja Jadhav
相关产品推荐
相关产品推荐

