Начну с начала.
Компиляторами я занимаюсь давно. (Вообще я давно перешел на уровень создания
того, на чем люди делают что-то, редакторы, IDE, конструкторы...) но не в этом суть. Суть в том, что после 3-го или 4-го компилера я понял где основные грабли.
Вспомни первый свой декомпилер. На разбор пула ушло 2 дня, и неделя на ассемблер. Почему? Потому что это основа или нижний уровень, которых в компиляторе два - лекс. ан. и кодлгенератор.
Так как все языки семантически схожи только в одном, именно в выражениях, то и нижний уровень - ассемблер. А значит и начинать надо с него. Креншоу поэтому правильно сделал и написал с чего надо начинать.
Возмем например строку
a=b+c b и посмотрим её представление в различных асмах.
Fasm:
mov eax, [esp -4] - переменная b
mov ebx, [esp -8] - переменная c
add eax, ebx - сложение
mov [esp -0], eax - приравнивание a
код относительный - от балды, теперь на Java асм
bipush 2
bipush 3
iadd
iload 1
код тоже по памяти и от вола!
Что мы видим? Похоже, очень даже... Ну да и иначе не могло и быть, асм он и в рассеи асм. Ладно, надеюсь с этим понятно. Тоесть любое выражение можно перевести (не важно на какой ассемблер) а потом перевести с асм на асм дело всего лишь техники! (Вернее дело рук в переписывании операторов).
Теперь рассмотрим ОПЗ (
http://www.wl.unn.ru/~ragozin/compiler/compil/g11.htm
http://decoding.narod.ru/practic/pol...ishrecord.html
)
Из статей понятно, что этим алгоритмом мы по сути готовим строку под ассемблер, не просто готовим, а уже получаем готовый годогенератор для
ассемблера безо всяких там рекурсий и вставкой кода...
Сравним строку
a = b + c в ОПЗ и ассемблером?
b c + a =
mov eax, [esp -4] - переменная b
mov ebx, [esp -8] - переменная c
add eax, ebx - сложение
mov [esp -0], eax - приравнивание a
тут по моему становится ясным мысль о ОПЗ, но тут опять грабли, строка вида
1+a+2+b+3+c
Может вырасти в очень длинный код на ассемблере, поэтому её надо оптимизировать, тобишь привести к виду a+b+c +6, что бы уменьшить код конечного файла, что бы не падал компилятор от переполнения да и наконец - это сложно и круто! Ну и приятно...
Так вот я предлагаю, пока оставить на время верхний уровень, он нам ни черта не нужен пока и заняться нижним уровнем, а именно функцией ВЫРАЖЕНИЕ (Expression), потому что как только мы сделаем эту функцию или набор функций остальное просто останется банальностью, а именно работой сканера и вызов соответствующих функций.
Кстати когда и если мы ето замутим форум может просто лечь от наплыва студентов - курсовиков!!!
ЗЫ...
Никлаус мужик умный, тока он делал свои компилеры под свою Р-машину.
Но выкладываю его Оберон (Модула 2) переделаный для виндовс и сам себя компилящий без глюков. Сайт с документацией и описаловом
http://home.perm.ru/strannik/
Сдесь реализована поддержка 3х языков, Модула-Си-Паскаль (к стати в Оберон я влюбляюсь все более и более) И по исходникам можно глянуть реализацию сканера и т.д. Да и сам язык - это крутой паскаль!!!
Сдесь уже готовый компилер на Обероне
http://www.uni-vologda.ac.ru/job/rus/
связаться с автором пока не удалось, но буду искать
Ну вообщем вот пока мысли......................
Да совсем забыл... Этот модуль будет базовым для
ЛЮБОГО компилятора...