如何从解析器规则上下文中获取混合类型列表?
How to get mixed type list from parser rule context?
我定义了一个解析器规则,它可以是类型 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_LITERALs的列表,我也可以得到一个SectionContext的列表。但是如果被解析的文本是 LINE_LITERAL 和 SectionContext 的混合列表呢?解析过程中信息不会丢失吗?例如
对于具有以下内容的输入文档:
LINE_LITERAL_1
SectionContext_1
LINE_LITERAL_2
SectionContext_2
LINE_LITERAL_3
SectionContext_3
SectionContext_1
和 LINE_LITERAL_2
之间的相对顺序信息很重要。但是使用 antlr,我只能检索所有 LINE_LITERAL
的列表和另一个 SectionContext
.
的列表
您在派生上下文中看到的所有函数都是便捷方法。他们都在 children 列表上工作,该列表保留已被识别的标记(按照它们被识别的顺序)。例如,section()
方法遍历子列表并收集所有 SectionContext 元素。带有参数的 section 方法迭代子对象和 returns SectionContext 的 i-th 出现。
如果您想按照识别顺序获取子上下文,请使用子列表(C++ 目标中的ParseTree::children
)。
我定义了一个解析器规则,它可以是类型 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_LITERALs的列表,我也可以得到一个SectionContext的列表。但是如果被解析的文本是 LINE_LITERAL 和 SectionContext 的混合列表呢?解析过程中信息不会丢失吗?例如
对于具有以下内容的输入文档:
LINE_LITERAL_1
SectionContext_1
LINE_LITERAL_2
SectionContext_2
LINE_LITERAL_3
SectionContext_3
SectionContext_1
和 LINE_LITERAL_2
之间的相对顺序信息很重要。但是使用 antlr,我只能检索所有 LINE_LITERAL
的列表和另一个 SectionContext
.
您在派生上下文中看到的所有函数都是便捷方法。他们都在 children 列表上工作,该列表保留已被识别的标记(按照它们被识别的顺序)。例如,section()
方法遍历子列表并收集所有 SectionContext 元素。带有参数的 section 方法迭代子对象和 returns SectionContext 的 i-th 出现。
如果您想按照识别顺序获取子上下文,请使用子列表(C++ 目标中的ParseTree::children
)。