ANTLR令牌优先级?
我试图用以下格式解析javadoc样式的语法:ANTLR令牌优先级?,antlr,Antlr,我试图用以下格式解析javadoc样式的语法: /** * this is description text * this is description text also * @name ID * @param one */ 这是我的语法: query_comment : BEGIN_QDOC (description_text | NOMANSLAND)* name_declaration (param_decla
/**
* this is description text
* this is description text also
* @name ID
* @param one
*/
这是我的语法:
query_comment : BEGIN_QDOC (description_text | NOMANSLAND)*
name_declaration
(param_declaration | INNER_WS | NOMANSLAND)*
END_QDOC ;
name_declaration : NAME_KEY INNER_WS ID;
param_declaration : PARAM_KEY INNER_WS ID;
description_text : ~('\n')+;
BEGIN_QDOC : '/**';
END_QDOC : ('*/' | NASTY_GARBAGE '*/');
/*
* Stupid keywords.
*/
NAME_KEY : '@name';
PARAM_KEY : '@param';
/*
* Defines what constitutes a valid identifier.
*/
ID : ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_' | '?')+ ;
/*
* White space and garbage definitions.
*/
NOMANSLAND : NASTY_GARBAGE '*';
fragment NASTY_GARBAGE : '\r'? '\n' (INNER_WS)?;
INNER_WS : (' ' |'\t')+;
我不明白的是为什么描述文本没有正确解析。它似乎将描述文本块分解为
ID
和internal\u WS
标记,这对我来说没有任何意义,因为~('\n')
应该优先并首先应用。相反,'this'
'is'
描述'
匹配ID
标记,这意味着它不能包含标点符号。这是一个完美的孤岛语法示例,您关心的是javadoc的孤岛,而不关心它周围的东西的海洋。解决方案是使用词汇模式,如书中所述。本质上,您需要一个用于正常Java解析的模式,然后是一个用于注释内部发生的事情的模式。你的规则就像诺曼斯兰一样,就是外面的大海。当你看到一条评论的开头时,你就进入了“内部模式”。您需要像internal\u WS这样的规则。我认为这是因为ID
是一个lexer规则,因此在解析器规则description\u text
出现之前就应用了它。您可以尝试定义一个lexer规则TEXT:('a'..'z'.'a'..'z'.'0'..'9'.'-'.'.''.'.'.'.'.'内部'.'u WS)+
并在描述\文本中使用它。我已经尝试过了。将其外部化为一个单独的令牌似乎没有什么区别。它仍然首先匹配ID。