ОК, поэтому здесь возникает вопрос: учитывая, что Haskell позволяет вам определять новые операторы с произвольным приоритетом оператора... как можно фактически анализировать исходный код Haskell?
Вы не можете знать, какие приоритеты операторов установлены до тех пор, пока вы не разобрали источник. Но вы не можете разобрать источник, пока не знаете правильные приоритеты операторов. Итак... мм, как?
Рассмотрим, например, выражение
x *** y +++ z
Пока мы не закончим синтаксический анализ модуля, мы не знаем, что импортируют другие модули, и, следовательно, какие операторы (и другие идентификаторы) могут быть в области видимости. Мы, конечно, еще не знаем их приоритетов. Но парсер должен что-то вернуть... Но должен ли он вернуться
(x *** y) +++ z
Или он должен возвращать
x *** (y +++ z)
Плохой парсер не знает. Это можно определить только после того, как вы выведете импорт, который приносит (+++)
и (***)
в область видимости, загружает этот файл с диска и узнает, что такое приоритеты оператора. Очевидно, что сам анализатор не собирается делать все эти операции ввода-вывода; парсер просто превращает поток символов в АСТ.
Очевидно, кто-то где-то выяснил, как это сделать. Но я не могу это решить... Любые подсказки?