Обработка условных выписок - PullRequest
2 голосов
/ 03 июня 2011

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

(a)     # if(a)
(a,b)   # if(a || b)
(a+b)   # if(a && b)
(a+b,c) # same as ((a+b),c) or if((a&&b) || c)
(a,b+c) # same as (a,(b|c)) or if(a || (b&&c))

Таким образом, оператор + имеет приоритет над оператором ,.(таким образом, мой + подобен математическому умножению с ,, являющимся математическим сложением, но это просто запутывает)рекурсивный вызов.Я также позабочусь об обработке ошибок, как только функция вернется, так что не беспокойтесь.Проблемы, с которыми я сталкиваюсь:

  1. Я просто не знаю, как справиться с проблемой старшинства.Я могу return true, как только увижу ,, и предыдущее значение было истинным.В противном случае я перезапущу ту же процедуру.Плюсом будет умножение на bool (например, true*true=true, true*false=false и т. Д.).

  2. Обнаружение ошибок: я придумал несколько схем для обработки ввода,но есть много отвратительных плохих вещей, которые я хочу обнаружить и напечатать ошибку пользователю.Ни одна из схем, которые я думал об обработке ошибок в едином (читай: централизованном) месте в коде, что было бы неплохо для удобства сопровождения и читабельности:

    ()
    (,...
    (+...
    (a,,...
    (a,+...
    (a+,...
    (a++...
    

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

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

РЕДАКТИРОВАТЬ: Ах, да, я забыл !, который также должен использоваться как классический оператор not:

(!a+b,c,!d)

Крошечное обновление для тех, кто интересуется: у меня был неосведомленный дикий подход к этому, и я написал собственную реализацию с нуля.* * * * * * * * * Может быть недостаточно красивым, , поэтому этот вопрос о пересмотре кода .

Ответы [ 3 ]

6 голосов
/ 03 июня 2011

Алгоритм маневрового двора легко реализуется при относительно коротком объеме кода.Его можно использовать для преобразования инфиксного выражения, подобного приведенным в ваших примерах, в постфиксные выражения, а оценка постфиксного выражения - это Easy-with-a-capital-E (вам не нужно выполнять преобразование infix-в-postfix строго; вы можете напрямую оценить вывод постфикса маневрового склада и просто накапливать результат по мере продвижения).

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

2 голосов
/ 03 июня 2011

Запишите это в yacc (бизон), это становится тривиальным.

/* Yeacc Code */

%token           IDENTIFIER
%token           LITERAL

%%

Expression:      OrExpression

OrExpression:    AndExpression
            |    OrExpression ',' AndExpression

AndExpression:   NotExpression
            |    AndExpression '+' NotExpression

NotExpression:   PrimaryExpression
            |    '!' NotExpression

PrimaryExpression: Identifier
            |    Literal
            |    '(' Expression ')'

Literal:         LITERAL
Identifier:      IDENTIFIER                          

%%        
0 голосов
/ 03 июня 2011

Возможно, есть лучшее (определенно более краткое) описание этого, но я научился делать это из этого урока много лет назад:

http://compilers.iecc.com/crenshaw/

легко читать для непрограммистов тоже (как я).Вам понадобятся только первые несколько глав.

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