Mengapa C Menentang Penghuraian LR(1)
Banyak bahasa pengaturcaraan, termasuk C, boleh dihuraikan dengan berkesan menggunakan parser LR(1). Walau bagaimanapun, C menonjol sebagai pengecualian kepada peraturan ini, menimbulkan cabaran unik untuk teknik penghuraian LR tradisional.
Kekaburan dalam Sintaks Perisytiharan
Inti C 's kerumitan penghuraian terletak pada sintaks pengisytiharannya. Pertimbangkan pernyataan:
x * y ;
Pernyataan ini boleh ditafsirkan dalam dua cara yang berbeza:
Kekaburan ini timbul daripada fakta bahawa C membenarkan simbol asterisk (*) digunakan sebagai pengisytiharan penunjuk dan sebagai pengendali pendaraban.
Batasan Penghuraian LR
LR (1) parser direka bentuk untuk mengendalikan tatabahasa yang LL(1), bermakna setiap simbol bukan terminal dalam tatabahasa mempunyai paling banyak satu pengembangan yang mungkin untuk sebarang simbol input. Walau bagaimanapun, kekaburan dalam sintaks pengisytiharan C melanggar syarat ini, kerana simbol * boleh berkembang kepada sama ada pengisytiharan penunjuk atau operasi pendaraban.
Had asas ini menghalang penghurai LR(1) daripada menyelesaikan kekaburan dengan betul dalam sintaks pengisytiharan C.
Mengatasi Cabaran
Untuk menghuraikan C dengan berkesan, pengkompil biasanya menggunakan teknik yang lebih canggih yang melangkaui kekangan penghuraian LR(1). Beberapa pendekatan biasa termasuk:
Teknik ini mengatasi batasan LR(1) menghuraikan dan membolehkan tafsiran tepat tatabahasa mencabar C.
Atas ialah kandungan terperinci Mengapa Penghurai LR(1) Tidak Boleh Mengendalikan Sintaks Perisytiharan Kabur C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!