Обратный инжиниринг языка программирования или «неконтролируемое изучение языков» - PullRequest
3 голосов
/ 28 июня 2011

Мне нужно построить «переводчик» (кросс-компилятор - правильное слово?) Между EasyLanguage в Tradestation и C ++.Тем не менее, нет полной документации по грамматике EasyLanguage (которую я мог бы найти).

В качестве более общего вопроса, учитывая набор допустимых программ на каком-то языке 'A', можно лираспознавать грамматику для «A», если мы знаем (или даже если не знаем) о существовании определенных базовых токенов, таких как «if», «else» и зарезервированных слов, или это один из тех нерешенных конкретных случаев (сложно?) вопросы.

Могу ли я использовать какие-либо полезные инструменты для запуска?

1 Ответ

5 голосов
/ 28 июня 2011

Простой ответ - «Нет».

Любой вид обобщения из примеров страдает от основного факта, что это угадывание .Вы можете догадаться , что у языка есть жетон "если".Нет никакой гарантии, что это так, или что оно написано , если , или что у него есть семантика, которую вы понимаете.Вы не получите автоматизированный инструмент для создания грамматики для вас.

Лучше всего взять все документы, которые вы можете получить, которые описывают язык, и, ну, в общем, угадать в грамматике.Затем вы создаете синтаксический анализатор для грамматики, проверяете его на соответствие настолько большой базе кода, сколько сможете найти, и пересматриваете.Я делал это десятки раз с широким разнообразием языков (см. Мою биографию).

Это больно, но вы часто получаете что-то очень полезное.Хорошей новостью является то, что вашему парсеру не нужно разбирать то, что пользователи не умеют писать.Плохая новость заключается в том, что они будут писать вещи на основе какого-то неясного примера, который вы никогда не видели, или с опечаткой, которая случайно работает.(Даже разработчик языка не хотел этого, но это не имеет значения для пользователя; его программа работает, а ваш компилятор - нет. Ваша проблема по определению).

То, что вы никогда не узнаете, так этоесли у провайдера языка есть определенные функции, он просто не задокументировал и больше никому не показывал.Будьте постоянно готовы удивляться, даже после того, как вы закончите: - {

Теперь лучший инструмент, который вы можете использовать для этого процесса, IMHO, это генератор синтаксического анализатора GLR ;это то, что использует моя компания.Они будут анализировать любой неконтекстный язык (который вы могли бы предложить) без особых усилий согнуть грамматику, чтобы она соответствовала другим распространенным ограничениям парсера рекурсивного спуска, LL (k) или LR (k).Жизнь достаточно сложна, чтобы угадать грамматику, не говоря уже о угадывании грамматики, а затем угадать, как согнуться к ней, чтобы генератор синтаксического анализатора проглотил ее правильно.

У вас также есть проблема создания переводчика, как только вы правильно понимаете грамматику.Вам может быть полезен этот SO-ответ: Какие шаблоны можно использовать в коде, чтобы упростить перевод на другой язык программирования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...