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。