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

如何编写匹配元音开头辅音结尾可含数字的lex程序并修复代码报错

Lex程序报错原因及符合需求的修复方案

现有代码的错误列表

  • 正则定义区语法错误:自定义正则的名称和表达式之间必须保留空格,你写的word({character}|{digit})+、line\n都没有加空格,是触发unrecognized rule报错的核心原因;另外character [a-zA-z]的范围写法错误,大写Z到小写a之间包含特殊字符,正确范围应为[a-zA-Z]
  • 变量初始化错误:int cno=0, wno=0, lno=o;中lno的初始值是字母o不是数字0,编译会报错
  • 规则区逻辑完全不符合需求:现有规则全部只匹配换行,还重复写了两次{line}匹配规则,动作块语法也存在混乱,完全没有实现「元音开头、辅音结尾、允许包含数字」的匹配逻辑
  • 主函数语法错误:C语言标准输出函数是printf不是print
  • 缺少yywrap函数实现:lex默认需要该函数,要么编译时加-lfl参数,要么在代码中自行实现

符合需求的完整修正代码

%{
#include<stdio.h>
#include<string.h>
int match_cnt = 0; // 符合要求的单词计数
int total_match_char = 0; // 匹配到的总字符数
int line_cnt = 0; // 输入总行数
%}

vowel [aeiouAEIOU]
consonant [b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z]
alnum [a-zA-Z0-9]

%%
\n                      { line_cnt++; }
{vowel}{alnum}*{consonant} { 
    match_cnt++;
    total_match_char += strlen(yytext);
    printf("匹配到符合规则的单词:%s\n", yytext);
}
.                       { /* 忽略其他不匹配的字符 */ }
%%

int yywrap() {
    return 1;
}

int main(void)
{
    yylex();
    printf("符合规则的单词总数:%d\n", match_cnt);
    printf("匹配到的总字符数:%d\n", total_match_char);
    printf("输入文本总行数:%d\n", line_cnt);
    return 0;
}

编译运行方法

  • 保存代码为match_word.l
  • 生成C代码:lex match_word.l
  • 编译生成可执行文件:gcc lex.yy.c -o match_word -lfl
  • 运行程序:./match_word,输入文本后按Ctrl+D(Windows系统按Ctrl+Z)结束输入即可得到统计结果

内容的提问来源于stack exchange,提问作者Dheemaan Daash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 12:12:03