扫描仪发生器中包容性启动条件的实际使用

时间:2019-04-05 15:44:38

标签: flex-lexer lex lexical-analysis

在哪些真实世界(非人为)的词法扫描问题中,“包容性扫描条件”(而不是“排他性”条件)是更好的解决方案?

也就是说,%s FOO在(f)lex定义中什么时候比%x FOO好?

我了解功能上的差异以及如何在扫描仪生成器中实现差异。我只是想了解一种情况,在这种情况下,您可以合理地将不同组的扫描规则融合在一起,形成一个扫描条件。

全面披露:答案将激发this project的示例代码。

1 个答案:

答案 0 :(得分:1)

“混在一起”词汇规则非常普遍。考虑反斜杠转义处理,您可能希望在不同的引用语法甚至是正则表达式文字中以相同的方式或多或少地进行处理。但是这些可能会被明确地合并。

对于可能使用带有INITIAL状态的隐式组合的地方,仅作一个稍作改动的示例,请考虑对具有上下文意义的前导空白的类Python语言进行词法分析。这里,有两个几乎完全相同的词法上下文:普通上下文,其中换行符是一个句法标记,并且前导空格需要变成INDENT / DEDENT序列;以及括号内的上下文,其中换行符和前导空格都只是空白,不转发给解析器。这些上下文仅在几种模式上有所不同。绝大多数规则将被共享。因此,包含状态仅包含以下内容:

<IN_PAREN>[[:space:]]+  /* Ignore all whitespace */

可能是一个简单的解决方案。当然,必须在正常的空白处理之前放置该规则,以便在IN_PAREN处于活动状态时覆盖该规则。