Существует ли существующий алгоритм для перевода / преобразования нотации? - PullRequest
4 голосов
/ 16 июня 2010

Система имеет нотацию, которая требует написания выражения типа (A+B)*C как #MUL(#ADD(A,B),C). Существует ли уже алгоритм для преобразования обозначений такого рода, чтобы пользователи могли вводить его более обычным способом? Другими словами, алгоритм для преобразования из инфикса -> моя запись. Во-первых, я не знаю точного названия своей записи ... это похоже на обратную полировку, но не совсем. Каждый оператор кодируется как функция, принимающая аргументы.

Ответы [ 3 ]

9 голосов
/ 16 июня 2010

Алгоритм шунтирования может использоваться для анализа инфиксной записи.

1 голос
/ 16 июня 2010

Вот некоторые Lisp, которые пытаются преобразовать инфикс-> префикс .Это может послужить полезной отправной точкой.

0 голосов
/ 16 июня 2010

Эти простые выражения легко анализировать с помощью Lex и Yacc (из Flex и Bison они одинаковые). Google для "Yacc калькулятор".

Один пример, который я нашел, это http://www.indiastudychannel.com/resources/56696-IMPLEMENTATION-OF-CALCULATOR-USING-YACC.aspx, но вместо того, чтобы вычислять результаты, вы должны создать последнюю строку. Например, вот так (псевдокод):

expr: ‘(‘expr’)’
{
$$=$2;
}
|
expr ‘*’expr
{
$$="#MUL(" + S1 + "," + $3 + ")";
}
|
expr’/’expr
{
$$="#DIV(" + S1 + "," + $3 + ")";
}
...