ANTLR令牌优先级?

时间:2014-02-03 14:50:29

标签: 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_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')+;

我不明白为什么描述文本没有正确解析。它似乎将描述文本块分解为IDINNER_WS令牌,这对我没有任何意义,因为~('\n')应优先考虑并首先应用。相反,'this' 'is' 'description' 'text'匹配ID令牌,这意味着它不能包含标点符号。

1 个答案:

答案 0 :(得分:1)

这是一个岛屿语法的完美例子,你关心javadoc的岛屿,而不关心它周围的海洋。解决方案是使用词汇模式,如书中所述。从本质上讲,您需要一种普通Java解析模式,然后是注释内部发生的模式。像NOMANSLAND这样的规则将是外面的海洋。当您看到评论的开头时,您将进入“内部模式”。在哪里你需要像INNER_WS这样的规则。