tree grammar中tree的antlr文法多重性问题

标签 antlr antlr3

我有一个简单的语法

options {
  language = Java;
  output = AST;
  ASTLabelType=CommonTree;
}

tokens {
  DEF;
}

root
  : ID '=' NUM (',' ID '=' NUM)* -> ^(DEF ID NUM)+     
  ;

和相应的树语法:

options {
  tokenVocab=SimpleGrammar;
  ASTLabelType=CommonTree;
}

root
  : ^(DEF ID NUM)+
;

但是 antlr (v3.3) 无法编译我得到的这个树语法:

syntax error: antlr: unexpected token: +
|---> : ^(DEF ID NUM)+

如果我想将其创建为^(ROOT ^(DEF ID NUM)+)

,它也不起作用

我想要一棵对应于此的树(因为 parse 也创建了它):

(ROOT (DEF aa 11) (DEF bb 22) (DEF cc 33))

因此 antlr 能够在解析器中生成树但不能用树语法解析它?!

为什么会这样?

最佳答案

为了获取(ROOT (DEF aa 11) (DEF bb 22) (DEF cc 33)),您可以定义以下解析器规则:

tokens {
  ROOT;
  DEF;
}

root
  : def (',' def)* -> ^(ROOT def+)
  ;

def
  :  ID '=' NUM -> ^(DEF ID NUM)
  ;

然后你的树语法将包含:

root
  :  ^(ROOT def+)
  ;

def
  :  ^(DEF ID NUM)
  ;

关于tree grammar中tree的antlr文法多重性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7389451/

相关文章:

C++、ANTLR 和 VECTORS

java - 如何列出 Java 方法/函数中的所有局部变量?

regex - antlr 中一些 token 名称后面的 '^' 是做什么的?

ANTLR 词法分析器根本无法向前看

ANTLR解释器运行错误

c++ - Antlr4 C++ 访客 API

parsing - ANTLR 解析树修改

java - Antlr4 - 表示检查任意数量的标记的句法谓词

antlr - 迁移 antlr 语法时遇到问题

java - ANTLR : rules with arguments?