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

时间:2013-08-25 15:02:16

标签: c# antlr antlr3

我已经定义了一组语法规则。将此视为示例规则。

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();

我对访问流中匹配的一组段的bodyset的方式感到困惑。看来我必须再做一次下面的解析

        parser.bodyset();

流中可能有多个bodyset语法匹配的一组段。

让我们说在输入流中我们有多个匹配此规则的位置。我想要的是获取有关这些bodyset信息集的信息(在每个中,语法规则的开始和结束)。

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

1 个答案:

答案 0 :(得分:1)

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

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