ANTLR4:树结构

ANTLR4:树结构,antlr4,Antlr4,我正在扩展基类侦听器,并试图读入一些值,但是顺序中似乎没有任何层次结构 我的语法的简化版本如下: start: config_options+ config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ; KEY: 'key' ; EQUALS: '=' ; ALPHANUM: [0-9a-zA-Z]+ ; 但是,此实现的解析树在配置_选项级别(终端级别)是平坦的,即规则start有许多配置_选项的子项,但EQUALS不

我正在扩展基类侦听器,并试图读入一些值,但是顺序中似乎没有任何层次结构

我的语法的简化版本如下:

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

KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;
但是,此实现的解析树在配置_选项级别(终端级别)是平坦的,即规则start有许多配置_选项的子项,但EQUALS不是配置_选项子树的根,所有令牌都将规则配置_选项作为根节点。如何将其中一个终端改为根节点

在这个特殊的规则中,我不希望捕获任何空格,我知道lexer有->skip指令,但是在某些情况下我确实需要空格。i、 e.在字符串“'”(字母数|“')”中

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

输入的一个例子是:

键=abcdefg

键=90weata

键=acbefg9


我要做的就是提取键和值对。我希望“=”是根,两个子项是键和值。

生成语法时,使用
^
运算符时应该会出现语法错误,该运算符在ANTLR 4中被删除。ANTLR 4生成解析树,其根由语法中的规则隐式定义。换句话说,对于上面给出的语法,解析树节点将是
start
config\u选项

生成的
配置选项
规则将返回
配置选项上下文
的实例,其中包含以下方法:

  • KEY()
  • EQUALS()
    (与
    EQUALS
    令牌相同)
  • PATH()
    (与
    PATH
    令牌相同)
  • ALPHANUM()
    (与
    ALPHANUM
    标记相同)

您可以在
TerminalNode
上调用
getSymbol()
,以获取
Token
实例。

如何定义终端之间的关系?i、 我们得到等号的子代。或者这在ANTLR4中不是一个有效的想法?有没有办法创建AST而不是解析树?@user1932405,创建一个额外的规则,
value
例如:
config\u选项:KEY等于value;值:(路径| ALPHANUM)(“|”\r“|”'\n')*哦,好的,谢谢,所以我必须基于解析规则而不是令牌创建AST。