2013-08-07 27 views
9

Tôi đang cố chuyển đổi ngữ pháp của mình từ v3 thành v4 và gặp khó khăn khi tìm tất cả các phần phù hợp.Xử lý một chuỗi với ANTLR4

Trong v3 để xử lý một String, tôi đã sử dụng:

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(); 
} 

Làm thế nào để thay đổi điều này để làm việc trong v4?

Trả lời

13

Những thay đổi đã được thực hiện như sau:

  • ANTLRStringStream đã được thay thế bằng một constructor trong ANTLRInputStream mà phải mất một String
  • quy tắc phân tích cú pháp hiện nay trả về một đối tượng bối cảnh trong đó có một lĩnh vực công cộng được đặt tên theo returns mệnh đề của quy tắc của bạn.

Vì vậy, nếu các quy tắc dataspec nói "returns [DataExtractor extractor]", v4 phương pháp này trở thành:

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

Đối với ANTLR 4.7 API đã được thay đổi một chút (ANTLRInputStream bị phản đối):

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

Gợi ý: nếu bạn muốn sử dụng lại các trình phân tích cú pháp + lexer, hãy gọi các phương thức 'reset()' của chúng sau khi thiết lập luồng đầu vào của chúng.

Các vấn đề liên quan