7

我正在扩展 baseClass 侦听器并尝试读取一些值,但是顺序中似乎没有任何层次结构。

我的语法的精简版如下:

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 作为根节点。如何使其中一个终端成为根节点?

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

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

输入示例是:

键=abcdefg

键=90weata

键=acbefg9

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

4

1 回答 1

7

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

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

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

您可以调用getSymbol()aTerminalNode来获取Token实例。

于 2013-02-21T18:28:53.187 回答