在我的语法的一部分中,我可以将某些路径中的部分放在一起作为证据,并且在括号中将其余的路径放在它们之间,例如:
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创建,只要我可以生成那些节点
答案 0 :(得分:1)
也许尝试这样的事情?
part[String s]
: FIELD_ID -> FIELD_ID {$FIELD_ID.setText(s + "." + $FIELD_ID.text);}
;
我不能说你的解决方案为什么不起作用。看了就好了。