antlr:如何避免识别规则中的空格

antlr: how to avoid recognizing whitespaces in a rule

我的 antlr 语法如下。

accepted: appendix '$' pin;

pin: alphanums (connectors alphanums)+;

appendix: LOWERCASE | UPPERCASE;

alphanums: (LOWERCASE | UPPERCASE | INT)+;

connectors: CONNECTOR+;

LOWERCASE: [a-z]+;
UPPERCASE: [A-Z]+;
INT: [0-9]+;
CONNECTOR: ',' | 'and' | 'or';

WS: [ \t\r\n]+ -> skip;

它应该接受像 "a $ 100a, 101b" 这样的模式,但不幸的是它也接受像 "a $ 100a of sth unacceptable" 这样的模式。这里 "of sth unacceptable" 被识别为字母数字的一部分。我真正希望规则 "alphanums" 识别的只是字母和数字,没有空格。

如果我将字母数字更改为词法分析器规则,例如

accepted: appendix '$' pin;

pin: ALPHANUMS (connectors ALPHANUMS)+;

appendix: LOWERCASE | UPPERCASE;

ALPHANUMS: (LOWERCASE | UPPERCASE | INT)+;

connectors: CONNECTOR+;

LOWERCASE: [a-z]+;
UPPERCASE: [A-Z]+;
INT: [0-9]+;
CONNECTOR: ',' | 'and' | 'or';

WS: [ \t\r\n]+ -> skip;

附录规则不再识别 "a",因为 "a" 现在属于词法分析器标记 "ALPHANUMS"。

我真的不想更改附录规则以采用字母数字,例如

appendix: ALPHANUMS;

因为我只打算在附录中使用字母,所以那里没有数字。要使用 ALPHANUMS,我必须在侦听器中放入验证代码,这是额外的逻辑片段,也会使语法更难理解。

有什么办法吗?

如果您在词法分析器中跳过空格,那么 a a 将在 alphanums 等规则中被视为与 aa 相同。没有办法解决它。要么不要跳过空格并在解析器中考虑它们(通常不是可行的解决方案),要么像您已经尝试的那样将 alphanums 降级到词法分析器(这是要走的路)。

这样的事情怎么样:

accepted   : appendix '$' pin;
pin        : alphanums (connectors alphanums)+;
appendix   : LETTERS | AND | OR; // perhaps without the AND and OR?
connectors : connector+;
connector  : COMMA | AND | OR;
alphanums  : ALPHANUMS | LETTERS | AND | OR; // perhaps without the AND and OR?

AND        : 'and';
OR         : 'or';
COMMA      : ',';
LETTERS    : [a-zA-Z]+;
ALPHANUMS  : [a-zA-Z0-9]+;
WS         : [ \t\r\n]+ -> skip;