使用ANTLR4处理字符串

Bra*_*ace 15 java migration string antlr4

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

在v3中处理一个String,我用过:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

Dim*_* II 24

对于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));
Run Code Online (Sandbox Code Playgroud)

提示:如果要重新使用解析器+词法分析器实例,请在设置其输入流后调用其"reset()"方法.

  • 类中还有一个`CharStreams#fromString`。如果只有一个字符串并希望对其进行词法分析和解析,这会更有帮助。但谢谢你的提示:) (3认同)

Bra*_*ace 17

所做的更改是:

  • ANTLRStringStream已经被一个构造函数取代ANTLRInputStreamString
  • 解析器规则现在返回一个上下文对象,该对象具有根据returns规则子句命名的公共字段.

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

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;
}
Run Code Online (Sandbox Code Playgroud)