Я не ищу реализацию, просто псевдокод или, по крайней мере, алгоритм для эффективной обработки.Мне нужно обработать операторы, подобные этим:
(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))
Таким образом, оператор +
имеет приоритет над оператором ,
.(таким образом, мой +
подобен математическому умножению с ,
, являющимся математическим сложением, но это просто запутывает)рекурсивный вызов.Я также позабочусь об обработке ошибок, как только функция вернется, так что не беспокойтесь.Проблемы, с которыми я сталкиваюсь:
Я просто не знаю, как справиться с проблемой старшинства.Я могу return true
, как только увижу ,
, и предыдущее значение было истинным.В противном случае я перезапущу ту же процедуру.Плюсом будет умножение на bool (например, true*true=true
, true*false=false
и т. Д.).
Обнаружение ошибок: я придумал несколько схем для обработки ввода,но есть много отвратительных плохих вещей, которые я хочу обнаружить и напечатать ошибку пользователю.Ни одна из схем, которые я думал об обработке ошибок в едином (читай: централизованном) месте в коде, что было бы неплохо для удобства сопровождения и читабельности:
()
(,...
(+...
(a,,...
(a,+...
(a+,...
(a++...
Обнаружение этих ошибок в моей «подпрограмме» выше, должно занятьзаботиться о плохом вводе.Конечно, я проверяю конец ввода каждый раз, когда читаю токен.
Конечно, у меня будет проблема, возможно, с чтением полного текстового файла, если естьнепревзойденные скобки, но, эй, люди должны избегать таких напряжений .
РЕДАКТИРОВАТЬ: Ах, да, я забыл !
, который также должен использоваться как классический оператор not:
(!a+b,c,!d)
Крошечное обновление для тех, кто интересуется: у меня был неосведомленный дикий подход к этому, и я написал собственную реализацию с нуля.* * * * * * * * * Может быть недостаточно красивым, , поэтому этот вопрос о пересмотре кода .