使用Antlr中的语法规则获取一组匹配的文本片段

本文关键字:一组 文本 片段 Antlr 语法 规则 使用 获取 | 更新日期: 2023-09-27 18:28:53

我定义了一组语法规则。将其视为一个示例规则。

public bodylist
    : bodyset*
    ;
public bodyset
    : ruleSet
    | media
    | page
    ;  

如果我必须使用这个规则进行解析,我必须按照以下方式进行。

        Stream inputStream = Console.OpenStandardInput();
        ANTLRInputStream input = new ANTLRInputStream(inputStream);
        CLexer lexer = new CLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        CParser parser = new CParser(tokens);
        parser.bodylist();

我对访问流中段的体集匹配集的方式感到困惑。似乎我必须做另一个解析,如下

        parser.bodyset();

流中可以有多个体集语法匹配段集。

比方说,在输入流中,我们有多个匹配该规则的地方。我想要的是获得关于这些bodyset信息集的信息(在每个信息中,语法规则的开始和结束是什么)。

我无法找到访问流中bodyset语法规则的匹配集的信息的方法。我对API感到困惑。

使用Antlr中的语法规则获取一组匹配的文本片段

ANTLR 3不像ANTLR 4那样自动创建具有侦听器和访问者的解析树。您需要执行以下操作之一:

  1. 升级至ANTLR 4,其中bodylist方法将返回一个BodylistContext对象,该对象提供了一个返回BodysetContext对象集合的bodyset()方法(每个解析的bodyset一个)
  2. 继续使用ANTLR3,但使用output=AST特性和树语法来处理输入
  3. 继续使用ANTLR3,并将操作代码添加到语法中,以手动构建解析树