MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT ĐƠN GIẢN A = expr, d = + term, và B = term

Một phần của tài liệu Trình biên dịch nguuyên lý kỹ thuật và công cụ (Trang 57 - 59)

. 98 TỔNG QUAN VỀ BIÊN DỊCH

54MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT ĐƠN GIẢN A = expr, d = + term, và B = term

Ký hiệu chưa tận A là đệ qui trái bởi vì luật sinh A —› Ao cĩ A là ký hiệu tận trái ở vế phải. Áp dụng lập lại luật sinh này sẽ sinh ra một chuỗi các œ ở bên phải của A như trong Hình 2.18(a). Cuối cùng khí A được thay bằng B, chúng ta cĩ một p, theo sau là một chuỗi gồm zero hoặc nhiều œ,

Chúng ta cĩ thể cĩ được cùng kết quả như trong Hình 2.18(a) bằng cách viết lại các luật sinh cho A theo cách sau.

AE

#ộè dR |£ (2.11)

Ở dây đ là một. chưa tận mới. Luật sinh # -—+ œ R là đệ qui phải bởi vì luật sinh cho Ð cĩ R là ký hiệu cuối cùng ở vế phải. Các luật sinh đệ qui phải khiến các cây tăng trưởng xuống hướng sang phải như trong Hình 2.18(b). Các cây tăng trưởng xuống hướng về bên phải gây khĩ khăn cho việc địch các biểu thức cĩ chứa các tốn tử kết hợp trái như tốn tử trừ chẳng hạn. Tuy nhiên trong phần kế tiếp chúng ta sẽ thấy rằng bản dịch đúng đắn các biểu thức sang ký pháp hậu vị vẫn cĩ thể thực hiện được bằng cách thiết kế cẩn thận lược đồ địch dựa trên một văn phạm đệ qui phải,

Trong Chương 4, chúng ta sẽ xét các dạng tổng quát hơn của đệ qui trái và trình bày một phương pháp loại bỏ tất cả đệ qui trái ra khỏi một văn phạm,

9.5 MỘT CHƯƠNG TRÌNH DỊCH CHO CÁC BIỂU THỨC ĐƠN GIẢN

Sử dụng các kỹ thuật của ba phần vừa qua, chúng ta sẽ xây dựng một chương trình dịch dựa cú pháp đưới dạng một chương trình Ơ, cĩ khả năng dịch các biểu thức số học thành đạng hậu vị. Để bảo đảm cho chương trình khởi đầu đủ nhỏ để dễ quản lý, chúng ta bắt đầu với các biểu thức chứa các &ÿ số (digit) được phán cách bởi các dấu cộng và trừ. Ngơn ngữ này sẽ được mở rộng trong hai phần tiếp theo để bao gồm cả các số, định danh (identifier) và những tốn tử khác nữa. Bởi vì các biểu thức thường xuất hiện như những kết cấu trong rất nhiều ngơn ngữ nên rất cĩ ích khi nghiên cứu chỉ tiết cơng việc phiên dịch chúng.

@XpDr —> @xXpP + ferm { phù (®+*) } 6xpr —> @xpr — tem † print(®e) } expr —^_ lerm term -> 9Q { prữdt(*01) † term =>» 1 { prmf(*12) } ferm -—» 9 {prut( +87) }

56 MỘT TRÌNH BIÊN DỊCH MỘT LƯỢT ĐƠN GIẢN

văn phạm tạo thuận lợi cho việc phân tích. Mặt khác chúng ta lại cần một văn phạm cĩ thể dịch dễ dàng. Giải pháp rõ ràng là phải loại bỏ đệ qui trái. Tuy nhiên điều này cần phải được thực hiện cẩn thân như được minh họa qua thí dụ sau.

Thí dụ 2.9. Văn phạm dưới đây khơng thích hợp cho việc dịch các biểu thức sang dạng hậu vị, dù rằng nĩ cũng sinh ra chính ngơn ngữ của văn phạm trong Hình 2.19 và cĩ thể sử dụng được cho phân tích cú pháp đệ qui-xuống.

@xpr —> term. rest

rest: > + exXpr | — @pn | E ferm => 0 |1 |... L9

Văn phạm này cĩ vấn đề là tốn hạng của các tốn tử sinh ra bởi res/ —› + expr và rest ~ ~ expr khơng dễ nhận ra từ những luật sinh này. Khơng cĩ chọn lựa nào bên dưới được chấp nhận để tạo ra bản dịch res¿.t từ bản dịch expr.f:

rest + —đXpP { restl rẽ Ð' || exprt } 212)

rest — ~ expr { resikt c= exprt || S` } (2.18) (Chúng tơi chỉ trình bày luật sinh và hành động ngữ nghĩa cho tốn tử trừ). Bản dịch của 9-5 là 95-. Tuy nhiên nếu chúng ta sử dụng hành động trong (2.12) thì đấu trừ xuất hiện trước expr.£ và 9-5 được giữ nguyên là 9—5 trong bản dịch.

Mặt khác nếu chúng ta dùng (2.13) và dùng qui tắc tương tự cho dấu cộng, các tốn tử đều đi chuyển vẻ bên phải và 9-5+2 được dịch khơng đúng thành 952+- (bản dịch đúng là 95-2+). ]

Lắp ghép với lược đề dịch

Kỹ thuật loại bỏ đệ qui trái được phác thảo trong Hình 2.18 cũng cĩ thể áp dụng cho các luật sinh chứa hành động ngữ nghĩa. Chúng ta sẽ mở rộng phép biến đổi này trong Phần 5.5 và xem xét cả các ¿huộc tỉnh tổng hợp (synthesized attribute), Kỹ thuật này biến đổi các luật sinh A => Aơ | AB | y thành

AosyR

R-+oR | BR |e

Khi hành động ngữ nghĩa được gắn vào các luật sinh, chúng ta sẽ mang chúng vào kết quả biến đổi. Ở đây nếu đặt A = expr, œ = + term. { prutŒ+) }, B = ¬ ferm { prùdtC©) }, và y = term, phép biến đổi ở trên sẽ sinh ra lược đổ dịch (2.14). Các luật sinh expr trong Hình 2.19 đã được biến đổi thành các luật sinh cho expr và một ký hiệu chưa tận mới là rest trong (2.14). Các luật sinh cho ¿erm được lập lại như trong Hình 2.19. Chú ý rằng văn phạm này khác với văn phạm trong Thí dụ 2.9 và sự khác biệt này cho phép thu được bản dịch như mong đợi.

PHẲN 2.65 MỘT CHƯƠNG TRÌNH ĐỊCH CHO CÁC BIỂU THỨC ĐƠN GIẢN 57

AXpDF —=_ term rest

rest _—> +term { prUHÚ+) } rest | - term { prim(—') } rest | e

ttrm ~> 0{primtfC0) } (2.14)

term => 1{ pru#ŒfU) } tem —x» 9 { prùt(9) †

Hình 2.21 cho thấy quá trình dịch 9-5+2 nhờ văn phạm ở trên. expr (adsbygoogle = window.adsbygoogle || []).push({});

term : ` resL k `

` \

Một phần của tài liệu Trình biên dịch nguuyên lý kỹ thuật và công cụ (Trang 57 - 59)