Tôi muốn tạo ra một mã thông báo từ '..'
trong lexer ANTLR3 mà sẽ được sử dụng để chuỗi với nhau biểu hiện nhưANTLR3 lexer ưu tiên
a..b // [1]
c .. x // [2]
1..2 // [3]
3 .. 4 // [4]
Vì vậy, tôi đã thêm,
DOTDOTSEP : '..'
;
Vấn đề là rằng tôi đã có quy tắc:
FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f'))
;
Và ví dụ: [3] ở trên 1..2
tôi s nhận được kết hợp như là một FLOAT
(Tôi không chắc chắn lý do tại sao sau khi .
đầu tiên là một .
không phải là INT, nhưng nó là).
Tôi tự hỏi nếu có cách nào để thay đổi mức độ ưu tiên của quy tắc lexer để DOTDOTSEP
được đối sánh trước và sau đó FLOAT
.
Nhìn here có vẻ như tôi đang thua, "The rule having the greatest count is the winner.",
nhưng tự hỏi liệu có cách nào xung quanh nó hay không.
P.S. INT được định nghĩa là bên dưới ...
fragment DIGIT
: '0'..'9'
;
INT : DIGIT+
;
Chỉnh sửa. Một thử nghiệm nhỏ hơn nữa làm cho tôi nghĩ rằng nó không phải là khá đơn giản như nó nhận được trực tiếp phù hợp với quy tắc FLOAT
. (Tôi sẽ thay đổi câu hỏi nhưng kể từ khi tôi đã có câu trả lời ngay bây giờ, tôi sẽ không.) Vấn đề (tôi tin) vẫn nằm trong quy tắc ưu tiên lexer nên câu hỏi vẫn giữ nguyên.
Đó là nhận tôi gần gũi hơn nhiều, chỉ cần một chút tinh chỉnh nhiều hơn cần thiết. Các liên kết tôi đã không tìm thấy nhưng nó trông tuyệt vời; chỉ là thứ mà tôi nên đọc, vì vậy tôi phải làm điều đó ngay bây giờ. Cảm ơn. – tjm
Tôi đã nhận được nó ngay bây giờ độc đáo, chỉ cần một vài ghi chú cho bất cứ ai khác mà có thể đến bằng cách này. Trong ANTLRWorks v1.4, trình thông dịch không thể xử lý các biến vị ngữ vì vậy có vẻ như có lỗi khi không có (làm chậm tôi một chút) và tôi cũng phải thay đổi '$ settype (TYPE);' thành ' $ type = TYPE; ' – tjm
@tjm, tôi đã chỉnh sửa mẫu ANTLR một chút. Bây giờ nó có tương thích với v3 không? –