ANTLR article sai về PEG.
LL (*) là một tập hợp con của DCFG (Ngữ pháp ngữ pháp xác định miễn phí), là một tập hợp con của CFG (Ngữ cảnh miễn phí ngữ cảnh).
PEG thể diễn tả bối cảnh văn phạm tiếng nhạy cảm như A{n}B{n}C{n}
, trong đó A
và B
và C
tất cả xảy ra n
lần. Dưới đây là định nghĩa:
s := &(x C) A+ y/ε
x := A x B/A B
y := B y C/B C
Nhưng không có cách nào để xác định ngữ pháp như vậy trong CFG (bằng chứng liên quan đến bơm bổ đề). Vì vậy, PEG không phải là tập hợp con CFG. Liệu PEG có thay thế CFG không? Tôi không biết.
Hai khác biệt chính giữa LL (*) và PEG:
LL (*) chỉ có thể lookahead một mô hình DFA, trong khi PEG có thể lookahead một mẫu đệ quy. Ví dụ, trong PEG bạn có thể tra cứu các parens lồng nhau trong khi LL (*) không thể.
Toán tử lựa chọn /
trong PEG là lựa chọn ưu tiên (hoặc "sở hữu"), có nghĩa là nếu bạn có quy tắc A/AB
, nó sẽ không bao giờ đến bên tay phải AB
. Trong LL (*) cho một quy tắc A | AB
, có thể khớp với AB
.
Nếu bạn có một ngữ pháp PEG không có dấu nhìn hoặc mẫu lookahead của bạn có thể được giảm thành DFA, thì nó có thể được dịch sang LL (*). Nếu không, nó là không thể.
Ngữ pháp PEG của bạn chưa đúng. Nó cũng sẽ phân tích cú pháp A {n} B {n + 1} C {n + 1}. – CoronA
@CoronA Cảm ơn bạn đã chỉ ra, tôi đã chỉnh sửa câu trả lời bằng ngữ pháp được cập nhật để đảm bảo rằng C xảy ra ngay sau A {n} B {n}. – luikore