2012-05-04 4 views
0

안녕 사용자가 입력 "및"사용자는 그 후 여러의 ands를 입력하면 그럼 그들이 그랬다면, 그들은 무시 될 경우 코드가 확인하도록되어플렉스/들소 - 시작 조건

%s expectWord 

%% 

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

다음 코드를 가지고 마침내 단어가 반환 될 때가 있습니다. 그래서 사용자가 a와 and and and and와 b를 입력하면 lexer는 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'