Хорошо, решены обе проблемы.Надеюсь, это может помочь другим.
Выпуск 1
Насколько я понимаю из этой ветки обсуждения Иронии , true и false константы должны рассматриваться как предопределенные глобальные переменные, а не реализовываться непосредственно как часть языка.Поэтому я определяю их как глобальные при создании ScriptInterpreter .
Следует помнить, что, делая это таким образом, они могут быть изменены сценарием, поскольку они не являются константами, нопросто глобальные переменные.Возможно, есть лучший способ сделать это, но сейчас он подойдет:
var interpreter = new Irony.Interpreter.ScriptInterpreter(
new ExpressionEvaluatorGrammar());
interpreter.Globals["true"] = true;
interpreter.Globals["false"] = false;
interpreter.Evaluate(parsedSample);
Issue 2
Прежде всего, оператор <>
должен стоять перед <
и>
операторы в правиле бинарных операторов:
BinOp.Rule = ToTerm("+") | "-" | "*" | "/" | "**"
| "<>" | "==" | "<=" | ">=" | "<" | ">" | "!="; // added comparison operators
Далее я создал пользовательскую реализацию класса LanguageRuntime , которая реализует необходимые операторы.
public class CustomLanguageRuntime : LanguageRuntime
{
public CustomLanguageRuntime(LanguageData data)
: base(data)
{
}
public override void InitOperatorImplementations()
{
base.InitOperatorImplementations();
AddImplementation("<>", typeof(bool), (x, y) => (bool)x != (bool)y);
AddImplementation("!=", typeof(bool), (x, y) => (bool)x != (bool)y);
AddImplementation("==", typeof(bool), (x, y) => (bool)x == (bool)y);
}
}
В ExpressionEvaluatorGrammar переопределите метод CreateRuntime , чтобы вернуть экземпляр CustomLanguageRuntime :
public override LanguageRuntime CreateRuntime(LanguageData data)
{
return new CustomLanguageRuntime(data);
}