![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
Уважаемые винградовцы и не только, я пишу компилятор скриптов в промежуточный язык типа ассемблера для последующей интерпретации виртуальной машиной и возникают вопросы: как генерировать оп-коды для конструкций типа if, for, а также массивов и функций. Компилятор выражений я сделал, к примеру выражение типа (2+3)*MyVar1 имеет вид:
push 2 push 3 pop pop sum //Суммируем то, что взяли из стека и результат толкаем в стёк push MyVar1 pop pop mult //Умножаем pop //Берём ответ А вот как быть с: if (MyVar1==5) { ... } else { ... } или: MyArray[5*MyVar1+7]=MyVar1/2; или: a1=myfunc(myarray[myvar1*5],myvar1+6/myvar2)*3; Как быть здесь ? Слишком уж много всего ![]() Если есть какие-нибудь идеи пишите, буду рад если подкините полезную ссылку... -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
Yuri Burger |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 11.5.2004 Репутация: нет Всего: нет |
сделай поддержку условных переходов.. собсно дальше всё будет просто.. |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
[оффтоп]
в БГУИР на ФКСИС изучают теорию компиляторов - кошмар из кошмаров; одни только книги по теме весят 400-500 страниц ! [/оффтоп] Если уж взялся за дело серьёзно, то нужно выделить типы лексических конструкций (выражение, вызов функции, условие, цикл и проч.) и строить по исходному тексту дерево таких конструкций. Очень настоятельно рекомендую ознакомится с библиотекой Spirit, входящей в состав Boost - на её основе можно построить анализатор языка. Линк: http://www.boost.org/libs/spirit/index.html А лучше бы сократить себе объём работ, упростив синтаксис до предела. Например, запретить вызов функций в выраженях, выражений - в условиях, разрешить использовать в условных операторах только имена bool-переменных и проч. -------------------- ![]() |
|||
|
||||
Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
mr.DUDA
Ничего сложного, всё что я хотел уже сделал, сложные выражения понимаются отлично, одна проблема - очень медленный лексический анализатор, посмотрю ка я ту ссылку что ты написал, может пригодится... -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Странно, сканер должен быть самой быстрой частью компилятора/интерпретатора. Сам писал или утилитами генерил? Если утилитами, то нужно оптимизировать реги. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
Sardar
Не, сам писал на скорую руку, надо будет переделовать, а то у меня файл 30Kb около 3 секунд разбирается ![]() -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
Посмотри на www.gnu.org утилиту flex. А вообще набери в гугле что нибудь типа: "лексический анализ генератор сканер".
Если не секрет покажи код ![]() -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
Sheff |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
А толку, он же кривой, надо переписывать...
Не, я лучше сам, не люблю пользовать чужое -------------------- -------------------------- Шеф всегда прав :) |
||||
|
|||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 1 Всего: 317 |
If'ами и т.д. хрошего ничего не выйдет. Нужно писать свою реализацию регов, тогда сделаешь прямой(однопроходной) сканер. Плюсы - большая скорость и относительная простота.
Пару недель теории тебе обесепеченны. Реги самые простые из формальных грамматик, реализуются конечным автоматом(таблицы входных символов и переходов в твоей проге). -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |