Antlr4 antlr:如何避免在规则中识别空白

Antlr4 antlr:如何避免在规则中识别空白,antlr4,Antlr4,我有如下的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: ',

我有如下的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的某个不可接受的东西”这样的模式。在这里,“不可接受的事物”被认为是alphanums的一部分。我真正想要的规则“alphanums”只是识别字母和数字,没有空格

如果我把alphanums改成lexer规则,比如

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”现在是lexer标记“ALPHANUMS”

我真的不想把附录规则改成字母,比如

appendix: ALPHANUMS;
因为我只打算用字母作为附录,所以这里没有数字。要使用ALPHANUMS,我必须在listener中输入验证代码,这是额外的一段逻辑,也使语法更难理解


有什么办法吗?

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

像这样的怎么样:

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;

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

像这样的怎么样:

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;

谢谢这看起来是一个解决方案。让我试试,谢谢。这看起来是一个解决方案。让我试试看