Показать сообщение отдельно
Старый 02.11.2008, 08:27   #85
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
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 кодеров) таким образом подключив всю яву...

Я хоть немного впилюсь в тему...
(Offline)
 
Ответить с цитированием