ANTLR4:树结构

标签 antlr4

我正在扩展 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 生成分析树,其根由语法中的规则隐式定义。换句话说,对于您在上面给出的语法分析树节点将是 startconfig_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/

    相关文章:

    javascript - ANTLR4 JavaScript 解析器 : how to catch an error in parsing

    antlr - 在 antlr4 中构建 AST

    ANTLR4 : clean grammar and tree with keywords (aliases ? )

    java - ANTLR4语法: evaluation by listener/visitor or better with recursions?

    parsing - 可以使用ANTLR解析大文件吗?

    javascript - 如何检测源/调试 Lexer 的空值

    lexer - ANTLR4:如何注入(inject)代币

    python - ANTLR Python 解析器错误

    antlr - 从解析器切换 Antlr 词法分析器模式

    c# - Antlr 4 C# 目标不起作用