如何编写匹配元音开头辅音结尾可含数字的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
相关产品推荐
相关产品推荐

