Tôi đã xem qua tài liệu ANTLR v3 (và bản sao đáng tin cậy của tôi về "Tham chiếu ANTLR Definitive"), và dường như tôi không thể tìm ra một cách rõ ràng để thực hiện các chuỗi thoát trong chuỗi ký tự (Tôi hiện đang sử dụng mục tiêu Java). Tôi đã hy vọng để có thể làm điều gì đó như:Làm thế nào để xử lý các chuỗi thoát trong chuỗi ký tự trong ANTLR 3?
fragment
ESCAPE_SEQUENCE
: '\\' '\'' { setText("'"); }
;
STRING
: '\'' (ESCAPE_SEQUENCE | ~('\'' | '\\'))* '\''
{
// strip the quotes from the resulting token
setText(getText().substring(1, getText().length() - 1));
}
;
Ví dụ, tôi muốn token đầu vào "'Foo\'s House'
" để trở thành String "Foo's House
".
Thật không may, cuộc gọi setText(...)
trong đoạn ESCAPE_SEQUENCE
đặt văn bản cho toàn bộ mã thông báo STRING
, điều này rõ ràng không phải là thứ tôi muốn.
Có cách nào để thực hiện ngữ pháp này mà không thêm phương thức quay lại chuỗi kết quả và thay thế chuỗi thoát theo cách thủ công (ví dụ: với số setText(escapeString(getText()))
trong quy tắc STRING
)?
Tôi đã sử dụng phương pháp này, nhưng lưu ý rằng tôi phải thêm "getText()" thay vì "escaped.getText()" ở mỗi bước. Đoạn này viết văn bản chưa thoát gốc cho toàn bộ mã thông báo STRING, mà getText() trả về. Đối với tôi, escaped.getText() trả về đoạn ban đầu với các dấu gạch chéo ngược nguyên vẹn. –