使用 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
的语句时,它自然会忽略 ab
和 10
之间的所有空格,并将 ab1
作为标识符进行解析,并且最后 0
作为整数。显然,其意图是 ab
是标识符, 10
是整数。我见过一些依赖于 Java 的解决方案,但如何在 Python3 中解决这个问题?
制作integer
和ident
令牌以及CHAR
和DIGIT
片段。白色 space 不会在令牌中被忽略,因此这将解决您的问题。它还将解决另一个你还没有注意到的问题:
根据您当前的语法,letter
将被解释为关键字 let
,后跟标识符 ter
。这是因为在该输入的开头,词法分析器可以选择将 l
匹配为 CHAR
标记或将 let
匹配为 LET
标记。鉴于这种选择,词法分析器将始终更喜欢较长的匹配(这被称为最大咀嚼规则)。这就是为什么让您的标记成为单个字符通常不是一个好主意。如果你将标识符和整数作为你的标记,最大咀嚼规则将做你想做的而不是对你不利。
我正在尝试解析以下语法。
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
的语句时,它自然会忽略 ab
和 10
之间的所有空格,并将 ab1
作为标识符进行解析,并且最后 0
作为整数。显然,其意图是 ab
是标识符, 10
是整数。我见过一些依赖于 Java 的解决方案,但如何在 Python3 中解决这个问题?
制作integer
和ident
令牌以及CHAR
和DIGIT
片段。白色 space 不会在令牌中被忽略,因此这将解决您的问题。它还将解决另一个你还没有注意到的问题:
根据您当前的语法,letter
将被解释为关键字 let
,后跟标识符 ter
。这是因为在该输入的开头,词法分析器可以选择将 l
匹配为 CHAR
标记或将 let
匹配为 LET
标记。鉴于这种选择,词法分析器将始终更喜欢较长的匹配(这被称为最大咀嚼规则)。这就是为什么让您的标记成为单个字符通常不是一个好主意。如果你将标识符和整数作为你的标记,最大咀嚼规则将做你想做的而不是对你不利。