Tôi đang viết một trình cắm thêm Eclipse/Xtext cho CoffeeScript và tôi nhận ra rằng có lẽ tôi sẽ cần viết một từ vựng cho nó bằng tay. Trình phân tích cú pháp CoffeeScript cũng sử dụng một số hand-written lexer để xử lý thụt lề và các thủ thuật khác trong ngữ pháp.Viết lexer Xtext/ANTLR tùy chỉnh mà không cần tệp ngữ pháp
Xtext tạo lớp mở rộng org.eclipse.xtext.parser.antlr.Lexer
để mở rộng org.antlr.runtime.Lexer
. Vì vậy, tôi cho rằng tôi sẽ mở rộng nó. Tôi có thể thấy hai cách để làm điều đó
- Ghi đè
mTokens()
. Điều này được thực hiện bởi mã được tạo ra, thay đổi trạng thái bên trong. - Ghi đè
nextToken()
dường như là cách tiếp cận tự nhiên, nhưng sau đó tôi sẽ phải theo dõi trạng thái nội bộ.
Tôi không thể tìm thấy bất kỳ ví dụ nào về cách viết ngay cả một lexer đơn giản cho ANTLR mà không có tệp ngữ pháp. Vì vậy, câu trả lời dễ nhất sẽ là một con trỏ đến một.
Câu trả lời cho Xtext: grammar for language with significant/semantic whitespace đề cập đến todotext xử lý vấn đề thụt đầu dòng bằng cách thay đổi mã thông báo trong luồng đầu vào cơ bản. Tôi không muốn đi theo cách đó, bởi vì sẽ rất khó để xử lý các thủ đoạn khác của ngữ pháp coffeescript.
UPDATE:
tôi nhận ra rằng trong khi chờ đợi câu hỏi của tôi là một phần Xtext cụ thể.
Bạn chỉ cần triển khai 'ITokenSource' - và làm bất cứ điều gì bạn cần làm trong phương thức' nextToken'. Bạn đã kiểm tra http://stackoverflow.com/questions/4414166/antlr-parser-with-manual-lexer Có những ví dụ về xử lý thụt lề (ví dụ trong Python) trong Tham chiếu Antlr Definitive. – Jimmy