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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:28:20