如何从解析器规则上下文中获取混合类型列表?

时间:2019-06-21 19:04:33

标签: antlr antlr4

我定义了一个解析器规则,该规则可以是类型A或类型B的列表:

g4: sectionContent : ( WHITESPACE* ( section | ( LINE_LITERAL NEWLINE ) ) WHITESPACE* )* ;

生成的源:cpp

  SectionHeaderContext* sectionHeader();

  class  SectionContentContext : public antlr4::ParserRuleContext {
  public:
    SectionContentContext(antlr4::ParserRuleContext *parent, size_t invokingState);
    virtual size_t getRuleIndex() const override;
    std::vector<SectionContext *> section();
    SectionContext* section(size_t i);
    std::vector<antlr4::tree::TerminalNode *> WHITESPACE();
    antlr4::tree::TerminalNode* WHITESPACE(size_t i);
    std::vector<antlr4::tree::TerminalNode *> LINE_LITERAL();
    antlr4::tree::TerminalNode* LINE_LITERAL(size_t i);
    std::vector<antlr4::tree::TerminalNode *> NEWLINE();
    antlr4::tree::TerminalNode* NEWLINE(size_t i);

    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;

  };

问题:从生成的源代码中,我看到可以获得LINE_LITERAL的列表,也可以获得SectionContext的列表。但是,如果要解析的文本是LINE_LITERAL和SectionContext的混合列表怎么办?解析过程中信息不会丢失吗?例如

对于具有以下内容的输入文档:

LINE_LITERAL_1
SectionContext_1
LINE_LITERAL_2
SectionContext_2
LINE_LITERAL_3
SectionContext_3

SectionContext_1LINE_LITERAL_2之间的相对排序信息很重要。但是使用antlr时,我只能检索所有LINE_LITERAL和另一个SectionContext的列表。

1 个答案:

答案 0 :(得分:1)

您在派生上下文中看到的所有功能都是便捷方法。它们都在子级列表上工作,该列表保留已被识别的令牌(以被识别的顺序)。例如,section()方法遍历子级列表并收集所有SectionContext元素。相反,带有参数的section方法将遍历子级并返回SectionContext的第i个匹配项。

如果要按顺序获得子上下文,请使用子列表(C ++目标中的ParseTree::children)。