0

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

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 感到困惑。

4

1 回答 1

1

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

  1. 升级到 ANTLR 4,该bodylist方法将返回一个BodylistContext对象,该对象提供一个返回对象bodyset()集合的方法BodysetContext(每个bodyset已解析对象一个)。
  2. 继续使用 ANTLR 3,但使用output=AST特征和树语法来处理输入。
  3. 继续使用 ANTLR 3,并将操作代码添加到您的语法中以手动构建解析树。
于 2013-08-25T15:36:09.990 回答