如何使用相同的词法分析器来提供带和不带空格的令牌流?

How can I use the same lexer to provide token streams with and without whitespace?

我有一个词法分析器语法,它定义了以两种方式使用的词法分析器:为语法感知编辑器识别标记,以及为解析器识别标记。在第一种情况下,词法分析器应该 return 注释和空格,但在第二种情况下,不需要注释和空格。我是否需要两个不同的词法分析器 类,每个词法分析器都由自己的语法变体定义?或者我可以通过使用通道使用单个词法分析器完成此操作吗?怎么样?

如果我需要两个单独的语法,我假设我可以分解出除注释和空格之外的所有规则,然后从那个单独的 "common" 语法中导入这些规则。

通常您通过令牌通道过滤掉令牌(如空格)(或完全跳过它们)。这是你的语法的一部分,因此如果你想在一个用例中使用空格而不是另一个用例,你需要 2 个语法。是的,您可以将具有所有通用规则的基本语法导入仅保留差异的专用语法。您甚至可以覆盖规则(例如在基本语法中定义空白规则并在您的主语法中重新定义它)。

但请记住,不过滤空格会对所有其他规则产生影响。在那种情况下,您必须在所有地方显式地向您的解析器规则添加空白处理。例如:

blah: a or b;

对比

blah: a WS* or WS* b;