-1

スキャナー (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
4

1 に答える 1

1

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

于 2012-04-24T05:07:18.113 に答える