4

私はIronyと言語実装全体のシバンに慣れていないので、 Ironyソースに付属しているExpressionEvaluatorサンプルで遊んでいます。これは、私が取り組んでいるプロジェクトのニーズに(ほぼ)適合しているようです。

ただし、ブール値もサポートしたいので、二項演算子のリストに比較演算子を追加しました。

BinOp.Rule = ToTerm("+") | "-" | "*" | "/" | "**"
  | "==" | "<=" | ">=" | "<" | ">" | "!=" | "<>"; // added comparison operators

これが私が達成しようとしていることの例です:

x = 1
y = 2
eval = x < 2
eval2 = y < x
bool = true
bool2 = (eval == eval2)

二項演算子が追加されているため、上記の解析に成功します。ただし、コードをコンパイルして実行すると、最後の2行で失敗します。

  1. 行は次のbool = trueメッセージで失敗します:エラー:変数trueが定義されていません。(5:8)に。truefalseを定数として定義するにはどうすればよいですか?
  2. 行は次のbool2 = (eval == eval2)メッセージで失敗します:エラー:演算子'=='はタイプSystem.BooleanおよびSystem.Booleanに対して定義されていません。(6:15)に。

編集:両方の問題を解決しました。以下の回答を参照してください。

4

1 に答える 1

9

わかりました、両方の問題を解決しました。うまくいけば、これは他の人の助けになるでしょう。

問題1

この Irony ディスカッション スレッドから理解できる限り、trueおよびfalse定数は、言語の一部として直接実装するのではなく、定義済みのグローバル変数として扱う必要があります。そのため、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);
}
于 2011-08-02T12:01:58.543 に答える