Мы работаем над синтаксическим анализом сверху вниз в классе разработки компилятора. Примерами являются все java-подобные языки. Я решил попробовать простой функциональный язык, чтобы сделать его интересным, поэтому я выбрал PCF (см., например, здесь ). Однако я не могу понять это в грамматике LL (1). Я думаю, что проблема заключается в применении функции (т.е. сопоставлении двух выражений). Я не получаю четких ответов о том, как определить, является ли это просто моим недостатком навыков или это язык, для которого нет грамматики LL (1) или LL (k), если уж на то пошло. Может кто-нибудь пояснить, мне просто нужно быть умнее или такой грамматики просто не существует?
По сути, моя версия PCF похожа на скетч ниже (прописные буквы не являются терминалами, комментарий начинается с "//"). Я говорю «что-то вроде», потому что я не привязан именно к этому, и я написал много вариантов - просто хочу разумный вариант PCF.
Обратите внимание, что я пробовал левофакторинг и учет старшинства с промежуточными нетерминалами.
Exp -> Const // integer and boolean literals, normal ops e.g. +
| if Exp then Exp else Exp
| lambda identifier dot Exp //lambda (function) abstraction
| Exp Exp // function application
| fix Exp // fixpoint operator (recursion)
A -> A α | β
эквивалентнаA -> β A'; A' -> ε | α A'
. Вы должны обобщить случай с большим количествомβ
s. - person Bakuriu   schedule 29.02.2016