ANTLR4:树构造

7
我扩展了baseClass Listener并尝试读取一些值,但似乎没有层次结构的顺序。
以下是我语法简化后的版本:
start: config_options+
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ;

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

然而,此实现的解析树在config_options级别(终端级别)是扁平的,即规则start有许多config_options的子节点,但EQUALS不是config_options子树的根节点,所有TOKENS都将规则config_options作为根节点。我怎样才能使一个终端成为根节点呢?
在这个特定的规则中,我不希望任何空格被捕获,我知道对于词法分析器,有"->skip"指令,但是有些情况下我确实想要保留空格,例如在字符串'"'( ALPHANUM | ' ') '"'中。
(注意:^似乎无效)
输入示例:
key=abcdefg
key=90weata
key=acbefg9
我只想提取键和值对。我期望'='是根节点,而两个子节点则分别为键和值。
1个回答

7
当您生成语法时,可能会在使用了ANTLR 4中已删除的^运算符时收到语法错误。ANTLR 4生成解析树,其根据规则隐式定义。换句话说,对于上面给出的语法,解析树节点将是startconfig_options
生成的config_options规则将返回Config_optionsContext实例,其中包含以下方法:
  • KEY()返回KEY令牌的TerminalNode
  • EQUALS()EQUALS令牌同理)
  • PATH()PATH令牌同理)
  • ALPHANUM()ALPHANUM令牌同理)
您可以在TerminalNode上调用getSymbol()以获取Token实例。

你如何定义终端之间的关系?例如获取等号的子节点。或者在ANTLR4中这不是一个有效的想法吗? 是否有一种方法可以创建AST而不是解析树? - Har
1
@user1932405,请创建一个额外规则,例如:value : config_options: KEY EQUALS value ; (PATH | ALPHANUM) (' '|'\r'|'\n')* ; - Bart Kiers
哦,好的。谢谢你指导,那我需要根据解析规则创建AST而不是基于标记创建。 - Har

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接