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