Требуется написать транслятор с языка JavaScript 1.6 на C++.
Есть несколько особенностей:
1. Требуется написать транслятор ядра JavaScript (ECMAScript) на С++.
2. Нам заранее известно, что во входном .JS файле нет синатаксических, семантических ошибок.
Как я делаю:
— Для лексического анализа, я использую flex-generated анализатор.
— Для трансляции я сам строю синтаксический граф. Граф содержит переходы от состояния к состоянию по токену.
На некоторые состояния графа я вешаю операции.
Тривиальный пример (JavaScript function definition): Переходы между токенами: Function->Variable->Open_parenthesis->Variable->Comma->Variable->Comma->Variable->Close_parenthesis Для первого токена Variable: операция create_function_name Для остальных токенов Variable: операция add_function_parameter
Как можно реализовать транслятор?
1. Может удобнее использовать flex+bison? И анализировать синтаксическое дерево, которое строит bison?
2. Или использовать boost парсеры?
Спасибо.
17.02.10 18:56: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, A13x, Вы писали:
A>Здравствуйте, cash_a_lot, Вы писали:
__>>Привет.
__>>Требуется написать транслятор с языка JavaScript 1.6 на C++. __>>...
A>А как "транслировать" eval? A>Советую не мучаться и взять v8
Реализацию таких функции можно вынести в predefined класс.
И наследовать все транслируемые классы от predefined класса.
Кроме v8 есть mozilla, nombas и другие движки.
Но интересует именно трансляция.
Здравствуйте, A13x, Вы писали:
A>Здравствуйте, cash_a_lot, Вы писали:
__>>Привет.
__>>Требуется написать транслятор с языка JavaScript 1.6 на C++. __>>...
A>А как "транслировать" eval? A>Советую не мучаться и взять v8
v8 еще не кросплатформенна.
Используя функциональность JS engines (v8, mozjs, nombas) мы можем выполнять трансляцию в C++ код?
Здравствуйте, cash_a_lot, Вы писали:
__>Здравствуйте, A13x, Вы писали:
A>>Здравствуйте, cash_a_lot, Вы писали:
__>>>Привет.
__>>>Требуется написать транслятор с языка JavaScript 1.6 на C++. __>>>...
A>>А как "транслировать" eval? A>>Советую не мучаться и взять v8
__>Реализацию таких функции можно вынести в predefined класс. __>И наследовать все транслируемые классы от predefined класса. __>Кроме v8 есть mozilla, nombas и другие движки. __>Но интересует именно трансляция.
__>Спасибо.
не понял.
я к тому, что реализация будет не полной, если текст такого транслятора не будет в себе заключать полноценной реализации интерпретатора.
Таким образом создание такого рода конвертеров бессмысленно. Достаточно создать сам движок (v8, SpiderMonkey, QtScript, whatever)
Здравствуйте, A13x, Вы писали:
A>Здравствуйте, cash_a_lot, Вы писали:
__>>Здравствуйте, A13x, Вы писали:
A>>>Здравствуйте, cash_a_lot, Вы писали:
__>>>>Привет.
__>>>>Требуется написать транслятор с языка JavaScript 1.6 на C++. __>>>>...
A>>>А как "транслировать" eval? A>>>Советую не мучаться и взять v8
__>>Реализацию таких функции можно вынести в predefined класс. __>>И наследовать все транслируемые классы от predefined класса. __>>Кроме v8 есть mozilla, nombas и другие движки. __>>Но интересует именно трансляция.
__>>Спасибо.
A>не понял. A>я к тому, что реализация будет не полной, если текст такого транслятора не будет в себе заключать полноценной реализации интерпретатора. A>Таким образом создание такого рода конвертеров бессмысленно. Достаточно создать сам движок (v8, SpiderMonkey, QtScript, whatever)
Действительно.
А возможно ли дотянуться до типов функций/переменных с помощью SpiderMonkey?
Или динамическая типизация языка JavaScript помешает определить тип?
__>Как можно реализовать транслятор?
Это какая то сверхзадача, имхо. Или это какой то крупный проект?
__>2. Или использовать boost парсеры?
Если ты про boost::spirit, то лучше застрелиться в начале проекта, чем попасть в психушку на этапе отладки.
Здравствуйте, cash_a_lot, Вы писали:
__>Требуется написать транслятор с языка JavaScript 1.6 на C++.
Написать транслятор не проблема. Вопрос в том что дальше с этим делать.
Любой современный движок делает генерацию в байткод что в принципе есть просто таблица вызовов C/C++ функций.
Вот тебе и трансляция.
Из-за того что язык typeless по определению то сделать компилятор который будет значительно эффективнее той же V8 практически невозможно.
С точки зрения практики я думаю задача JavaScript to Erlang имеет больше шансов. Да и то...
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, cash_a_lot, Вы писали:
__>>Требуется написать транслятор с языка JavaScript 1.6 на C++.
CS>Написать транслятор не проблема. Вопрос в том что дальше с этим делать. CS>Любой современный движок делает генерацию в байткод что в принципе есть просто таблица вызовов C/C++ функций. CS>Вот тебе и трансляция.
CS>Из-за того что язык typeless по определению то сделать компилятор который будет значительно эффективнее той же V8 практически невозможно.
CS>С точки зрения практики я думаю задача JavaScript to Erlang имеет больше шансов. Да и то...
Вопрос в том, как добраться то таблицы вызвов C/С++ функций с помощью SpiderMonkey: определить тип возвращаемый функцией, типы локальных переменных и их контент.
Здравствуйте, cash_a_lot, Вы писали:
__>Вопрос в том, как добраться то таблицы вызвов C/С++ функций с помощью SpiderMonkey: определить тип возвращаемый функцией, типы локальных переменных и их контент.
В общем случае типы переменных на этапе компиляции не известны. Например что возвращает эта функция?
function foo(bar)
{
return bar % 1? "odd" : false;
}
Здравствуйте, cash_a_lot, Вы писали:
__>... __>Действительно. __>А возможно ли дотянуться до типов функций/переменных с помощью SpiderMonkey? __>Или динамическая типизация языка JavaScript помешает определить тип?
а зачем дотягиваться до них?
для чего?
Re[4]: JavaScript to C++ translator
От:
Аноним
Дата:
24.02.10 12:28
Оценка:
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, cash_a_lot, Вы писали:
__>>Вопрос в том, как добраться то таблицы вызвов C/С++ функций с помощью SpiderMonkey: определить тип возвращаемый функцией, типы локальных переменных и их контент.
CS>В общем случае типы переменных на этапе компиляции не известны. Например что возвращает эта функция?
CS>
Здравствуйте, TimurSPB, Вы писали:
__>>Как можно реализовать транслятор? TSP>Это какая то сверхзадача, имхо. Или это какой то крупный проект?
__>>2. Или использовать boost парсеры? TSP>Если ты про boost::spirit, то лучше застрелиться в начале проекта, чем попасть в психушку на этапе отладки.