公に使用されている製品の 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();}
「グラフ」要素と「状態」要素の前に配置されたコメントには、意味のある説明と注釈が含まれており、解析された AST 内に含める必要があります。したがって、これら 2 つのルールを変更し、COMMENT をスキップしなくなりました。
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 */
}