Re: создание MIDletPascal compiler'a
Вобчем хоть убей я всеравно мысли не улавливаю...
Давай обьясню чо я мутю...
Итак, делаю 4 (пока) модуля
global.pas
scaner.pas
parser.pas
codegen.pas
В первом вынес все переменные и константы.
Второй отвечает за разбор исходного текста
Третий по разобраному лепит class файл
четвертый как раз функции генерации class файла.
Принцип следующий.
scaner.pas разбирает исходный текст на слова и возвращает нам
тип слова (оператор, переменная, функция...) парсеру,
парсер в зависимоста от типа вырабатывает вызов функции кодогенератора
который в свою очередь и лепит байт к байту в соответствии с правилами
построения class файла.
Пример
program HelloWord;
begin
writeln('HelloWord');
end.
Парсер запрашивает у сканера тип первого слова
Сканер возвращает program - > оператор - начало программы
Парсер проверяет что бы за этим оператором шло название программы
и точка с запятой, если ошибок не было, парсер делает следующий запрос...
И т.д. и т.п. рекурсивно. В итоге любой язык можно транслировать в другой,
не взирая на синтаксис программиста (переносы строк и т.д) и более того,
к компилятору можно прикрутить любой выходной файл, в принципе повторить
Турбо паскаль не сложно, или бэйсик или яву... Так как функции рекурсивны, то вызов их может быть выполнен из любой точки кода...
Допустим имеем код
a:= 22+ 12.3/45 - (a+b);
За операцию присваевания будет отвечать функция assignment()
за разбор выражения - expression();
В итоге у нас наше присваевание сведется к минимальному разбору
типа assignment( expression()); и рекурсия позволит учитывать приоритет
операций.
Просто у меня пока запарка с работой, а так я уже пишу помалень оптимизированый на этом уровне код, который из строки
a:= 2+3 -1/2 +(a*2-4);
сразу же просчитает все смысловые выражения и странслирует только
a:= 4.5 + (a*2 - 4);
дальше пока не иду....
Вот где самый затор - в оптимизации, остальное все просто дело техники...
А у тебя я поверь, не могу смысла уловить? На кой декомпилировать class файл и потом из этого что получилось опять лепить class файл???
Ты опиши хотя б в двух словах, что хоть на этапах построения или компиляции будет?
Типа вот так
Компилер рекурсивный
Исходный код на Pascal транслирует в JavaAsm
создаст контекстный пул исходя из записей таблиц переменных, функций
и констант, которые возникнут при работе парсера и сканера.
Для дальнейшего расширения, можно будет копировать сканер с анализом
Java синтаксиса и сделать транслятор Pascal - Java (для разработчиков библиотек
и Java кодеров) таким образом подключив всю яву...
Я хоть немного впилюсь в тему...
|