如何从属性“元素”中提取令牌信息?

时间:2012-12-31 22:19:18

标签: antlr3

1。总体任务:

我想自定义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。我的目标:

将评论从// RERS.g:26:7: NEXT disj格式更改为NEXT_disj,即从<fileName>:<description>更改为<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。问题:

  1. 如何“重载”现有模板?我想这样做,因为否则我将不得不修改“元素”的值。

  2. 我如何才能将模板应用于属性“elements”中的特定元素,而不是将其应用于每个元素(如“element()”所做的模板)?

  3. 我认为应该有一些方便的方法来实现我的目标。有什么建议吗?

  4. 提前致谢。

0 个答案:

没有答案