2013-05-10 33 views
7

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?

Trả lời

7

Trong ANTLR 4, bạn có thể sử dụng các chế độ lexer cho việc này.

STRING : [a-z-]+; 
LBRACK : '[' -> pushMode(CharSet); 

mode CharSet; 

DASH : '-'; 
NUMBER : [0-9]+; 
RBRACK : ']' -> popMode; 

Sau khi phân tích một nhân vật [, lexer sẽ hoạt động trong chế độ CharSet cho đến khi một nhân vật ] đạt được và lệnh popMode được thực thi.

+0

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

+1

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. –

+0

Đâ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

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