05.11.2004, 11:19 | #1 |
Moderator
|
Парсер арифметических выражений
Небольшой подпроект более крупной задачи, который может оказаться кому-то полезен.
Суть - класс, на вход которого подается формула и значения переменных. Класс возвращает результат вычисления. Где может быть полезен: там, где пользователь должен иметь возможность настраивать логику расчета каких-либо показаетелей. Пример использования (одновременно являющийся unit-тестом): PHP код:
Хотя, если кто-то ткнет меня носом - буду благодарен. Комментарии и замечания, естественно приветствуются. |
|
05.11.2004, 11:41 | #2 |
Участник
|
Было очень приятно увидеть. Я уже думал, что в аксапте я никогда таких кайфов(алгоритмов) и не увижу.
Можно чуть поумничаю? 1) Судя по коду - перевод в префиксную форму. 2) Вложенность не поддерживается. нет обработки "( )". 3) вообще посути - это транслятор. P.s. а вообще просто кайф. только вот к сожалению, приткнуть не к чему. Хотя может если какой нибудь навороченный отчет сделать. Например, таже заморочка, что в критерии отчета соединяются только по "И". С помощью парсера можно создать функционал, что бы пользователь мог строить свои замороченые условия. А вообще, конечно же надо ориентироваться на цель....
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5 |
|
05.11.2004, 12:08 | #3 |
Модератор
|
круто
а чем плохи runBuf() и xppCompiler ? |
|
05.11.2004, 12:11 | #4 |
Участник
|
см. RunBuf
про ProductBuilder... см. PBARuleExpression, PBACheckSyntax Но дело в том, что выражение в ProductBuilder задается в таблице правил, а не в тексте. См. презентацию по PB: http://www.navision.ru/files/Flash/axaptanew/12.htm |
|
05.11.2004, 12:11 | #5 |
Участник
|
Код пока не смотрел, но в связи с замечанием bucken'а о том, что не обрабатываются выражения в скобках, возник вопрос: вы изобрели какой-то свой алгоритм? зачем? есть же алгоритм ОПЗ ("обратная польская запись"), который позволяет корректно обрабатывать выражения со скобками и с любой глубиной вложенности этих скобок. Более того, ОПЗ устроен так, что Вы можете придумать какие-то <i>свои, не обычные </i> обозначения операций, которые используются часто именно в ваших условиях, и применять их в формулах (т.е. типа макросов, например Вы часто возводите числа в степень "пи", тогда можно писать что-то вроде "A = pi B").
|
|
05.11.2004, 12:16 | #6 |
Участник
|
на самом деле там и есть "обратная польская запись".
Дальше мы будем флудить мне кажется. Андре выложил хороший код. Вопрос куда и где его тыкать, зависит от контекста. Также runBuf() и xppCompiler наверное дело тоже самое. Лана, усе.
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5 |
|
05.11.2004, 12:23 | #7 |
Участник
|
Код... хм... красивый. Но не супер.
Про парсинг стоит почитать здесь http://algolist.manual.ru/syntax/ (must read!) http://bib.com.ua/categ34_3.html http://pascal.sources.ru/parsing/ http://www.softportal.com/articles/item_txt.php?id=210 еще http://cs.mipt.ru/docs/comp/rus/prog...cc_rus_07.html еще http://www.yandex.ru/yandsearch?rpt=...E6%E5%ED%E8%E9 еще Цитата:
a> Я вот хочу написать виpтуальный пpоцессоp и компилятоp С-подобного
a> языка для него, что можете посоветовать почитать по этому поводу? a> линки, ссылки набумажную литеpатуpу и собственные pазмышления на тему a> пpиветсвуются! pаньше в pусскоязычном интеpнете обычно два документа маячали: Д.В.Ваpсанофьев, А.Г.Дымченко "Основы компиляции" осень,1991. В.А.Сеpебpяков "Лекции по констpуиpованию компилятоpов", Москва 1993. их в любом поисковике как ключи можно использовать для поиска ссылок, так как, IMHO, любой сайт посвященный данной тематике любезно pазмещает у себя. это что касается интеpнета. по идеи и список литеpатуpы там же. наиболее автоpитетной считается [1] или более новые издания тех же автоpов. есть и pусский стаpый аналог [2]. самое интеpесное, что издательство "Вильямс" все обесчает и обесчает на pусском издать. будем ждать. вообще "отечественный пpоизводитель" не очень pадует. еще выскажу мнение, что много внимания в литеpатуpе уделяется компиляции и мало генеpации кода, а пpо виpтуалные машины еще меньше. если говоpить о pеализациях на pазных языках, то сколько ты их найдешь зависит от фантазии. даже на вскидку, сам понимаешь, сколько выплюнет ссылок тот же ya.ru, если задать для поиска "free compilers". пpимеpный список литеpатуpы (пpавда, какие там даты): 1. A.Aho, R.Sethi, J.Ullman Compilers: principles, techniques, and tools. Addison-Wesley, Reading, MA, 1986. 2. Ахо А., Ульман Дж. Теоpия синтаксического анализа, пеpевода и компиляции.- М.: Миp, 1978. 3.Вайнгаpтен Ф. Тpансляция языков пpогpаммиpования. - М.: Миp, 1977. 4.Гpис Д. Постpоения компилятоpов для цифpовых вычислительных машин. М.: Миp, 1975. 5.Льюис Ф., Розенкpанц Д., Стpинз Р. Теоpетические основы пpоектиpования компилятоpов. - М.: Миp, 1979. 6.Рейоуpд-Смит В.Дж. Теоpия фоpмальных языков. Вводный куpс. - М.: Радио и связь, 1988. 7.Фостеp Дж. Автоматический синтаксический анализ. - М.: Миp, 1975. 8.Хантеp Р. Пpоектиpование и констpуиpование компилятоpов/ Пеp. с англ.: - М.: Финансы и статистика, 1984. - 232 с. |
|
05.11.2004, 12:23 | #8 |
Moderator
|
Если коротко, то так:
1. Скобочки не обрабатываются. Но их всегда можно предварительно раскрыть. Или дописать код - там минут 5 работы. 2. Это часть более крупной задачи, которая и выдвигала к нему определенные требования. Поэтому runBuf() и прочие механизмы, позволяющие выполнять X++ код не очень подходят. |
|
05.11.2004, 12:24 | #9 |
Участник
|
В любом случае... Андре, мой респект!
|
|
05.11.2004, 12:26 | #10 |
Moderator
|
mazzy, спасибо. Обязательно почитаю. Понимаю, что несколько поздно, но код писался вчера с 12 до часу ночи, на машине где не было интернета.
Польскую запись знаю. Под рукой не было готовых реализаций, а повторять все его возможности не было времени. Да и не за чем это было. |
|
05.11.2004, 12:54 | #11 |
Участник
|
+ Mazzy, согласен и с тем что код оригинальный, и с тем что он при этом не супер.
+ Андре, тем не менее респект - за напоминание об этой идее и компактную реализацию. Твердая четверка с плюсом - Bucken, ты не прав, трансляции в ОПЗ там нет. ОПЗ как раз нужна для разбора выражений со скобками и с произвольными операторами, имеющими разные приоритеты выполнения. Задача обработки скобок не стояла (будем так считать), а приоритеты арифм.операторов задаются прямо в свиче (int pred). То что есть - со своей задачей справляется. Хороший код. |
|
05.11.2004, 13:03 | #12 |
Moderator
|
Насчет xppCompiler и аналогичных механизмов - мне они не нравятся Их использование свидетельствует либо о неудачном проектировании, либо о ситуации "когда надо, а деваться больше некуда".
Кроме того, их использование это потенциальная дыра в систему. Либо надо контролировать, что юзер скармливает xppCompiler-у, либо положиться на его честность. |
|
05.11.2004, 13:09 | #13 |
Moderator
|
Посмотрел MSDN - есть такая штука, как MSScriptControl.ScriptControl (system32\msscript.ocx). Можно ее использовать, причем в коде, выполняющемся только на клиенте
p.s. Это не польская запись, а простенький конечный автомат. |
|
05.11.2004, 13:10 | #14 |
Участник
|
Цитата:
Изначально опубликовано Андре
Насчет xppCompiler и аналогичных механизмов - мне они не нравятся Их использование свидетельствует либо о неудачном проектировании, либо о ситуации "когда надо, а деваться больше некуда". Кроме того, их использование это потенциальная дыра в систему. Либо надо контролировать, что юзер скармливает xppCompiler-у, либо положиться на его честность. Это неправильный подход. Код должен генерить программист, а не пользователь. Пользователь должен выбирать из возможных вариантов. Пример - тот же конфигуратор продукции. Хотя и там есть дыра с запуском произвольного кода. Но эта дыра управляется правами доступа пользователя. либо же предлагать пользователю выбор из предопределенных формул. Как это сделано в производстве в операции. У тебя формулу генерят пользователи? Это точно нужно? |
|
05.11.2004, 13:11 | #15 |
Участник
|
Цитата:
Изначально опубликовано Андре
Посмотрел MSDN - есть такая штука, как MSScriptControl.ScriptControl (system32\msscript.ocx). Можно ее использовать, причем в коде, выполняющемся только на клиенте |
|
05.11.2004, 13:12 | #16 |
Участник
|
Цитата:
Изначально опубликовано Zabr
+ Андре, тем не менее респект - за напоминание об этой идее и компактную реализацию. |
|
05.11.2004, 13:18 | #17 |
Moderator
|
PHP код:
Цитата:
либо же предлагать пользователю выбор из предопределенных формул.
Цитата:
У тебя формулу генерят пользователи?
Это точно нужно? |
|
05.11.2004, 13:25 | #18 |
Участник
|
как скажешь.
|
|
05.11.2004, 17:14 | #19 |
Участник
|
xppCompiler
Не знаю чем может не подходить класс xppCompiler. Во вложении альтернативный вариант, почти с тем же примером...Возможно и появляется дырка в безопастности, но мне лично это побарабану ( да и не получилось у меня заставить его выполнить хотя бы статический метод чего-нибудь)....На мой взгляд лучше всё-таки не изобретать велосипед...
|
|
05.11.2004, 18:14 | #20 |
Участник
|
vadikf, интересно!
|
|