2012-05-04 80 views
0

喜有以下代碼的Flex /野牛 - 啓動條件

%s expectWord 

%% 

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

的代碼應該檢查,如果用戶輸入「和」,如果他們沒有那麼如果用戶輸入後多ANDS,它們將被忽略當最後有一個單詞將被返回。 所以如果用戶輸入:a和and和and和b,詞法分析器應該返回:a和b。所以只有一個,將被退回。

現在,它返回: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'