Java Antlr4:防止规则和令牌冲突
鉴于以下语法:Java Antlr4:防止规则和令牌冲突,java,antlr,antlr4,Java,Antlr,Antlr4,鉴于以下语法: grammar minimal; rule: '(' rule_name body ')'; rule_name : NAME; body : '(' AT NAME ')'; AT : 'at'; NAME: LETTER ANY_CHAR*; fragment LETTER: 'a' .. 'z' | 'A' .. 'Z'; fragment ANY_CHAR: LETTER | '0' .. '9' | '-' | '_'; WHITESPACE: ( ' ' | '\
grammar minimal;
rule: '(' rule_name body ')';
rule_name : NAME;
body : '(' AT NAME ')';
AT : 'at';
NAME: LETTER ANY_CHAR*;
fragment LETTER: 'a' .. 'z' | 'A' .. 'Z';
fragment ANY_CHAR: LETTER | '0' .. '9' | '-' | '_';
WHITESPACE: ( ' ' | '\t' | '\r' | '\n' )+ -> skip;
如何将(at(at bar))与at作为有效函数名进行匹配,而不会与正文中的at标记发生冲突,而不会重新排列语法 要删除冲突并保留预期的令牌类型:
rule_name : ( NAME | AT ) -> type(NAME) ;
您要求的不是
规则:'('(NAME | AT))
,还是允许的?是的,最初AT标记与其他规则进行了某种深度嵌套的匹配,但是在规则部分,应该可以在匹配名称时写入AT,因为validI认为NAME | AT
是您想要的。如果您的需求中有禁止这样做的内容,那么我不确定它是什么。您可能需要澄清您的问题。谢谢您的澄清。我再想一想,你可以在处执行规则_name:name |,对吗?或者这会破坏其他东西吗?仅供参考,您正在尝试的通常被称为非保留关键字。