ANTLR4:树木结构

Har*_*Har 7 antlr4

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

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

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

KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;
Run Code Online (Sandbox Code Playgroud)

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

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

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

输入的示例是:

关键= ABCDEFG

关键= 90weata

关键= acbefg9

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

Sam*_*ell 7

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

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

  • KEY()返回TerminalNodeKEY令牌.
  • EQUALS()(EQUALS令牌相同)
  • PATH()(PATH令牌相同)
  • ALPHANUM()(ALPHANUM令牌相同)

您可以调用getSymbol()a TerminalNode来获取Token实例.