Flex中的令牌识别错误

时间:2012-04-24 05:02:02

标签: flex-lexer lexical-analysis

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

%{
/* 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

1 个答案:

答案 0 :(得分:1)

yylex()返回下一个可用标记,假设在解析器的控制下调用。如果要处理整个输入,请在循环中调用它,直到它返回0