首页 > 解决方案 > 为什么以下 LEX 程序不打印“令牌数量”

问题描述

我的代码正在打印标识符、分隔符和所有其他内容,但它没有打印令牌的数量。无法指出问题所在。

%{
int n=0;
%}
%%
"while"|"if"|"else"|"printf" {
n++;
printf("\t keywords : %s", yytext);}
"int"|"float" {
n++;printf("\t identifier : %s", yytext);
}

"<="|"=="|"="|"++"|"-"|"*"|"+" {
n++;printf("\t operator : %s", yytext);
}

[(){}|, ;]     {n++;printf("\t seperator : %s", yytext);}

[0-9]*"."[0-9]+ {
n++;printf("\t float : %s", yytext);
}

[0-9]+ {  
n++;printf("\t integer : %s", yytext);
}
.;
%%
int main(void)
{
yylex();
printf("\n total no. of tokens = %d\n",n);
}
int yywrap()
{
return 0;
}

标签: flex-lexer

解决方案


如果yywrap()返回 0,则词法分析器假定yywrap()已经以某种方式安排了yyin更多数据,并且词法分析器将继续读取输入。所以你的词法分析器永远不会终止。

如果您想发出没有更多数据的信号,则需要从yywrap().

最好yywrap通过放置来避免需要

%option noyywrap

在 flex 的序幕中。


我通常使用%option noinput nounput noyywrap,它消除了一些编译器警告,假设你要求编译器警告,你应该总是这样做。还%option nodefault可以帮助您找到 lex 规范错误,因为如果某些输入没有匹配规则,它会报错。(对于无法识别的输入,默认的 (f)lex 操作是简单地将不匹配的字符写入标准输出。这通常不是很有帮助,而且与错误消息不同,它很容易错过。)最后,%option 8bit仅当您请求时才需要为速度而不是表大小优化的词法分析器。但是添加它并没有什么坏处,如果您(或某人)有一天决定尝试更快的扫描仪骨架,它可能会让您免于尴尬的错误。(不推荐,除非在非常特殊的情况下。)


推荐阅读