2012-05-04 5 views
0

こんにちはを起動し、次のコードフレックス/バイソン - 条件

%s expectWord 

%% 

<expectWord>"and"+{word} { BEGIN(INITIAL);} 
<expectWord>["and"]*  { /* Skip */;} 
"and"      { BEGIN(expectWordAfterAND); return AND; } 

コードは、ユーザが入力したかどうかを確認することになっている「と」と、彼らは、ユーザーがその後、複数の論理積を入力しなかった場合ならば、彼らは無視されますがありますそして最後に言葉が返される時に。 したがって、ユーザが:and and and andとand bと入力した場合、lexerはaとbを返す必要があります。 1つしか返されません。

今すぐ戻っています:a b。 このコードを修正するにはどうすればよいですか?

おかげ

答えて

2

ここであなたが望むものを達成するための一つの方法です:

%{ 
#include <iostream> 
using namespace std; 
#define YY_DECL extern "C" int yylex() 
%} 

WORD [:alnum:]+ 
%x SPACE 
%x AND 

%% 

WORD ECHO; 
^[ ]*and[ ] BEGIN(AND); 
[ ]* { cout << " "; BEGIN(SPACE); } 

<SPACE>{ 
and[ ] ECHO; BEGIN(AND); 
.|\n ECHO; BEGIN(INITIAL); 
} 

<AND>{ 
and$ 
([ ]*and[ ])* 
.|\n ECHO; BEGIN(INITIAL); 

} 

%% 

main() 
{ 
    // lex through the input: 
    yylex(); 
} 

は、それをテストするには、我々が得る:

input> 'a and and b' 
output> 'a and b' 
input> 'a and and and b' 
output> 'a and b' 
input> 'a b and and c' 
output> 'a b and c' 
input> 'and and b c and a' 
output> 'b c and a'