Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ANTLR4处理字符串_Java_String_Migration_Antlr4 - Fatal编程技术网

Java 使用ANTLR4处理字符串

Java 使用ANTLR4处理字符串,java,string,migration,antlr4,Java,String,Migration,Antlr4,我试图将我的语法从v3转换为v4,但在找到所有正确的部分时遇到了一些困难 在v3中,为了处理字符串,我使用了: public static DataExtractor create(String dataspec) { CharStream stream = new ANTLRStringStream(dataspec); DataSpecificationLexer lexer = new DataSpecificationLexer(stream); CommonTo

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

所做的更改包括:

  • ANTLRStringStream
    已替换为
    ANTLRInputStream
    中采用
    字符串的构造函数
  • 解析器规则现在返回一个上下文对象,该对象具有一个根据规则的
    returns
    子句命名的公共字段
因此,如果
dataspec
规则说“
返回[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;
}

对于ANTLR 4.7,API做了一些更改(不推荐使用ANTLInputStream):


提示:如果要重用parser+lexer实例,请在设置输入流后调用它们的“reset()”方法。

类中还有一个
CharStreams#fromString
。如果一个人只得到一个字符串并希望对其进行词法分析和解析,那么这将更有帮助。但谢谢你的提示:)
InputStream stream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));
lexer.setInputStream(CharStreams.fromStream(stream, StandardCharsets.UTF_8));
parser.setInputStream(new CommonTokenStream(lexer));