Причина, по которой вы сталкиваетесь с этими проблемами, заключается в том, что вы установили Ionic с правами root. Поэтому ionic -v
не может получить доступ к установленным файлам.
Попробуйте с sudo
, т.е. sudo ionic -v
При использовании.NET3.5 затем, можно проанализировать текст и создать краткий обзор sytax дерево с помощью классов Выражения. Затем создайте подходящий экземпляр LambdaExpression и скомпилируйте его в делегата, которого можно затем выполнить.
Построение синтаксического анализатора и разработчика синтаксического дерева для этого вида довольно простого grammer является вполне интересным осуществлением и выполнится несколько быстрее, чем вызов компилятора (и это более опрятно, по моему мнению, также).
Если Вы не используете.NET3.5, то он не является также сложным для реализации интерпретируемого абстрактного синтаксического дерева сами.
Будьте осторожны: два заключительных условия, о которых Вы говорите, не обязательно эквивалентны. && операторы в C# будут использовать короткое замыкание evalution, в то время как логическое And
оператор в VB не делает. Если Вы хотите быть уверенными, что операторы эквивалентны, переводят пользователя And
кому: AndAlso
и пользователь Or
кому: OrElse
.
Для простых выражений Вы, вероятно, не заметите различия. Но если условия могут иметь побочные эффекты или если различие в производительности между этими двумя является беспокойством, это может быть важно.
Можно записать простой интерпретатор/синтаксический анализатор. Используйте что-то как ANTLR и повторное использование существующие грамматики.
Можно сделать это легко с:
Грамматика выглядит примерно так:
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()
Для символов необходимо заменить значением истинности во времени выполнения.
При использовании.NET 3.5 можно создать Лямбда-выражение. Затем можно создать делегата из него и звонить как типичный делегат/метод. В Интернете много образцов о Лямбда-выражениях.
Одно решение состояло бы в том, чтобы собрать выражение как строку и затем отправить ему SQL Server, или независимо от того, что Ваша база данных для оценки. Замените фактические переменные 1=1 или 0=1 для Истины и лжи соответственно, и Вы закончили бы с запросом как это:
ВЫБЕРИТЕ 1 ГДЕ (1=1 и 0=1) или (1=1 и 1=1) или (не 0=1 и 1=1)
Затем при выполнении запроса Вы возвращаете 1, когда результат верен. Может не быть самое изящное решение, но оно будет работать. Много людей, вероятно, отговорит от этого, но я просто собираюсь бросить его там как возможное решение так или иначе.