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

时间:2016-11-21 23:26:19

标签: antlr

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

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

1 个答案:

答案 0 :(得分:1)

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

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

blah: a or b;

blah: a WS* or WS* b;