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;
我的 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;