Использование Irony для разработки пользовательского языка в .Net 2.0 - PullRequest
0 голосов
/ 21 марта 2012

Как говорится в вопросе, я застрял с .Net 2.0 здесь, в моей компании, и нет никаких шансов на обновление. Есть ли способ заставить Иронию работать в .NET 2.0.

Я кратко попытаюсь объяснить, чего я пытаюсь достичь. У нас в нашей компании есть система начисления заработной платы, где мы позволяем клиенту определять собственные формулы для пунктов платежных ведомостей. Эти формулы должны использовать некоторые ключевые слова / функции, которые мы проверяем через Regex (очень ненадежно). Затем мы создаем объект управления сценарием Microsoft и используем его функцию eval для анализа фрагмента. Эти фрагменты в свою очередь вызывают ключевые слова / функции, определенные в классе, чтобы получить вывод.

Но сказать, что у этой системы есть недостаток, очень вежливо. Иногда он просто переполняется с ошибкой.

Очень глупо, например. -

FVAL(A)/(FVAL(B)+FVAL(C))

Очевидно, что есть две стадии, через которые проходит эта формула.

Первый этап проверки, на котором мы делаем следующее -

  • Проверьте через регулярные выражения, есть ли какие-либо используемые ключевые слова, которых нет в предопределенном массиве. Список ключевых слов

  • Затем проверьте, используются ли какие-либо переменные (в данном случае - A, B, C), которых нет в массиве переменных.

  • Если все проверки пройдены, мы передаем строку формулы в функцию eval объекта ScriptControlClass, а также добавляем статический класс со всеми определенными в нем функциями (в данном случае рассмотрим FVAL()), и эта функция возвращает логическое значение true если переменная является допустимой для использования в этом контексте (например, добавление даты и числа вернет false)

Теперь, после вычисления этого выражения, получается результат - DivideByZeroException , почему, поскольку тип eval передает все логические значения true в 1 и выполняет с ним нормальную арифметику.

FVAL(A)/(FVAL(B)+FVAL(C)) => 1/(1-1)

Второй этап почти аналогичен, но без какой-либо проверочной проверки, например, не возвращая true, мы фактически возвращаем значение переменной из DataTable, который состоит из значений для каждой переменной.

Система устарела, и она серьезно действует мне на нервы, и мне действительно нужна помощь. Пожалуйста, предложите.

1 Ответ

2 голосов
/ 21 марта 2012

Если вы говорите только о формулах в стиле Excel, написать хороший интерпретатор довольно легко, особенно если вам приходится иметь дело только с одним типом данных. Кто-то, имеющий опыт работы в компиляторах (или даже парсеры), может написать о вас менее чем за день. Я сам написал связку.

Встраивание языка сценариев - это еще один вариант, но вы должны быть знакомы с особенностями данного языка. Обеспечение использования высокоточных чисел может быть затруднено, если это является бизнес-требованием.

...