【发布时间】:2017-11-15 21:07:47
【问题描述】:
使用弹性,
前面有东西怎么匹配。
例如:如果在 D 之前有 R 打印一些东西
我试过了
{something}/D {printf("V");}
但它不起作用。
【问题讨论】:
标签: flex-lexer
使用弹性,
前面有东西怎么匹配。
例如:如果在 D 之前有 R 打印一些东西
我试过了
{something}/D {printf("V");}
但它不起作用。
【问题讨论】:
标签: flex-lexer
这不是 (f)lex 的工作方式。 (F)lex 是一个标记器;它将输入拆分为连续的标记。在输入中的每个点,它都会从该点开始选择适当的标记;下一个令牌将从前一个令牌的末尾开始。
如果您只想在某些特定上下文中识别某些标记,您可以使用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 标记化模型。
【讨论】: