一、总体任务:
我想自定义 Java.stg 以修改代码块注释中的令牌显示格式,以替代语法规则。
2. 背景:
我目前的语法中的一条规则是:
temporal returns [String ret]:
NEXT disj
{$ret= $ret= "X ".concat($disj.ret);}
| EVENTUALLY disj
{$ret= "F ".concat($disj.ret);}`
;
对应生成的代码块(在解析器中)如下:
switch (alt2) {
case 1 :
// RERS.g:26:7: NEXT disj
{
match(input,NEXT,FOLLOW_NEXT_in_temporal204);
pushFollow(FOLLOW_disj_in_temporal206);
disj2=disj();
state._fsp--;
ret = ret = "X ".concat(disj2);
}
break;
case 2 :
// RERS.g:28:7: EVENTUALLY disj
{
match(input,EVENTUALLY,FOLLOW_EVENTUALLY_in_temporal222);
pushFollow(FOLLOW_disj_in_temporal224);
disj3=disj();
state._fsp--;
ret = "F ".concat(disj3);
}
break;
3. 我的目标:
将评论从格式 like 更改// RERS.g:26:7: NEXT disj
为NEXT_disj
,即从<fileName>:<description>
to<MyOwnAttribute>
4.到目前为止的尝试:
我尝试将模板“alt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew)”修改如下:
alt(elements,altNum,description,autoAST,outerAlt,treeLevel,rew) ::= <<
/* <elements:ExtractToken()> */
{
<@declarations()>
<elements:element()> // as I understand, it's just an template expansion to apply the sub templates in each elements
<rew>
<@cleanup()>
}
>>
我检查了在这种情况下,属性元素的值类似于{el=/tokenRef(), line=26, pos=7}{el=/ruleRef(), line=26, pos=12}{el=/execAction(), line=27, pos=7}
. 我认为我应该“重载”“tokenRef”模板以吐出格式为“NEXT_disj”的令牌
5. 问题:
如何“重载”现有模板?我想这样做,因为否则我将不得不修改“元素”的值。
如何仅将模板应用于属性“元素”中的特定元素,而不是将其应用于每个元素(就像模板“元素()”所做的那样)?
我认为应该有一些方便的方法来实现我的目标。有什么建议吗?
提前致谢。