Flex-lex:匹配r前面有什么东西

时间:2017-11-15 21:07:48

标签: flex-lexer

使用flex,

当你面前有什么东西时,你如何匹配。

例如:如果在D打印之前有R

我试过

{something}/D {printf("V");}

但它不起作用。

1 个答案:

答案 0 :(得分:0)

那不是(f)lex如何运作。 (F)lex是 tokeniser ;它将输入分成连续的令牌。在输入的每个点,它从精确的那一点开始选择适当的标记;下一个标记将从前一个标记的末尾开始。

如果您只想在某些特定情境中识别某些令牌,可以使用start conditions,但您有责任注意上下文更改。因此,您可以在与任何以R结尾的令牌相关联的操作中更改为不同的开始条件:

%x AFTER_R
%%
[[:alpha:]]+   { if (yytext[yyleng-1] == 'R') BEGIN(AFTER_R);
                 /* handle this token */
               }
  /* Etc. for other patterns which might end with an R */
<AFTER_R>"D"   { puts("Found a D after an R"); }

过度使用启动条件会使词汇描述文件难以阅读和调试;它可能表明您的问题不适合(f)lex标记化模型。