16

我正在尝试将我的语法从 v3 转换为 v4,并且在找到所有正确的部分时遇到了一些麻烦。

在 v3 中处理字符串时,我使用了:

public static DataExtractor create(String dataspec) {
    CharStream stream = new ANTLRStringStream(dataspec);
    DataSpecificationLexer lexer = new DataSpecificationLexer(stream);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    DataSpecificationParser parser = new DataSpecificationParser(tokens);

    return parser.dataspec();
}

如何将其更改为在 v4 中工作?

4

2 回答 2

27

对于 ANTLR 4.7,API 进行了一些更改(不推荐使用 ANTLRInputStream):

InputStream stream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));
lexer.setInputStream(CharStreams.fromStream(stream, StandardCharsets.UTF_8));
parser.setInputStream(new CommonTokenStream(lexer));

提示:如果您想重用解析器+词法分析器实例,请在设置其输入流后调用它们的“reset()”方法。

于 2017-06-04T15:42:46.120 回答
17

所做的更改是:

  • ANTLRStringStream已被替换为一个构造函数,ANTLRInputStream其中需要一个String
  • 解析器规则现在返回一个上下文对象,该对象具有根据returns您的规则条款命名的公共字段。

因此,如果dataspec规则说“ returns [DataExtractor extractor]”,则 v4 方法变为:

public static DataExtractor create(String dataspec) {
    CharStream stream = new ANTLRInputStream(dataspec);
    DataSpecificationLexer lexer = new DataSpecificationLexer(stream);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    DataSpecificationParser parser = new DataSpecificationParser(tokens);

    return parser.dataspec().extractor;
}
于 2013-08-07T17:45:00.750 回答