Как интерпретировать пользовательский язык - PullRequest
2 голосов
/ 28 октября 2010

У меня есть приложение на C ++, которое на самом деле обрабатывает двоичный файл. Двоичный файл представляет собой набор событий, скажем, A / B / C, и при обнаружении события A в файле приложение обрабатывает событие в «обработчике A».

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

define proc onA
{
 c= QueryVariable(cat)
print ( c )
}

Таким образом, когда приложение обрабатывает событие «A» из двоичного файла, приложение должно проанализировать этот файл сценария, проверить наличие OnA и преобразовать операторы в процедуре OnA в процедуры, поддерживаемые приложением. Например, QueryVariable должен скопировать значение переменной «cat», определенное в приложении, в переменную «C». Приложение также должно проверять синтаксис / семантику языка в скрипте. Где я могу получить лучшую информацию для выбора дизайна? Мои знания о разборе деревьев / грамматике действительно ослабли.

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

Простой способ создать переводчик:

  • Определение синтаксического анализатора для языка из его синтаксиса
  • Создание абстрактного синтаксического дерева AST
  • Применить функцию посетителя, пройти AST в предзаказе и "выполнить" действия, предложенные узлами AST.

Некоторые узлы AST будут «дефиниционными», например, будут объявлять о существовании некоторого именованного объекта, такого как ваша фраза «define proc onA» выше. Обычно действие заключается в том, чтобы связать именованный объект с контентом, например, сформировать триплет > и сохранить его в таблице символов, проиндексированной первой записью. Это облегчает поиск таких определений.

Позже, когда ваш процесс событий встречает событие A, ваше приложение знает, что нужно искать «onA» в этой таблице символов. При обнаружении AST проходит функцию посетителя, чтобы выполнить его содержимое. Обычно вам понадобится стек значений для записи значений промежуточных выражений: листья AST, представляющие операнды (переменные, константы), помещают значения в этот стек, а операторы (+, -, <=) отбрасывают значения и вычисляют новые результаты для отправки. Операции присваивания принимают значение верхнего стека и помещают в таблицу символов, связанную с именем идентификатора. Управляющие операторы (если, делают) снимают значения с вершины стека и используют их, чтобы указать, какую часть программы (например, какое поддерево) следует выполнить следующей. </p>

Все это хорошо известно и встречается в большинстве книг о компиляторах и интерпретаторах. Книга Питера Брауна об этом особенно хороша, хотя она кажется относительно старой:

Написание интерактивных интерпретаторов и компиляторов .

1 голос
/ 28 октября 2010

Должен быть какой-то интерпретатор или компилятор для языка сценариев. Проверьте, поддерживает ли он встраивание в C или C ++. Большинство скриптовых языков делают.

Следующим выбором, или, возможно, первым, будет простой запуск сценария с использованием существующего компилятора / интерпретатора.

Я не могу придумать причину, по которой один из первых двух вариантов не подходит, но если нет, подумайте о создании интерпретатора с использованием ANTLR или для небольшого языка Boost Spirit. Отказ от ответственности: я не использовал первый, и я только попробовал Boost Spirit для небольшого игрушечного примера.

Приветствия и hth.,

PS: Если вы можете выбрать язык сценария, рассмотрите JavaScript и просто используйте API, по сообщениям превосходный Google для встраивания.

...