В последнее время я работал над написанием простого компилятора, чтобы лучше понимать концепции компилятора. Являясь прилежным читателем stackoverfolow, кажется, что существует консенсус в отношении того, что писать компилятор на функциональном языке проще, чем императивный. Для этого я решил попробовать убить двух птиц и написать компилятор в F #, чтобы изучить функциональный язык и написать компилятор одновременно.
Я читал книгу драконов и решил начать с рекурсивного парсера спуска, написанного вручную в F #. Однако книга драконов имеет почти все образцы кода в императивном стиле. Например, функция токена соответствия выполняет значительную часть своей работы с помощью побочного эффекта.
Итак, мой вопрос заключается в том, как выглядит более традиционный функциональный подход к разбору (т.е. несколько побочных эффектов)? Я знаю, что компилятор Haskell (GHC) написан в Haskell, но я был бы признателен за несколько меньшее и более легкое понимание кода.
Во-вторых, стоит ли попытаться применить функциональный подход к синтаксическому разбору или действительно ли это на оптимизацию промежуточного кода, который светят функциональные языки, и я просто еще не получил его? То есть, должен ли я fuddle через синтаксический анализ в F #, используя императивный стиль, и переключиться на более функциональный подход позже?