好的,解决了这两个问题。希望这可以对其他人有所帮助。
第一期
据我从这个 Irony 讨论线程中可以理解,真假常量应该被视为预定义的全局变量,而不是直接作为语言的一部分来实现。因此,我在创建ScriptInterpreter时将它们定义为全局变量。
应该知道,通过这种方式,它们可以被脚本修改,因为它们不是常量,而只是全局变量。可能有更好的方法来做到这一点,但现在可以这样做:
var interpreter = new Irony.Interpreter.ScriptInterpreter(
new ExpressionEvaluatorGrammar());
interpreter.Globals["true"] = true;
interpreter.Globals["false"] = false;
interpreter.Evaluate(parsedSample);
第 2 期
首先,<>
运算符应该在二元运算符规则中的<
and运算符之前:>
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);
}