2012-04-24 4 views
-1

スキャナ(Flexを使用して実装されている)が一度にすべてのトークンを認識しないパーサーを実装しています。入力から最初のトークンを取り出して終了するだけです。誰かが私を助けてくださいこれを整理することができます。ここに私の ".lex" ファイルです:私はabc;として入力を与えるたとえば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(); 
} 

、期待される出力は次のようになります。

ID or number: abc 
Semicolon 

しかし、実際の出力は次のようになります。

ID or number: abc 

つまり、最初のトークンabcを認識し、セミコロンを認識せずに終了するだけです。次いで、出力はちょうど;で入力された場合、一方

Semicolon 
+0

プログラムのようなサウンドは、あなたが指定したものを正確に実行しています - それは 'yylex'を呼び出して1つのトークンを読み終えます。 –

答えて

1
yylex()

パーサーの制御下で呼び出されているasumptionに、次の利用可能なトークンを返します。入力全体を処理したい場合は、0を返すまでループ内で呼び出します。

関連する問題