Antlr4 antlr:如何避免在规则中识别空白
我有如下的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: ',
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;
谢谢这看起来是一个解决方案。让我试试,谢谢。这看起来是一个解决方案。让我试试看