![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| smartchecker |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 28.4.2012 Репутация: нет Всего: нет |
Задачка - написать мини компилятор.
Есть такой чудо-генератор распознавателей ANTLR v4. Грамматику я ему написал. Лексер и парсер он мне сгенерил. Дерево он мне строит, но как из этого дерева получить таблицу триад хоть убей не понимаю. Есть ли живые примеры? |
|||
|
||||
| Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Нужно почитать, что содержится в дереве. скорее всего каждый нетерминальный узел содержит операцию, а терминальный константу или переменную. Тогда берешь узел, оба потомка которого терминальные и заменяешь его на терминальный узел со значением равным результату операции, которая в этом узле хранилась, примененной к числам (переменным) которые хранились в листьях (терминальных потомках). Путем последовательного применения таких замен получаешь дерево из одного узла. Это и есть ответ.
-------------------- Mirkes |
|||
|
||||
| beroal |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 18.1.2003 Где: Украина Репутация: нет Всего: 3 |
Не могли бы вы пояснить, что это такое? |
|||
|
||||
| smartchecker |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 28.4.2012 Репутация: нет Всего: нет |
Это Вы говорите про AST. ANTLR v4 его генерить не умеет он строит только ParseTree, а это немного не то, там в узлах не операции стоят. Я сейчас немного на распутье... Я переложил грамматику на antlr 3.5, который строит AST, но в нём нет средств для отображения результата, т.е. картинки дерева. Он умеет генерить dot файлы, которые надо скармливать graphviz'у. v4, напротив, не умеет AST, но умеет рисовать картинки через TreeView'ер. Исходя из логики разумнее взять v3.5 и искать чем бы отрендерить картинку из dot-файла, ибо AST для построения компилятора более правильная структура чем ParseTree. Вот разница между AST и ParseTree ![]() Т.е. в AST - в узлах стоят операции. Добавлено через 12 минут и 34 секунды
Как-то так или так |
||||||
|
|||||||
| smartchecker |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 28.4.2012 Репутация: нет Всего: нет |
Буквально это |
||||
|
|||||
| beroal |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 18.1.2003 Где: Украина Репутация: нет Всего: 3 |
Забавный термин. Так можно назвать любой 3-местный кортеж.
Дописано. У меня сложилось такое впечатление, что этот термин был придуман специально для российского образования, и его никто не употребляет, кроме одного человека (А. Ю. Молчанова). Это сообщение отредактировал(а) beroal - 7.5.2013, 17:13 |
|||
|
||||
| Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |