我正在尝试使用ANTLR树语法创建AST。

给出如下语法:

rule    : head ':-' litlist (';' ':-' litlist)* DOT_END


我想创建一个像下面的树

 ^(RULES ^(head litlist)+)


也就是说,我希望(head litlist)在语法中重复与litlist一样多的数目。我尝试了类似上面的操作,但是出现了这样的错误:


语法错误:必填(...)+循环与输入EXPR上的内容不匹配
其中EXPR是语法中的另一个术语。


基本上我想要类似以下内容:

a : type ID (',' ID)* ';' -> ^(type ID)+;


Tree constructon中有描述。

但是我的语法在重复子句中有多个标记,这似乎是一个问题。

什么是正确的方法?

最佳答案

您是否尝试过另一种间接方式?如:

rule    : clauses DOT_END ->  ^(RULES clauses)
clauses : head ':-' litlist (';' ':-' litlist)* -> ^(head litlist)+


语法可能还不正确。

07-28 06:06