Tree ANTLR语法错误意外标记:正

Tree ANTLR语法错误意外标记:正,tree,grammar,antlr3,Tree,Grammar,Antlr3,嗨,我的ANTLR树语法有一个小问题。我使用的是ANTLRWorks 1.4。在解析器语法中,我有如下规则: declaration : 'variable' IDENTIFIER ( ',' IDENTIFIER)* ':' TYPE ';' -> ^('variable' IDENTIFIER TYPE)+ 所以我希望每个标识符有一棵树 在树语法中,我只留下了重写规则: declaration : ^('variable' IDENTIFIER TYPE)+

嗨,我的ANTLR树语法有一个小问题。我使用的是ANTLRWorks 1.4。在解析器语法中,我有如下规则:

declaration
:       'variable' IDENTIFIER ( ',' IDENTIFIER)* ':' TYPE ';'
->    ^('variable' IDENTIFIER TYPE)+
所以我希望每个标识符有一棵树

在树语法中,我只留下了重写规则:

declaration
:     ^('variable' IDENTIFIER TYPE)+
但当我检查语法时,我得到了语法错误意外的token+。它是树语法中声明规则末尾的+符号。那么我做错了什么


解析器语法工作正常,并按预期构建AST树。我为C#生成了lexer和parser,并对其进行了一些输入测试。

解析源代码时:

variable a, b, c : int;
您正在尝试构造一个类似以下内容的AST:

variable variable variable
    /        |        \
   a         b         c
  /          |          \
int         int         int
但是由于
'variable'
TYPE
始终是相同的标记,因此我认为没有必要创建所有这些重复节点。为什么不干脆做:

declaration
  :  'variable' IDENTIFIER ( ',' IDENTIFIER)* ':' TYPE ';' 
     -> ^('variable' TYPE IDENTIFIER+)
  ;
这将创建类似以下内容的AST:

 variable
  / | | \
int a b  c

我试过这个方法,它说决策可以匹配输入,例如使用多个备选方案1,2 anks的变量。这很有效,(我现在有不同的错误:)它们与此无关。@Vladimir,如果您现在遇到的问题与此无关,请随意创建一个新问题。