将根文本连接到ANTLR中的子节点

时间:2013-05-10 17:19:55

标签: antlr grammar

在我的语法的一部分中,我可以将某些路径中的部分放在一起作为证据,并且在括号中将其余的路径放在它们之间,例如:

foo.bar(A; B; woo.C)是3个路径的表示:foo.bar.A,foo.bar.B和foo.bar.woo.C

给定funcPaths,我需要创建一个包含完整路径的3个节点的AST树,所以我尝试了以下

funcPaths
  : f1=field c1=fieldList[$f1.text] -> ^(LIST_PATH $c1)
  ;

fieldList[String s] 
  : '(' p+=part[s] ( ';' p+=part[s] )* ')' -> $p+
  ;

part[String s]
  : FIELD_ID -> { new CommonTree(new CommonToken(FIELD_ID, s + "." + $FIELD_ID.text))}
  ;

field
  : FIELD_ID
  ;

我希望有一个以LIST_PATH为根的子树和3个子节点:类型为FIELD_ID的foo.bar.A,foo.bar.B和foo.bar.woo.C,但是在ANTLRWorks上,它只用根绘制树,LIST_PATH,这意味着没有创建那些子节点,但是如果我改为

  part[String s]
      : FIELD_ID -> FIELD_ID
      ;

我得到了3个子节点,但这并没有解决我将公共部分连接到各个部分的问题。

所以我的问题是:如何解决构建子树根和节点串联节点的问题?我不一定需要使用硬编码的commontree创建,只要我可以生成那些节点

1 个答案:

答案 0 :(得分:1)

也许尝试这样的事情?

part[String s]
  : FIELD_ID -> FIELD_ID {$FIELD_ID.setText(s + "." + $FIELD_ID.text);}
  ;

我不能说你的解决方案为什么不起作用。看了就好了。