Tree ANTLR语法错误意外标记:正
嗨,我的ANTLR树语法有一个小问题。我使用的是ANTLRWorks 1.4。在解析器语法中,我有如下规则:Tree ANTLR语法错误意外标记:正,tree,grammar,antlr3,Tree,Grammar,Antlr3,嗨,我的ANTLR树语法有一个小问题。我使用的是ANTLRWorks 1.4。在解析器语法中,我有如下规则: declaration : 'variable' IDENTIFIER ( ',' IDENTIFIER)* ':' TYPE ';' -> ^('variable' IDENTIFIER TYPE)+ 所以我希望每个标识符有一棵树 在树语法中,我只留下了重写规则: declaration : ^('variable' IDENTIFIER TYPE)+
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,如果您现在遇到的问题与此无关,请随意创建一个新问题。