Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANTLR令牌优先级?_Antlr - Fatal编程技术网

ANTLR令牌优先级?

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

我试图用以下格式解析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
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。