0

在我的部分语法中,我可以将某些路径的共同部分放在证据中,并在括号中放置它们之间不同的路径的其余部分,例如:

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

给定 funcPaths,我需要创建一个 AST 树,其中包含具有完整路径的这 3 个节点,因此我尝试了以下操作

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 个子节点的子树:foo.bar.A、foo.bar.B 和 foo.bar.woo.C 类型为 FIELD_ID,但在 ANTLRWorks 上它只用根 LIST_PATH 绘制树,这意味着没有创建这些子节点,但是如果我更改为

  part[String s]
      : FIELD_ID -> FIELD_ID
      ;

我绘制了 3 个子节点,但这并不能解决我将公共部分连接到各个部分的问题。

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

4

1 回答 1

1

也许尝试这样的事情?

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

我无法解释为什么您的解决方案不起作用。只是看了一眼,似乎还可以。

于 2013-05-10T20:32:42.447 回答