Trong bài viết Phân tích biểu thức theo gốc đệ quy của Theodore Norvell (1999) , tác giả bắt đầu với ngữ pháp sau đây cho các biểu thức số học:
E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | E "^" E | "(" E ")" | v
Điều này khá tệ, vì nó mơ hồ và đệ quy trái. Vì vậy, anh ta bắt đầu từ việc loại bỏ đệ quy trái từ nó, và kết quả của anh ta là như vậy:
E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"
Nhưng tôi không thể hiểu làm thế nào anh ta đạt được kết quả này. Khi tôi cố gắng loại bỏ đệ quy bên trái, tôi sẽ thực hiện theo cách sau:
Firs, tôi tập hợp các sản phẩm không có đệ quy trong một nhóm và nhóm khác (đệ quy trái) trong một nhóm khác:
E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E // L-recursive E --> v | "(" E ")" | "-" E
Tiếp theo, tôi đặt tên cho chúng và yếu tố để thao tác dễ dàng hơn:
E --> E B E // L-recursive; B stands for "Binary operator" E --> P // not L-recursive; P stands for "Primary Expression" P --> v | "(" E ")" | U E // U stands for "Unary operator" B --> "+" | "-" | "*" | "/" | "^" P --> "-"
Bây giờ tôi chỉ cần đối phó với hai sản phẩm đầu tiên, bây giờ dễ đối phó hơn.
Tôi viết lại hai sản phẩm đầu tiên đó bằng cách bắt đầu từ sản xuất không đệ quy L (đơn giản là
P
biểu thức Chính) và theo sau nó bởi Tail tùy chọnT
, mà tôi xác định là phần còn lại của sản xuất ban đầu ít hơn phần đệ quy đầu tiên bên trái (nghĩa là, chỉB E
) theo sau là ĐuôiT
, hoặc có thể trống:E --> P T T --> B E T |
(lưu ý thay thế trống cho đuôi).
Hai sản phẩm bây giờ tôi có thể viết lại trong EBNF như thế này:
E --> P {B E}
gần như những gì tác giả nhận được, nhưng tôi có
E
thay vìP
bên trong mô hình lặp lại không hoặc nhiều hơn (Đuôi). Các sản phẩm khác tôi nhận được khá giống như anh ấy đã có:P --> v | "(" E ")" | U E B -> "+" | "-" | "*" | "/" | "^" U -> "-"
nhưng ở đây tôi cũng có
E
thay vìP
trong sản xuất đầu tiên choP
.
Vì vậy, câu hỏi của tôi là: Tôi đang thiếu gì? Biến đổi đại số nào trên cú pháp tôi cần tiến hành ngay bây giờ để có được hình thức chính xác giống như trình tự động nhận được? Tôi đã thử thay thế E
, nhưng nó chỉ dẫn tôi vào vòng lặp. Tôi nghi ngờ rằng tôi cần phải bằng cách nào đó để thay thế P
cho E
, nhưng tôi không biết bất kỳ chuyển đổi quy phạm pháp luật để biện minh cho điều đó. Có lẽ bạn biết bước thiếu cuối cùng là gì?