在我的部分语法中,我可以将某些路径的共同部分放在证据中,并在括号中放置它们之间不同的路径的其余部分,例如:
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 个子节点,但这并不能解决我将公共部分连接到各个部分的问题。
所以我的问题是:我该如何解决构建那些节点的问题,这些节点是子树根和节点的串联?只要我可以生成这些节点,我不一定需要使用硬编码的公共树创建