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 b,词法分析器应该返回:a and b。所以只有一个,将被退回。

现在,它正在返回:a b。如何修复此代码?

谢谢

4

1 回答 1

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'
于 2012-07-01T20:16:43.040 回答