Là biểu thức chính quy


16

Nếu tôi có Ngữ pháp Loại 3, nó có thể được biểu diễn trên máy tự động đẩy xuống (không thực hiện bất kỳ thao tác nào trên ngăn xếp) để tôi có thể biểu diễn các biểu thức thông thường bằng cách sử dụng các ngôn ngữ không ngữ cảnh. Nhưng tôi có thể biết nếu một ngữ pháp loại 3 là , L L ( 1 ) , S L R ( 1 ) , v.v. mà không xây dựng bất kỳ bảng phân tích cú pháp nào không?LR(1)LL(1)SLR(1)

Câu trả lời:


15

Tất cả các ngôn ngữ thông thường có LL (1) ngữ pháp. Để có được ngữ pháp như vậy, hãy sử dụng bất kỳ DFA nào cho ngôn ngữ thông thường (có lẽ bằng cách thực hiện cấu trúc tập hợp con trên NFA thu được từ biểu thức chính quy), sau đó chuyển đổi nó thành ngữ pháp thông thường đệ quy đúng. Ngữ pháp này sau đó là LL (1), bởi vì bất kỳ cặp sản phẩm nào cho cùng một nonterminal đều bắt đầu bằng các ký hiệu khác nhau hoặc một ký hiệu tạo ra ε và có $ như một mã thông báo nhìn. Do đó, tất cả các ngôn ngữ thông thường cũng là LR (1), vì bất kỳ ngữ pháp LL (1) nào cũng là LR (1). Ngoài ra, bằng cách sử dụng một kết quả quan trọng từ bài báo này , bạn có thể chỉ ra rằng bất kỳ ngôn ngữ LR (1) nào cũng có ngữ pháp của máy ảnh DSLR (1), nghĩa là bất kỳ ngôn ngữ thông thường nào cũng có ngữ pháp của máy ảnh DSLR (1).

Tuy nhiên, các ngôn ngữ thông thường không phải là tất cả LR (0). Các ngôn ngữ LR (0) có các thuộc tính rất cụ thể - đặc biệt, chúng phải không có tiền tố. Do đó, ngôn ngữ thông thường {a, aa} không phải là LR (0), mặc dù nó rõ ràng là chính quy (regex a | (aa)). Tuy nhiên, các ngôn ngữ LR (0) không được chứa đúng trong các ngôn ngữ thông thường; ngữ pháp này cho {0 n 21 n | n 1} là LR (0), nhưng ngôn ngữ không thường xuyên:

S -> E
E -> 0E1 | 2

Hi vọng điêu nay co ich!


2
Thực tế là các ngữ pháp thông thường đúng chấp nhận chính xác bộ ngôn ngữ thông thường thường được thực hiện trong lớp (hoặc thậm chí là các bài tập), vì vậy câu trả lời là ngay lập tức hơn nhiều.
Raphael

2

Cú pháp biểu thức chính quy (đơn giản cũ) (bạn nói "đại diện") là LR (0). Bạn không cần bất kỳ cái nhìn nào để phân tích một chuỗi đại diện cho biểu thức chính quy. Bạn có thể dễ dàng quyết định điều này bằng cách chạy trình tạo trình phân tích cú pháp trên ngữ pháp cho biểu thức chính quy: -} Bạn cũng có thể dễ dàng mã hóa trình phân tích cú pháp đệ quy đơn giản (LL (0)) cho biểu thức chính quy; bất cứ điều gì là LL (0) là LR (0).

Tôi không biết liệu cú pháp của "regexps" phức tạp hơn như Perl có giống như thế này không; nhưng regexps của Perl mạnh hơn nhiều so với regexps vì vậy chúng không phải là regexps cũ đơn thuần.

Để xác định xem một ngữ pháp có một số thuộc tính, bạn phải chạy một số loại vị ngữ. Để xác định xem đó có phải là (S) LR (k) hay không, bạn phải chạy một vị từ có thể kiểm tra thuộc tính đó. Trong thực tế, bất kỳ vị từ như vậy phải có hiệu lực xây dựng các bảng phân tích, vì cách chúng được xác định.


Biểu thức chính quy Perl hoạt động trên NFA

Câu hỏi không phải là về cách thức hoạt động của Perl regexps. Đó là về việc liệu các biểu thức (Perl?) Có thể được phân tích cú pháp bởi các công nghệ nhất định hay không. Tôi có thể tin rằng các biểu thức Perl sử dụng NFA để thực hiện khớp, cùng với một số cách thu thập dữ liệu nhạy cảm theo ngữ cảnh khác, nhưng tôi không thấy sự liên quan đến câu hỏi.

3
-1 Các biểu thức chính quy không phải là LR (0). Các ngôn ngữ LR (0) phải không có tiền tố, nhưng biểu thức chính quy a|(aa)mô tả một ngôn ngữ không có tiền tố. Ngoài ra, các ngôn ngữ LR (0) không thể xử lý ngữ pháp với các sản phẩm epsilon, vì vậy ngôn ngữ thông thường {epsilon, a} không phải là LR (0). Tuy nhiên, các ngôn ngữ thông thường LL (1) vì bạn có thể viết chúng dưới dạng ngữ pháp thông thường, và do đó tất cả chúng đều là LR (1). Vì bất kỳ ngôn ngữ LR (1) nào cũng có ngữ pháp SLR (1), điều này có nghĩa là tất cả các ngôn ngữ thông thường là SLR (1).
templatetypedef

1
Liên quan đến LL (0), đó là một cách khác: Các ngôn ngữ LL (0) là một tập hợp con của các ngôn ngữ thông thường. Lưu ý rằng LL (0) có nghĩa là bạn không sử dụng lookahead để quyết định giữa các dẫn xuất khác nhau - điều đó có nghĩa là về cơ bản không có quyết định và ngôn ngữ chỉ bao gồm một từ. Ngược lại, LR (0) là một lớp hữu ích - một lần nữa bạn không sử dụng lookahead để quyết định (ở đây để giảm), nhưng vẫn có một số sự đa dạng do thực tế là việc dịch chuyển có thể phân biệt giữa các sản phẩm khác nhau.

1
@ IraBaxter- Cú pháp của biểu thức chính quy không phải là LR (0) vì các biểu thức chính quy không có tiền tố. Chúng cũng không phải là LL (0), vì các ngôn ngữ LL (0) chỉ có thể chứa một chuỗi (hoặc không có chuỗi).
templatetypedef
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.