使用ANTLR4处理字符串



我正试图将语法从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中工作?

对于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));

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

所做的更改为:

  • 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;
}

相关内容

  • 没有找到相关文章

最新更新