结合不同的解析器规则以简化 ANTLR4 中 TreeListener 内的处理

Combining different parser rules to simplify processing within TreeListener in ANTLR4

这是我的语法文件的一部分:

paragraph
    : TEXT? italic TEXT?
    | TEXT? STAR TEXT?
    | TEXT? labelRef TEXT?
    | TEXT? BRACE_OPEN TEXT?
    | TEXT? LABEL TEXT?
    | ELEMENTPATH
    | TEXT
    ;

段落规则应该 "mark" 我岛语法中的所有段落,因为我想在生成的段落元素周围生成 p 块。从技术上讲,可以识别所有不同的段落元素。

问题是,不同的规则导致我的侦听器中的不同段落调用。由于规则不同,这完全符合逻辑,但它使得在侦听器中处理树非常困难。同一段落的两个不同条目(作为示例)可以在图 1 中找到。

输入的文字是:

Text text paragraph 1 text *italic* text and here the same paragraph with a * but a different entry in the tree.

只有一个段落,但如果我处理树,输出 HTML 将包含两个段落。

有没有办法将这些不同的规则部分组合成一个段落调用?如果只是一个段落的意思,那么分析树中不应该有两个不同的段落。

您的 paragraph 规则设置为一次仅识别一个已定义的字符串。所以,你的第一段是 TEXT italic TEXT,第二段是 STAR TEXT.

尝试

paragraph 
    : ( TEXT? italic TEXT?
      | TEXT? STAR TEXT?
      | TEXT? labelRef TEXT?
      | TEXT? BRACE_OPEN TEXT?
      | TEXT? LABEL TEXT?
      | ELEMENTPATH
      | TEXT
      )+
    ;