为什么以下LEX程序未打印“令牌数”

时间:2019-09-15 14:51:04

标签: flex-lexer

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

%{
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;
}

1 个答案:

答案 0 :(得分:1)

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

如果您想表示没有更多数据,则需要从yywrap()返回1。

最好放置

来避免使用yywrap
%option noyywrap

在弹性序言中。


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