2013-08-07 16 views
9

文法をv3からv4に変換しようとしていて、すべての適切な部分を見つけるのに問題があります。文字列を処理するために、V3にANTLR4で文字列を処理する

は、私が使用:

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で動作するようにこれを変更するにはどうすればよいですか?

答えて

13

行われた変更は、次のとおりです。

  • ANTLRStringStreamString
  • パーサー規則は、今returnsによるというパブリックフィールドを持つコンテキストオブジェクトを返す取るANTLRInputStreamでコンストラクタに置き換えられましたあなたのルールの句。だから、

方法になるV4 dataspecルールは、 "returns [DataExtractor extractor]を" と言う場合:ANTLR 4.7 APIについては

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

は(ANTLRInputStreamが推奨されません)を少し変更しました:

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

ヒント:パーサーとレクサーのインスタンスを再利用したい場合は、入力ストリームを設定した後で、 'reset()'メソッドを呼び出します。

関連する問題