Làm cách nào để siêu ký tự phủ định, ~
, được sử dụng trong các quy tắc lexer và phân tích cú pháp của ANTLR?Bỏ qua các quy tắc lexer và phân tích cú pháp
Trả lời
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') ;
Vì '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ừ B
và D
, 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 ;
- 1. Kết hợp phân tích cú pháp phân tích cú pháp, phân tích cú pháp và phân tích cú pháp rừng
- 2. Hướng dẫn thiết kế cho trình phân tích cú pháp và lexer?
- 3. Công cụ quy tắc - Cách lưu trữ các quy tắc để tránh phân tích cú pháp khi chỉnh sửa?
- 4. Bỏ qua DTD khi phân tích cú pháp XML
- 5. Trình tạo trình phân tích cú pháp và trình phân tích cú pháp cho Common Lisp
- 6. SimpleDateFormat bỏ qua tháng khi phân tích cú pháp
- 7. Phân tích cú pháp JavaScript regex với ANTLR
- 8. Trình phân tích cú pháp CSS/HSS trong các quy tắc biểu định kiểu Treetop và lồng nhau
- 9. Cách thích hợp để giải quyết sự không rõ ràng về quy tắc lexer ANTLR?
- 10. MS Web Deploy Bỏ qua Quy tắc không bỏ qua
- 11. Dấu ngoặc kép với khai báo trả về quy tắc phân tích cú pháp đầu tiên trong ngữ pháp ANTLR4
- 12. phân tích cú pháp cấu trúc đệ quy trong scala
- 13. antlr 4 Không thể tải dưới dạng lexer hoặc phân tích cú pháp
- 14. Ocaml - Tệp và phân tích cú pháp
- 15. Viết phân tích cú pháp đệ quy với pyparsing
- 16. Quy tắc lexer ANTLR tiêu thụ các ký tự ngay cả khi không khớp?
- 17. Haskell - Trình phân tích cú pháp gốc đệ quy
- 18. gcc để phân tích cú pháp mã
- 19. Phân tích cú pháp Ruby: phân tích cú pháp nhiều dòng
- 20. Trình phân tích cú pháp phân tích cú pháp của scala có phân tích cú pháp các tệp nhị phân không?
- 21. MongoDB + Java - phân tích cú pháp JSON qua com.mongodb.util.JSON.parse
- 22. Phân tích cú pháp XML trong Java thông qua Groovy
- 23. Làm sao để phân tích cú pháp JSON JSON bỏ qua json_class?
- 24. Trình phân tích cú pháp tùy chỉnh bỏ qua với Boost :: Spirit
- 25. Phân tích cú pháp cây và thông tin ngữ pháp
- 26. Lợi ích của phân tích cú pháp ứng dụng qua phân tích cú pháp đơn thuần là gì?
- 27. Phân tích cú pháp HTML trong perl
- 28. Ký tự khớp với nhiều quy tắc Lexer trong ANTLR
- 29. Phân tích cú pháp không phân tích cú pháp đúng cách ("href") trong IE
- 30. Trình phân tích cú pháp cho các biểu thức chính quy trong PHP?
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
@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. –