Saya punya masalah dengan latihan ini:
Biarkan G menjadi tata bahasa ambigu berikut untuk kalkulus λ:
E → v | λv.E | EE | (E)
di mana E adalah simbol non-terminal tunggal, λv.E mewakili abstraksi dari variabel v di E, dan EE mewakili aplikasi.
- Definisikan tata bahasa LL (1) G ′ sedemikian rupa sehingga L (G ′) = L (G) dan ambiguitas G diselesaikan dengan memaksakan konvensi biasa berikut:
- abstraksi adalah asosiatif yang benar;
- aplikasi dibiarkan asosiatif;
- aplikasi memiliki prioritas lebih tinggi daripada abstraksi.
- Perlihatkan tabel penguraian LL (1) untuk G ′ dan pohon pengurai yang diperoleh saat mengurai string
λv1. λv2. v1v2v1
.
Saya menghilangkan prioritas ambiguitas pengaturan dan asosiasi, mendapatkan tata bahasa ini:
E -> EF | F
F -> λv.G | G
G -> (E) | v
yang bukan LL (1), karena produksi E -> EF
dibiarkan rekursif. Namun, menghilangkan rekursi kiri dari produksi itu saya dapatkan:
E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v
yang tidak memenuhi persyaratan 1.2.
Saya mencari solusi di Internet, tetapi sepertinya tidak mungkin untuk menghilangkan rekursi kiri yang menjaga asosiatif kiri.
Namun, latihan ini muncul pada ujian kompiler beberapa tahun yang lalu, jadi harus ada jawaban yang benar.
Terima kasih untuk bantuannya.
sumber
Usaha saya:
Tata bahasa ini adalah LL (1) dan harus menghormati properti yang diperlukan.
sumber