首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR令牌优先级?

ANTLR令牌优先级?
EN

Stack Overflow用户
提问于 2014-02-03 22:50:29
回答 1查看 502关注 0票数 1

我尝试用以下格式解析javadoc风格的语法:

代码语言:javascript
复制
/**
 * this is description text
 * this is description text also
 * @name ID
 * @param one
 */

下面是我的语法:

代码语言:javascript
复制
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标记,这意味着它不能包含标点符号。

EN

回答 1

Stack Overflow用户

发布于 2014-02-04 03:43:18

这是一个很好的海岛语法的例子,你关心的是javadoc的海岛,而不是它周围的海洋。解决方案是使用词法模式,如书中所述。从本质上讲,您需要一种用于正常Java解析的模式,然后一种用于描述注释内部情况的模式。你的规则就像诺曼斯兰一样就是外面的海。当你看到一条评论的开头时,你进入了“内部模式”。你需要像INNER_WS这样的规则。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21530364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档