我正在扩展baseClass侦听器,并试图读入一些值,但是在顺序中似乎没有任何层次结构。
我的语法的精简版本如下:
start: config_options+
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ;
KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;然而,此实现的解析树在config_options级别(终端级别)是扁平的。i.e.the规则start有许多config_options的子节点,但EQUALS不是config_options的子树的根,所有令牌都将规则config_options作为根节点。如何才能使其中一个终端成为根节点?
在这个特定的规则中,我不希望捕获任何空格,我知道有->跳过了词法分析器,但是在某些情况下,我确实需要空格。即字符串'"'(ALPHANUM|‘')'"’
(注:^似乎不起作用)
输入的示例如下:
key=abcdefg
key=90weata
key=acbefg9
我要做的就是提取键和值对。我希望'=‘是根,两个子元素是键和值。
发布于 2013-02-22 02:28:53
在生成语法时,在使用^运算符时会出现语法错误,该运算符在ANTLR4中已被删除。ANTLR4生成解析树,其根由语法中的规则隐式定义。换句话说,对于上面给出的语法,解析树节点将是start和config_options。
生成的config_options规则将返回一个Config_optionsContext实例,该实例包含以下方法:
KEY()为token.EQUALS() token)PATH() (与EQUALS token)ALPHANUM()相同)返回PATH TerminalNode (与相同)
您可以在TerminalNode上调用getSymbol()来获取Token实例。
https://stackoverflow.com/questions/15008936
复制相似问题