我正在扩展baseClass Listener并试图读入一些值,但是顺序似乎没有任何层次结构。
我的语法的缩减版本如下:
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作为root节点。如何将其中一个终端设为根节点?
在这个特殊规则中,我不想要捕获任何空格,我知道有 - >跳过针对词法分析器但是在某些情况下我确实需要空间。即在字符串'''(ALPHANUM |'')'''
中(注意:^似乎不起作用)
输入的示例是:
键= ABCDEFG
键= 90weata
键= acbefg9
我想要做的就是提取键值和值对。我希望'='将是根,而两个孩子将成为关键和价值。
答案 0 :(得分:7)
当您生成语法时,您应该在使用^
运算符时遇到语法错误,该运算符已在ANTLR 4中删除.ANTLR 4生成解析树,根其中一些是由你的语法中的规则隐式定义的。换句话说,对于您在上面给出的语法,解析树节点将是start
和config_options
。
生成的config_options
规则将返回Config_optionsContext
的实例,其中包含以下方法:
KEY()
会为KEY
令牌返回TerminalNode
。EQUALS()
(EQUALS
令牌相同)PATH()
(PATH
令牌相同)ALPHANUM()
(ALPHANUM
令牌相同)您可以在getSymbol()
上致电TerminalNode
以获取Token
个实例。