Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ANTLR v4. Как получить траиды из дерева? 
:(
    Опции темы
smartchecker
Дата 5.5.2013, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Задачка - написать мини компилятор.
Есть такой чудо-генератор распознавателей ANTLR v4.
Грамматику я ему написал.
Лексер и парсер он мне сгенерил. Дерево он мне строит, но как из этого дерева получить таблицу триад хоть убей не понимаю.
Есть ли живые примеры?
PM MAIL   Вверх
Mirkes
Дата 6.5.2013, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Mirkes
PM MAIL   Вверх
beroal
Дата 7.5.2013, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(smartchecker @ 5.5.2013,  18:21)
таблицу триад

Не могли бы вы пояснить, что это такое?
PM WWW   Вверх
smartchecker
Дата 7.5.2013, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Mirkes @ 6.5.2013,  11:14)
Нужно почитать, что содержится в дереве. скорее всего каждый нетерминальный узел содержит операцию, а терминальный константу или переменную. Тогда берешь узел, оба потомка которого терминальные и заменяешь его на терминальный узел со значением равным результату операции, которая в этом узле хранилась, примененной к числам (переменным) которые хранились в листьях (терминальных потомках). Путем последовательного применения таких замен получаешь дерево из одного узла. Это и есть ответ.

Это Вы говорите про AST. ANTLR v4 его генерить не умеет он строит только ParseTree, а это немного не то, там в узлах не операции стоят.
Я сейчас немного на распутье...
Я переложил грамматику на antlr 3.5, который строит AST, но в нём нет средств для отображения результата, т.е. картинки дерева.
Он умеет генерить dot файлы, которые надо скармливать graphviz'у.
v4, напротив, не умеет AST, но умеет рисовать картинки через TreeView'ер.

Исходя из логики разумнее взять v3.5 и искать чем бы отрендерить картинку из dot-файла, ибо AST для построения компилятора более правильная структура чем ParseTree.
Вот разница между AST  и ParseTree
user posted image user posted image

Т.е. в AST - в узлах стоят операции.

Добавлено через 12 минут и 34 секунды
Цитата(beroal @ 7.5.2013,  13:15)
Цитата(smartchecker @ 5.5.2013,  18:21)
таблицу триад

Не могли бы вы пояснить, что это такое?

Как-то так или так
PM MAIL   Вверх
smartchecker
Дата 7.5.2013, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(beroal @ 7.5.2013,  13:15)
Цитата(smartchecker @ 5.5.2013,  18:21)
таблицу триад

Не могли бы вы пояснить, что это такое?

Буквально это
PM MAIL   Вверх
beroal
Дата 7.5.2013, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Забавный термин. Так можно назвать любой 3-местный кортеж.
Дописано. У меня сложилось такое впечатление, что этот термин был придуман специально для российского образования, и его никто не употребляет, кроме одного человека (А. Ю. Молчанова). smile Если к вам не предъявляют жёсткого требования следовать определённой методичке, советую обратиться к LLVM.

Это сообщение отредактировал(а) beroal - 7.5.2013, 17:13
PM WWW   Вверх
Mirkes
Дата 7.5.2013, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я понял, что вы имеете.
Оба варианта равносильны. Если возьмете оба вида дерева для одного фрагмента кода то сами это увидете.
Берем Ваше правое дерево и превращаем в таблицу. Тупо стартуем с корня. Каждая запись таблицы имеет номер. Ссылку на I-ю строку будем обозначать @I
Поехали
1. @2 Nop @K
2. id put @3
3. num Nop empty
4=K. id put @5
5. @6 Add @7
6. id Nop empty
7. num Nop empty
Вместо К подставляем 4 и получаем окончательный вид
1. @2 Nop @4
2. id put @3
3. num Nop empty
4. id put @5
5. @6 Add @7
6. id Nop empty
7. num Nop empty
В записи использованы обозначения операций
Nop - пустая операция.
put - положить второй аргумент по адресу (имени) в первом
Add - сложить два аргумента
и одно обозначение дла операнда
empty - пустоя операнд.

Не понял в чем проблема?


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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