我正在扩展 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
我要做的就是提取键和值对。我希望“=”是根,两个 child 是键和值。
最佳答案
当您生成语法时,您应该会因为使用 ^
而遇到语法错误。运算符,已在 ANTLR 4 中删除。ANTLR 4 生成分析树,其根由语法中的规则隐式定义。换句话说,对于您在上面给出的语法分析树节点将是 start
和 config_options
.
生成的config_options
规则将返回 Config_optionsContext
的实例,其中包含以下方法:
KEY()
返回 TerminalNode
对于KEY
token 。 EQUALS()
(与 EQUALS
token 相同)PATH()
(与 PATH
token 相同)ALPHANUM()
(与 ALPHANUM
token 相同)您可以调用
getSymbol()
在 TerminalNode
获取 Token
实例。
关于ANTLR4:树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15008936/