Можно ли проверить формулу в ciloci.flee без значений

У меня есть приложение ASP.net (C#) (.net 3.5) с использованием Ciloci.Flee от Мухаммета Парлака (в частности, Trove.Flee от Алана Дина через NuGet), которое позволяет пользователю вводить формулу в интерфейс, и эта формула позже используется для расчетов на основе входных значений, собранных другим набором пользователей. Формула включает до 9 возможных переменных, из которых они должны извлечь. Например, они могли определить Tt-((Lt/Vc)*(Th-Vi)). Приложение знает, как заполнить все эти переменные, но я хочу защитить их от неправильного синтаксиса или даже неподдерживаемых переменных, когда они вводят формулу на экране администратора. Tt-((Lt/Vc)*(Th-Vi))+Aa должен вызывать ошибку проверки при вводе формулы, потому что Aa не поддерживается переменной.

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

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

Если у кого-то есть опыт в этом деле и он может поделиться своими открытиями, я был бы очень признателен :-) Спасибо!

0
0
231
1

Ответы 1

На данный момент я добиваюсь желаемых результатов, перехватывая исключение. Этот код находится внутри элемента управления ASP CustomValidator:

protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
        {
            try
            {
                ExpressionContext context = new ExpressionContext();
                context.Imports.AddType(typeof(Math));
                context.Variables["A"] = 1;
                context.Variables["Ll"] = 1;
                context.Variables["Lt"] = 1;
                context.Variables["Lh"] = 1;
                context.Variables["Th"] = 1;
                context.Variables["Tgi"] = 1;
                context.Variables["Tt"] = 1;
                context.Variables["Vi"] = 1;
                context.Variables["Vc"] = 1;

                IGenericExpression<double> eGeneric = context.CompileGeneric<double>(args.Value);
                args.IsValid = true;
            } catch (ExpressionCompileException ece)
            {
                args.IsValid = false;
            }    
        }

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

Другие вопросы по теме