Динамический парсинг/оценка логического выражения в C# или VB?

Причина, по которой вы сталкиваетесь с этими проблемами, заключается в том, что вы установили Ionic с правами root. Поэтому ionic -v не может получить доступ к установленным файлам.

Попробуйте с sudo, т.е. sudo ionic -v

9
задан Bobby Ortiz 8 December 2008 в 17:05
поделиться

6 ответов

При использовании.NET3.5 затем, можно проанализировать текст и создать краткий обзор sytax дерево с помощью классов Выражения. Затем создайте подходящий экземпляр LambdaExpression и скомпилируйте его в делегата, которого можно затем выполнить.

Построение синтаксического анализатора и разработчика синтаксического дерева для этого вида довольно простого grammer является вполне интересным осуществлением и выполнится несколько быстрее, чем вызов компилятора (и это более опрятно, по моему мнению, также).

Если Вы не используете.NET3.5, то он не является также сложным для реализации интерпретируемого абстрактного синтаксического дерева сами.

8
ответ дан 4 December 2019 в 11:08
поделиться

Будьте осторожны: два заключительных условия, о которых Вы говорите, не обязательно эквивалентны. && операторы в C# будут использовать короткое замыкание evalution, в то время как логическое And оператор в VB не делает. Если Вы хотите быть уверенными, что операторы эквивалентны, переводят пользователя And кому: AndAlso и пользователь Or кому: OrElse.

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

5
ответ дан 4 December 2019 в 11:08
поделиться

Можно записать простой интерпретатор/синтаксический анализатор. Используйте что-то как ANTLR и повторное использование существующие грамматики.

0
ответ дан 4 December 2019 в 11:08
поделиться

Можно сделать это легко с:

  1. парсер-генератор (как ANTLR, упомянутый выше), который берет булевы выражения в качестве входа и производит инфиксный список и
  2. код для оценки стека Reverse Polish Notation.

Грамматика выглядит примерно так:

program: exprList ;

exprList: expr { Append($1); }
    | expr OR exprList { Append(OR); }
    | expr AND exprList { Append(AND); }
    | NOT exprList { Append(NOT); }
    | ( exprList ) { /* Do nothing */ }
    ;

expr: var { Append($1); }
    | TRUE { Append(True); }
    | FALSE { Append(False); }
    ;

Для оценки Вы делаете это:

for each item in list
    if item is symbol or truth value, push onto RPN stack
    else if item is AND, push (pop() AND pop())
    else if item is OR, push (pop() OR pop())
    else if item is NOT, push (NOT pop())

result = pop()

Для символов необходимо заменить значением истинности во времени выполнения.

3
ответ дан 4 December 2019 в 11:08
поделиться

При использовании.NET 3.5 можно создать Лямбда-выражение. Затем можно создать делегата из него и звонить как типичный делегат/метод. В Интернете много образцов о Лямбда-выражениях.

0
ответ дан 4 December 2019 в 11:08
поделиться

Одно решение состояло бы в том, чтобы собрать выражение как строку и затем отправить ему SQL Server, или независимо от того, что Ваша база данных для оценки. Замените фактические переменные 1=1 или 0=1 для Истины и лжи соответственно, и Вы закончили бы с запросом как это:

ВЫБЕРИТЕ 1 ГДЕ (1=1 и 0=1) или (1=1 и 1=1) или (не 0=1 и 1=1)

Затем при выполнении запроса Вы возвращаете 1, когда результат верен. Может не быть самое изящное решение, но оно будет работать. Много людей, вероятно, отговорит от этого, но я просто собираюсь бросить его там как возможное решение так или иначе.

0
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: