Tôi có ngữ pháp sau đây để ANTLR 4:ANTLR 4 tokens lexer bên trong thẻ khác
grammar Pattern;
//parser rules
parse : string LBRACK CHAR DASH CHAR RBRACK ;
string : (CHAR | DASH)+ ;
//lexer rules
DASH : '-' ;
LBRACK : '[' ;
RBRACK : ']' ;
CHAR : [A-Za-z0-9] ;
Và tôi đang cố gắng để phân tích các chuỗi sau
ab-cd[0-9]
Mã parses ra ab-cd
trên bên trái sẽ được xử lý như một chuỗi chữ trong ứng dụng của tôi. Sau đó nó phân tích ra [0-9]
làm một bộ ký tự mà trong trường hợp này sẽ dịch sang bất kỳ chữ số nào. Ngữ pháp của tôi hoạt động đối với tôi, ngoại trừ tôi không muốn có quy tắc phân tích cú pháp khi quy tắc phân tích cú pháp đơn giản chỉ được coi là mã thông báo (CHAR | DASH)+
. Tôi thà lexer tạo một token STRING
và đưa cho tôi các thẻ sau:
"ab-cd" "[" "0" "-" "9" "]"
thay vì những
"ab" "-" "cd" "[" "0" "-" "9" "]"
tôi đã xem xét ví dụ khác, nhưng đã không thể để con nó ra . Thông thường các ví dụ khác có dấu ngoặc kép xung quanh các chuỗi ký tự như vậy hoặc chúng có khoảng trắng để giúp phân định đầu vào. Tôi muốn tránh cả hai. Điều này có thể được thực hiện với các quy tắc lexer hoặc tôi có cần phải tiếp tục xử lý nó trong các quy tắc phân tích cú pháp như tôi đang làm không?
Cảm ơn thông tin chi tiết này. Thiết lập subtokenizers như thế này nghe có vẻ như giải pháp hoàn hảo. Tôi nhận được một lỗi mặc dù nói rõ 'chế độ từ vựng chỉ được phép trong ngữ pháp lexer'. Tôi có thể khai báo ngữ pháp của mình là 'lexer ngữ pháp IdPattern;', nhưng sau đó tôi không thể sử dụng các quy tắc phân tích cú pháp. Tôi đang thiếu gì? – Charles
Bạn sẽ cần phải sử dụng một ngữ pháp 'lexer' cho lexer của bạn, và một' ngữ pháp phân tích cú pháp 'riêng biệt (trong một tệp riêng biệt) cho trình phân tích cú pháp của bạn. –
Đây là liên kết có thể giúp người khác: http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle