Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LISP + JAVA, компилятор лиспа на яве 
:(
    Опции темы
ilnar
Дата 26.3.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



смышленный препод нашего инста подкинул задачку на автомат, так сказать..
тока вот толком не объяснил, как Ето сделать..

НАчит, цель проекта в следующем:
создание компилятора лиспа на яве, при этом дожен получится диалект лиспа, типизированный.. при компиляции должен создаваться файл class, как при компиляции прог на яве..

пока читаем книжку - КНИГА ДРАКОНА, спецификацию лиспа, байт кодов Явашных..
не маленькая.. а времени как всегда и у всех не хватает..

вопрос не маленький.. 
помогите с написанием некоторых станд функций Лиспа на байт кодах..
как ето делается?
PM MAIL   Вверх
semka
Дата 27.3.2007, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 21.3.2007
Где: Пермь

Репутация: нет
Всего: нет



Вообще я не очень понял, вы собираетесь прямо на байт-кодах компилятор писать?
Может посмотреть в сторону yacc (Yet another Compiler Compiler) или ему подобных средств?
Вот неплохая статья Writing A Lisp Interpreter In Haskell, автор вообще-то java программист и все примеры с Хаскеля переносит на "офункционаленную" Java (старается, по-крайней мере).
Удачи (:
PM MAIL WWW   Вверх
ilnar
Дата 27.3.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



Цитата

Вообще я не очень понял, вы собираетесь прямо на байт-кодах компилятор писать?


если честно сам не до конца понял..
сам компилятор должен быть на яве написан, а функции лиспа и др некоторая инфа на явашных байт кодах..
спс за ссылку ща поморим.. 
PM MAIL   Вверх
SandRa
Дата 27.3.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.3.2007

Репутация: нет
Всего: нет



Смотри ка, а ведь пальцем в небо....
м/п ссылка твоя до меня так и не дошла...

а найти я тебя сумела... , Ильнар!
PM MAIL ICQ   Вверх
ilnar
Дата 27.3.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



ноно.. без офтопа плиз..

PM MAIL   Вверх
adejneka
Дата 28.3.2007, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 8.7.2005
Где: Москва, Россия

Репутация: 9
Всего: 11



Посмотрите описание компилятора Linj: http://www.evaluator.pt/downloads/tutorial.html
PM MAIL   Вверх
ilnar
Дата 28.3.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



спасибо.. темная ссылочка..
PM MAIL   Вверх
ilnar
Дата 28.3.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



помгите плиз с описанием проекта на новел форже...

построение аст дерева на яве? наверно использовать нада класс множества - set??

спс заранее
PM MAIL   Вверх
Sardar
Дата 28.3.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Странно, препод должен был натаскать вас по теме, прежде чем задание давать, может не верно понял? ;-)

Любой LALR парсер (тот же CUP) схавает любой синтаксис, включая такокй простой как у LISP'а. Если тебе по душе отделение автоматов парсера от собственно кода, то GoldParser класнючая вещь, там же грамматики и для лиспа тоже.
Хотя мне ближе менее гибкий, но привычный и человекочитаемый javacc.

Парсером собираешь дерево выражений (AST). На этом этапе лучше остановиться и реализовать для каждого типа ноды метод eval(context), который бы вычислял значение ноды. Затем проверь как всё выполняется.

Интересней будет при генерации байткода. Сначала анализируем дерево, находим все вызовы функций и складываем их в пул констант. Их проще транслировать в статичные методы класса. Затем распознаём всё "примитивные" функции, на которые в Java есть прямые опкоды, всё остальное будет реально вызываться как статичные методы некоторого runtime класса.

Советую не париться с оптимизатором, тупо сделай метод compile(canvas), в каждой ноде, пусть генерит собственный байткод. Например:

Код
//для Java к примеру
int a = 100 * Math.random();

//AST:
(def:int
 (=
   (const 100)
   (call
      (reference-method 'random'
        (reference-class 'Math')
      )
    )
 )
)

//генеря байткод бежим от корня
push-int 100 -- const 100
push-object @Math  -- имена Math и random
invoke-static @random -- в пуле констант, здесь ссылки
mul
//на верхушке стека значение a


Ещё лучше трансливать  LISP в Java и пользоваться существующим компилером. Это не только совместимость с будущими JVM, но и просто гораздо проще реализовать.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
ilnar
Дата 31.3.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



мона о парсерах поподробней?..
PM MAIL   Вверх
ilnar
Дата 15.4.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



подскажите пожалуйста..

как создать и , что еще важнее, как юзать ниболе простенькую таблицу символов для лиспа на яве..

или др варианты, если они возможны...


???

буду очень рад за любую конструктивную инфу..
PM MAIL   Вверх
Sardar
Дата 16.4.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Смотря что ты понимаешь под таблицей символов. Это хештаблица(java.util.HashMap). Чем подробнее опишешь задачу, тем подробнее будет помощь.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
ilnar
Дата 16.4.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



НУ на первом этапе анализа нам необходимо токены (лексический анализ) записывать в В ТАБЛИЦУ, с которыми в последующем будет работать синтаксический анализатор, итогом работы которого, насколько я понял, также должна быть ТАБЛИЦА..

вот о их создании и использовании я  и писал..

вариант нужен наиболее простой (но рабочий), ибо знаний маловато..
PM MAIL   Вверх
Sardar
Дата 16.4.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Значит ты решил писать собственный парсер, это хорошо в плане опыта smile
Прочесть это.

Никакой "таблицы" составлять не надо, твоя задача сворачивать поток символов до лексем. На входе имеем поток байтов, который проходит через декодировщик, что выдаёт поток символов в юникоде. Далее имеем автомат (граф ссылками, таблицей, как угодно), что и распознаёт токены (собирает символы до токенов). Это лексический анализ, на выходе поток лексем.

Что бы понять как работает токенизер, нарисуй на бумаге граф. К примеру нужно распознать: aba*b (abb, abab, abaab и т.д.) и baba. Нарисуй точку, от неё два ребра помеченные a и b. Под ребрами новые вершины, от которых новые рёбра помеченные классом символов (в нашем случае два класса, по одному символу в каждом). Выйдет:

Код
       []
   [a] [b]
 [b]     [a] 
[b][a]   [b]
 *   ^     [a]
               *

где * конец разбора, ^ прыгнуть на родительскую вершину


Ну а далее берёшь входные символы и на каждом следующем выбираешь ребро в графе, пока не упрёшься в *. В этот момент токен найден, начинаем снова с корня графа. Если для текущего символа ребра не нашлось, то кидаем ошибку синтаксиса.

После токенизера из потока байтов (символов) имеем поток лексем, где большинство ключевых слов уже в своих лексемах. Ключевые разбирают на этапе лескического анализа ради человека (читаемость), потому как для транслятора абсолютно по барабану, он разбирает контекстами (while while do while=do(); end нормально распознаётся). Лексемы идут на вход синтаксического анализатора, на этом месте уже нужно знать что такое контекстно-свободные грамматики, терминалы, не терминалы, развёртка/свёртка. Впрочем ты это должен был знать и на лексическом анализаторе smile  В синтаксическом то же самое, только те терминалами выступают лексемы.

Парсер LL(n) написать проще (LL(1) - простейшие реги), вбей в гугл. Суть в том, что "потребляем" все терминалы с лева на право, пока не упрёмся в не-терминал. Не-терминал далее заменяется подходящим правилом развёртки, с правилом может ассоциироваться действие. Вот в таком действии и определяем кода конкретная инструкция готова и что с ней делать. Если по одной входной лексеме существует более одного правила, то тебе потребуется прочесть следующую лексему, что бы найти одно единственное правило развёртки. Максимальное количество лексем, требуемых для однозначного выбора называют степенью LL грамматики, обозначается как LL(n), где n собственно и есть то самое количество.

На практике если и используются LL парсеры, то LL(1) в целях эффективности, а там где нужно парсер прочитывает более одной лексемы. Это называется look ahead приёмом, вот такие look ahead задаются тем кто составляет грамматику. Тебе этого достаточно, что бы распознать почти любой синтаксис (по моему все популярные языки программирования включаются). Если хочется большего, то перейдёшь к LALR(n) парсерам, где терминалы наоборот сворачиваются в не-терминалы. Этот принцип сложней.

На выходе парсера получаем поток событий (делай то, делай это). Ну собственно по событиям и собираем инфу в AST дерево (абстрактное синтаксическое дерево). После анализа уже согласно правилам языка добавляем аннотации к AST и разворачиваем все эффекты "по умолчанию" допустимые в языке. На выходе полностью формальное (однозначное, контекстно не зависимое) представление исходника в виде дерева. Его можно тут же выполнить, если в каждом узле сделать метод "выполнить себя", вызывающий рекурсивно дочерние узлы. Можно пробежаться транслятором и сгенерить "ассемблерный код" (твой набор инструкций, стековый, регистровый, как угодно). Такой оттранслированный код проще выполнять, в простейшем случае весь интерпретатор это одна switch конструкция.

Ну вроде всё на пальцах, ключевые для поиска тоже дал, осталось начитаться нормальной литературы на эту тему ;-)


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
ilnar
Дата 17.4.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.3.2007

Репутация: нет
Всего: нет



я подобное уже прочитал в КНИГЕ ДРАКОНА.. 
правда там не так разжевано))) за что и СПАСИБО..

мы идем от простого:
пока наш компилятор должен "разбираться" с простыми арифметическими операциями..
(
Цитата

это хорошо в плане опыта
... это конечно хорошо, тока препод несколько отбил желание.. хочется просто сделать наиболее простой вариант и шоб работал..)
ну типа (+ 1 (* 2 3))

на данном этапе наш "лексический анализатор" разбивает на токены, т.е на выходе получаем следующее 
[ (, +, 1, (, *, 2, 3, ) ] затем проходя "синтаксический анализатор": [ +, 1, [ *, 2, 3] ]

вотЪ

нельзя ль работать "вот с Этим"??


 


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0696 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.