2012-04-24 96 views
-1

我正在实现一个解析器,其中扫描器(使用Flex实现)不能一次识别所有的令牌。它只是从输入中取出第一个令牌并终止。有人可以帮我理清这一点。这是我的 “.lex” 文件:Flex中的令牌识别错误

%{ 
/* need this for the call to atof() below */ 
#include <math.h> 
#include<string.h> 
#include "parser.h" 
#include "idf.tab.h" 
char findname (char *yytext) { return yytext[0]; } 
%} 

DIGIT [0-9] 
ID  [a-zA-Z]* 
%option noyywrap 

%% 

{ID} | 
-?{DIGIT}+"."{DIGIT}* | 
-?{DIGIT}+ { printf("ID or number:%s\n",yytext); /*yylval.a_variable = (char*)findname(yytext);*/ return TOKID;} 

";"  { printf("Semicolon\n"); return TOKSEMICOLON; } 
":"  { printf("Colon\n"); return TOKCOLON;} 
","   return TOKCOMMA; 
"."   return TOKDOT; 
"-"   return TOKMINUS; 

[ \t\n]   /* eat up whitespace */ 
.  return TOKUNRECOG; 

%% 

int main(int argc,char* argv[]) 
{ 
++argv, --argc; 
if (argc > 0) 
yyin = fopen(argv[0], "r"); 
else 
yyin = stdin; 

yylex(); 
} 

例如,如果我给输入作为abc;预期输出应该是:

ID or number: abc 
Semicolon 

但实际产量为:

ID or number: abc 

也就是说,它只是识别第一个令牌abc并终止而不识别分号。而如果输入的是刚刚;然后输出

Semicolon 
+0

听起来像程序正在做你所指定的 - 它调用'yylex'来读取一个令牌,然后退出。 – 2012-04-24 05:39:36

回答

1

yylex()返回的下一个可用的令牌,对正在下一个解析器的控制称为假定。如果要处理整个输入,请循环调用它,直到它返回0