Должен ли я использовать Lex или домашнее решение для анализа формулы? - PullRequest
4 голосов
/ 04 января 2010

Я нахожусь в процессе написания небольшого математического движка на основе правил. Я понимаю, что это неясно, поэтому приведу небольшой пример.

Допустим, у вас есть переменная a, которая содержит целое число. У вас также есть некоторые функции, которые вы можете применить к номеру, т.е.

  • sqr - квадратное число
  • flp - перевернуть биты числа
  • dec - уменьшить число
  • inc - увеличить число

Тогда вы можете сказать, do_formula(a, "2sqr+inc+flp"). Если бы a равнялось 3, оно бы выровняло его дважды (81), увеличило бы его (82) и перевернуло бы его биты (~ 82 - то есть -83, если иметь дело со знаковыми целыми числами, я полагаю).

Каков наилучший способ анализа формулы? Это относительно просто, и я думаю сделать все коды операций 3-мя символами ... будет ли излишним использовать Lex? Должен ли я просто написать простое домашнее решение или использовать что-то еще целиком?

Я понимаю, что приведенный выше пример глуп; Я не создаю калькулятор, который будет это делать, но он иллюстрирует то, что я пытаюсь сделать достаточно хорошо.

Ответы [ 5 ]

3 голосов
/ 05 января 2010

Если ваша грамматика не очень сложная и вы не против сделать это на Python, pyparsing может быть именно тем, что доктор прописал. Я реализовал нечто похожее для анализа химических уравнений, и мне потребовался час или около того, чтобы это сделать. Я бы добавил сюда код, но он не был бы особенно уместным.

1 голос
/ 04 января 2010

Да, в данном случае это кажется излишним. Просто разбейте строку на '= ", а затем применяйте операции одну за другой. Слава богу, словари и функции первоклассного гражданина, ваш движок может быть написан на 0,5-1 страницах кода.

dct = {'sqr' : lambda a: a * a, ...}

ntimes, op = token[:-3], token[-3:]
ntimes = 0 if len(ntimes) == 0 else int(ntimes)

..
dct[op](a)
0 голосов
/ 05 января 2010

Какой у вас язык? Для Ruby мне действительно нравится treetop . Трудно начать, но я успешно использовал его для разбора более сложных математических выражений.

0 голосов
/ 04 января 2010

Если у вас есть немного свободного времени и вы хотите изучить новую парадигму программирования, попробуйте Prolog!

0 голосов
/ 04 января 2010

Это действительно зависит от того, насколько большим будет ваш проект: если вы хотите создать новый язык или что-то, что разбирает более интересные грамматики, чем просто +, тогда я бы сказал, что lex будет забавным и интересным способ провести день.

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

Вопрос на самом деле сводится к тому, на каком языке выполнять синтаксический анализ? Haskell был бы действительно забавным выбором и предоставил мне много интересных откровений, когда я написал свой первый парсер пару лет назад.

...