什么是现实世界(非人为的)词汇扫描问题,其中“包容性扫描条件”(而不是“独家”扫描条件)是更好的解决方案?
也就是说,%s FOO
在(f)lex定义中是否比%x FOO
更好?
我理解功能的差异以及如何在扫描仪生成器中实现差异。我只是想了解一下您将合法地想要将不同的扫描规则组混合到一个扫描条件中的情况。
完全披露:答案将激发this project的示例代码。
“混搭”词汇规则很常见。考虑反斜杠转义处理,您可能希望在不同的引用语法甚至正则表达式文字中以相同的方式执行。但这些可能会明确地结合起来。
对于可能使用与INITIAL状态隐式组合的仅有轻微设计的示例,请考虑使用具有上下文意义的前导空格的类似Python的语言的词法分析。这里有两个几乎完全相同的词汇上下文:正常上下文,其中换行符是一个句法标记,前导空格需要转换为INDENT / DEDENT序列,以及带括号的上下文,其中换行符和前导空格都是正确的空格,不转发给解析器。这些背景只会在几种模式上有所不同;绝大多数规则将被分享。所以有一个包含状态只包含类似的东西:
<IN_PAREN>[[:space:]]+ /* Ignore all whitespace */
可能是一个简单的解决方案当然,必须在正常的空白处理之前放置该规则,以便在IN_PAREN
处于活动状态时覆盖它。