我正在为公共使用的产品修改 DSL 语法。目前,所有/*...*/
评论都被默默地忽略,但我需要对其进行修改,以便将某些关键元素之前的评论解析为 AST。我需要保持向后兼容性,用户仍然可以在整个 DSL 中任意添加评论,并且只包含那些关键评论。
解析器语法目前看起来有点像这样:
grammar StateGraph;
graph: 'graph' ID '{' graph_body '}';
graph_body: state+;
state: 'state' ID '{' state_body '}';
state_body: transition* ...etc...;
transition: 'transition' (transition_condition) ID ';';
COMMENT: '/*' ( options {greedy=false;} : . )* '*/' {skip();}
放在“graph”和“state”元素之前的注释包含有意义的描述和注释,需要包含在解析的 AST 中。所以我修改了这两条规则,不再跳过评论:
graph: comment* 'graph' ID '{' graph_body '}';
state: comment* 'state' ID '{' state_body '}';
COMMENT: '/*' ( options {greedy=false;} : . )* '*/'
如果我天真地使用上述内容,则其他注释在随后执行树解析器时会导致不匹配的令牌错误。如何忽略所有未放在“图表”或“状态”前面的 COMMENT 实例?
一个示例 DSL 将是:
/* Some description
* @some.meta.info
*/
graph myGraph {
/* Some description of the state.
* @some.meta.info about the state
*/
state first {
transition if (true) second; /* this comment ignored */
}
state second {
}
/* this comment ignored */
}