ANTLR4:树木结构

时间:2013-02-21 17:48:16

标签: antlr4

我正在扩展baseClass Listener并试图读入一些值,但是顺序似乎没有任何层次结构。

我的语法的缩减版本如下:

start: config_options+
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ;

KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;

然而,这个实现的解析树在config_options级别(终端级别)是平的,但是规则开始有很多config_options子项,但EQUALS不是config_options子树的根,所有TOKENS都有规则config_options作为root节点。如何将其中一个终端设为根节点?

在这个特殊规则中,我不想要捕获任何空格,我知道有 - >跳过针对词法分析器但是在某些情况下我确实需要空间。即在字符串'''(ALPHANUM |'')'''

(注意:^似乎不起作用)

输入的示例是:

键= ABCDEFG

键= 90weata

键= acbefg9

我想要做的就是提取键值和值对。我希望'='将是根,而两个孩子将成为关键和价值。

1 个答案:

答案 0 :(得分:7)

当您生成语法时,您应该在使用^运算符时遇到语法错误,该运算符已在ANTLR 4中删除.ANTLR 4生成解析树,根其中一些是由你的语法中的规则隐式定义的。换句话说,对于您在上面给出的语法,解析树节点将是startconfig_options

生成的config_options规则将返回Config_optionsContext的实例,其中包含以下方法:

  • KEY()会为KEY令牌返回TerminalNode
  • EQUALS()EQUALS令牌相同)
  • PATH()PATH令牌相同)
  • ALPHANUM()ALPHANUM令牌相同)

您可以在getSymbol()上致电TerminalNode以获取Token个实例。