Chuyển đổi ngữ pháp biểu thức số học


9

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:

  1. 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
  2. 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.

  3. 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à Pbiểu thức Chính) và theo sau nó bởi Tail tùy chọn T, 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ôi T, hoặc có thể trống:

    E --> P T
    T --> B E T |

    (lưu ý thay thế trống cho đuôi).

  4. 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ó Ethay vì Pbê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ó Ethay vì Ptrong sản xuất đầu tiên cho P.

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ế Pcho 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ì?


Vui lòng xem xét sử dụng LaTeX để định dạng. Xem ở đây cho một mồi . (Xem tại đây để thảo luận về sự phù hợp của LaTeX trong trường hợp này.)
Raphael

Câu trả lời:


8

Bước còn thiếu:

E --> P T
T --> B E T |

viết lại E trong T:

E --> P T
T --> B P T T | 

Đơn giản hóa T:

E --> P T
T --> B P T | 

Tương đương với:

E --> P T
T --> {B P}

Và có bạn đây.


1
Cảm ơn vì một câu trả lời hay :-) Bây giờ tôi thấy những gì tôi đã bỏ lỡ: Tôi đã thay thế nó theo cách khác và đó là vấn đề. Nhưng tôi vẫn không hiểu một phần nhỏ: Làm thế nào để bạn biết rằng bạn có thể hợp nhất các phần Tlại với nhau thành một T? Có quy định nào cho điều đó không? (Tôi nghi ngờ nó có thể giống với quy tắc trong logic đại số Boolean có nội dung "aa = a".)
SasQ

Tại sao bài đăng này được chuyển đến đây từ cstheory.sx và sự khác biệt là gì? Tôi muốn biết để tránh những sai lầm trong tương lai.
SasQ

2
@SasQ CSTheory chỉ dành cho các câu hỏi ở cấp độ nghiên cứu trong khoa học máy tính lý thuyết, xem Câu hỏi thường gặp về CSTheory để biết chi tiết.
Juho

1
@SasQ: tạo và . Tổng quát hơn, cho bất kỳ ngôn ngữ nào. Lưu ý rằng việc có từ trống là phía bên tay phải là rất quan trọng; cái này không giữ cho tất cả các đoạn ngữ pháp, vì . x T x T ε L L = L L ε L + L +L +TxTTεxTxTεLL=LLεL+L+L+
Raphael

@Raphael: Điều đó có liên quan gì đến quy tắc bình thường *không? Tôi đã thấy trong "Sách rồng" (3.3, tr.91) đó x** = x*. Đó có phải là quy tắc tương tự bạn đã sử dụng?
SasQ
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.