0

こんにちは、次のコードがあります

%s expectWord

%%

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

コードは、ユーザーが「and」を入力したかどうかを確認することになっています。入力した場合、ユーザーがその後に複数の and を入力すると、それらは無視され、最終的にその単語があるときにその単語が返されます。したがって、ユーザーが a and and and and and and and b と入力すると、lexer は a and b を返す必要があります。そのため、1つだけ返品されます。

現在、次のように返されています: a b. このコードを修正するにはどうすればよいですか?

ありがとう

4

1 に答える 1

2

あなたが望むものを達成するための1つの方法は次のとおりです。

%{
#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'
于 2012-07-01T20:16:43.040 に答える