我正在尝试以下列格式解析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')+;
我不明白为什么描述文本没有正确解析。它似乎将描述文本块分解为ID
和INNER_WS
令牌,这对我没有任何意义,因为~('\n')
应优先考虑并首先应用。相反,'this'
'is'
'description'
'text'
匹配ID
令牌,这意味着它不能包含标点符号。
答案 0 :(得分:1)
这是一个岛屿语法的完美例子,你关心javadoc的岛屿,而不关心它周围的海洋。解决方案是使用词汇模式,如书中所述。从本质上讲,您需要一种普通Java解析模式,然后是注释内部发生的模式。像NOMANSLAND这样的规则将是外面的海洋。当您看到评论的开头时,您将进入“内部模式”。在哪里你需要像INNER_WS这样的规则。