我尝试用以下格式解析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标记,这意味着它不能包含标点符号。
发布于 2014-02-04 03:43:18
这是一个很好的海岛语法的例子,你关心的是javadoc的海岛,而不是它周围的海洋。解决方案是使用词法模式,如书中所述。从本质上讲,您需要一种用于正常Java解析的模式,然后一种用于描述注释内部情况的模式。你的规则就像诺曼斯兰一样就是外面的海。当你看到一条评论的开头时,你进入了“内部模式”。你需要像INNER_WS这样的规则。
https://stackoverflow.com/questions/21530364
复制相似问题