Программирование интерпретатора парсера - PullRequest
3 голосов
/ 22 февраля 2012

Я хочу запрограммировать пакет, который вычисляет результирующее значение определенной формулы ввода,

Я создал парсер по алгоритму Шунтирования-Ярда (Dijikstra), Я хочу создать библиотеки функций, которые пользователю будет разрешено использовать (например, функции sin() и cos()) тогда я задавался вопросом, каким должен быть мой следующий шаг; поэтому у меня есть несколько вопросов:

  1. Что проще использовать: алгоритм Шунтирующего двора или алгоритм рекурсивного спуска для анализа формул?

  2. достигну ли я работы переводчика на каком-то этапе моей работы и как?

Спасибо ...

Обратите внимание, что я программирую это, используя Delphi

Ответы [ 2 ]

11 голосов
/ 22 февраля 2012

Реализуя оба (и все еще поддерживая системы с обоими), вот мой список «за / против»:

  • Маневровый двор:
    • код короткий
    • легко, когда ассоциируется с простыми правилами / таблицами приоритетов
    • раздражает отладка, когда что-то идет не так
  • Рекурсивный спуск:
    • код длиннее
    • сложнее, когда все, что у вас есть, это простые правила / приоритеты
    • проще расширять или добавлять синтаксисы особого случая
    • относительно проще в отладке (следует за более "человеческим" потоком)

Или, другими словами, когда вы имеете дело только с математическими формулами, Shunting Yard, вероятно, является подходящим вариантом, но если вы чувствуете, что в дальнейшем вам может потребоваться более сложная, рекурсивнаяСпуск может быть более гибким / расширяемым / обслуживаемым и окупаться в долгосрочной перспективе.

Компиляторы компилятора (Lex / Yacc, Flex / Bison и т. д.) были бы очевидным третьим выбором, но я не знаю ни одногоподдерживаемая реализация для Delphi, идля простых математических формул они излишни.

5 голосов
/ 22 февраля 2012

Что проще использовать: алгоритм Shunting Yard или алгоритм рекурсивного спуска для разбора формул?

Самым простым будет тот, который вы понимаете лучше.Если есть связь с рекурсивным спуском, ее можно использовать как для простых выражений, так и для более сложных сценариев (например, интерпретатор).

Если это не домашнее задание (следовательно, от вас не требуетсяреализовать код самостоятельно), посмотрите на готовые решения (пример: dwscript или Pascal Script ).Вы также можете использовать «компилятор компилятора», набор инструментов, предназначенный для создания анализаторов и анализаторов лексики.Я не могу рекомендовать ничего, потому что, честно говоря, я не нашел ни одного, чтобы удовлетворить мои потребности.Вы можете начать поиск с TP Lex / Yacc .

Достигну ли я работы переводчика на каком-то этапе моей работы и как?

Обычно интерпретатор работает над сценарием и выполняет несколько операций (операторы execute).Оценщик выражений работает только с выражениями, предоставляя результат (или дерево выражений, которое можно использовать для получения результата).

Интерпретатору определенно понадобится синтаксический анализатор выражений (или оценщик), но не другим способом.вокруг.

...