flex的条件

问题描述 投票:1回答:1

是否可以在flex中放置规则的条件语句?仅当某些条件为真时,我才需要此规则以匹配特定规则。像这样的东西:

%option c++
%option noyywrap

%%
/*if (condition) {*/
[0-9] {}
/*}*/
[0-9]{2} {}
.     /* eat up any unmatched character */
%%

void yylex(void);

int main()
{
    FlexLexer *lexer = new yyFlexLexer();
    lexer->yylex();
    delete lexer;
}

或者是否可以修改最终的c ++生成的代码,以便仅匹配某些特定的正则表达式规则?

UPDATE:

使用开始条件似乎没有帮助。我想要的是取决于某些外部变量(如isNthRegexActive),使其能够匹配或不匹配特定的正则表达式。例如,如果我有4个正则表达式规则,并且第一个和第二个规则均未激活,则程序应仅检查其他两个,并始终检查所有两个(不要在第一次比赛时停止-可以使用REJECT)。

4条规则示例:

/* Declared at the top */
isActive[0] = false;
isActive[1] = false;
isActive[2] = true;
isActive[3] = true;

%%
[0-9]{4} { printf("1st: %s\n", yytext); REJECT;}
[0-3]{2}[0-3]{2} { printf("2nd: %s\n", yytext); REJECT; }
[1-3]{2}[0-3]{2} { printf("3rd: %s\n", yytext); REJECT; }
[1-2]{2}[1-2]{2} { printf("4th: %s\n", yytext); REJECT; }
.
%%

对于输入:1212,结果应为:

3rd: 1212
4th: 1212
flex-lexer lex lexer
1个回答
1
投票

除非绝对没有其他选择,否则请不要使用REJECT。它极大地减慢了词法扫描的速度,人为地限制了令牌缓冲区的大小,并使您的词法分析非常难以推理。

[您可能会认为(f)lex生成的扫描程序一次测试每个正则表达式,以便为给定的匹配选择最佳的正则表达式。那样行不通。那太慢了。它的作用是,通过使用表示为查找表的预编译确定性状态机,有效地并行检查所有正则表达式。

状态机使用一个简单的O(1)查找到转换表中,为每个输入字节执行一个转换。 (有多种表压缩技术可在O(1)查找中权衡表大小与常量之间的关系,但这并不会改变基本逻辑。)这意味着您可以根据需要使用任意多个正则表达式;进行词法分析的时间不取决于正则表达式的数量或复杂性。 (除了缓存效果:如果您的过渡表很大,则在过渡查找期间可能会开始遇到缓存未命中。在这种情况下,您可能更喜欢使用压缩率更高的压缩算法。)

在大多数情况下,您可以使用开始条件来实现条件匹配,尽管如果存在多个交互条件,则可能需要很多开始条件。由于扫描仪只能有一个活动的启动条件,因此您需要为要考虑的条件的每种合法组合生成一个不同的启动条件。通常,通过自动生成扫描仪规则最容易实现这一点,但是如果数量不多,则可以手工完成。

很难在不知道需要检查哪种条件的情况下提供更具体的建议。

© www.soinside.com 2019 - 2024. All rights reserved.