2011-11-27 36 views

Trả lời

23

Việc bỏ qua có thể xảy ra bên trong lexer and parser rules.

Quy tắc lexer bên trong, bạn có thể từ chối các ký tự và bên trong quy tắc phân tích cú pháp bạn có thể từ chối mã thông báo (quy tắc lexer). Nhưng cả hai quy tắc lexer và phân tích cú pháp chỉ có thể phủ nhận một hoặc hai ký tự đơn, tương ứng.

Một vài ví dụ:

quy tắc lexer

Để phù hợp với một hoặc nhiều ký tự, ngoại trừ chữ ascii chữ thường, bạn có thể làm:

NO_LOWERCASE : ~('a'..'z')+ ; 

(sự phủ định-meta-char, ~, có mức độ ưu tiên cao hơn so với +, vì vậy quy tắc trên bằng (~('a'..'z'))+)

Lưu ý rằng 'a'..'z' phù hợp với một nhân vật duy nhất (và có thể therefor được phủ nhận), nhưng các nguyên tắc sau là không hợp lệ:

ANY_EXCEPT_AB : ~('ab') ; 

'ab' (rõ ràng) phù hợp với 2 ký tự, nó không thể được vô hiệu hóa. Để phù hợp với một token bao gồm 2 nhân vật, nhưng không 'ab', bạn phải làm như sau:

ANY_EXCEPT_AB 
    : 'a' ~'b' // any two chars starting with 'a' followed by any other than 'b' 
    | ~'a' . // other than 'a' followed by any char 
    ; 

quy tắc phân tích cú pháp

quy tắc phân tích cú pháp Bên trong, ~ phủ nhận một thẻ nào đó, hoặc nhiều hơn một mã thông báo. Ví dụ, bạn có các thẻ sau định nghĩa:

A : 'A'; 
B : 'B'; 
C : 'C'; 
D : 'D'; 
E : 'E'; 

Nếu bây giờ bạn muốn để phù hợp với bất kỳ dấu hiệu ngoại trừ A, bạn làm:

p : ~A ; 

Và nếu bạn muốn để phù hợp với bất kỳ thẻ trừ BD, bạn có thể làm:

p : ~(B | D) ; 

Tuy nhiên, nếu bạn muốn để phù hợp với bất kỳ hai thẻ khác hơn A tiếp theo B, bạn không có thể làm:

p : ~(A B) ; 

Cũng như với các quy tắc lexer, bạn không thể phủ nhận nhiều hơn một thẻ duy nhất. Để thực hiện ở trên, bạn cần làm:

P 
    : A ~B 
    | ~A . 
    ; 

Lưu ý rằng . (DOT) char trong một quy tắc phân tích cú pháp không không trận đấu bất kỳ ký tự như nó bên trong quy tắc lexer. Các quy tắc phân tích cú pháp bên trong, nó khớp với bất kỳ mã thông báo nào (A, B, C, D hoặc E, trong trường hợp này).

Lưu ý rằng bạn không thể phủ nhận quy tắc phân tích cú pháp. Nội dung sau đây là bất hợp pháp:

p : ~a ; 
a : A ; 
+0

Cảm ơn bạn đã giải thích rõ. Tôi không biết rằng toán tử '~' sẽ áp dụng cho các thẻ khi xảy ra trong một quy tắc phân tích cú pháp. – Gunther

+0

@Xin chào, không sao cả. Tôi thường đề cập đến nó một thời gian ngắn trong các câu trả lời của tôi, vì vậy từ bây giờ tôi có thể liên kết với phần Hỏi & đáp này. W.r.t. công cụ chuyển đổi của bạn, có lẽ bạn đã sử dụng nó, nhưng có lẽ không: lớp 'org.antlr.tool.Strip' loại bỏ tất cả mã tùy chỉnh khỏi các tệp ngữ pháp ANTLR, điều này có thể làm cho cuộc sống của bạn dễ dàng hơn khi phân tích ngữ pháp ANTLR. –

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