我正在扩展baseClass Listener并试图读取一些值,但是顺序似乎没有任何层次结构.
我的语法的缩减版本如下:
start: config_options+
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ;
KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;
Run Code Online (Sandbox Code Playgroud)
但是,这个实现的解析树在config_options级别(终端级别)是平的,但是规则开始有很多config_options子项,但EQUALS不是config_options子树的根,所有TOKENS都有规则config_options作为根节点.如何将其中一个终端设为根节点?
在这个特殊的规则中,我不想要捕获任何空格,我知道有一个 - >跳过指向词法分析器但是在某些情况下我确实需要空间.即在字符串'''(ALPHANUM |'')'''中
(注意:^似乎不起作用)
输入的示例是:
关键= ABCDEFG
关键= 90weata
关键= acbefg9
我想做的就是提取键值和值对.我希望'='将是根,两个孩子将成为关键和价值.
当你生成你的语法时,你应该在使用^运算符时遇到语法错误,这在ANTLR 4中已被删除.ANTLR 4生成解析树,其根源由语法中的规则隐式定义.换句话说,对于上面给出的语法,解析树节点将是start和config_options.
生成的config_options规则将返回一个实例Config_optionsContext,其中包含以下方法:
KEY()返回TerminalNode的KEY令牌.EQUALS()(EQUALS令牌相同)PATH()(PATH令牌相同)ALPHANUM()(ALPHANUM令牌相同)您可以调用getSymbol()a TerminalNode来获取Token实例.