使用 Python3 选择性地处理 ANTLR4 中的空格

Selectively handling whitespace in ANTLR4 with Python3

我正在尝试解析以下语法。

let_expr : LET iden integer;
CHAR     : ('a' .. 'z') | ('A' .. 'Z');
DIGIT    : ('0' .. '9');
LET      : 'let'
integer  : DIGIT+;
iden     : CHAR (CHAR|DIGIT)*;
WS       : (' ' | '\n' | '\t' | '\r')+ -> skip;

空白忽略在其他方面很重要,因为它是大型语法的一小段,并且到处携带空白标记非常麻烦。然而,当解析器试图解析诸如 let ab 10 的语句时,它自然会忽略 ab10 之间的所有空格,并将 ab1 作为标识符进行解析,并且最后 0 作为整数。显然,其意图是 ab 是标识符, 10 是整数。我见过一些依赖于 Java 的解决方案,但如何在 Python3 中解决这个问题?

制作integerident令牌以及CHARDIGIT片段。白色 space 不会在令牌中被忽略,因此这将解决您的问题。它还将解决另一个你还没有注意到的问题:

根据您当前的语法,letter 将被解释为关键字 let,后跟标识符 ter。这是因为在该输入的开头,词法分析器可以选择将 l 匹配为 CHAR 标记或将 let 匹配为 LET 标记。鉴于这种选择,词法分析器将始终更喜欢较长的匹配(这被称为最大咀嚼规则)。这就是为什么让您的标记成为单个字符通常不是一个好主意。如果你将标识符和整数作为你的标记,最大咀嚼规则将做你想做的而不是对你不利。