Irony .NETを使用して、かなり複雑なサイコロを振る命令を処理するための単純なDSLを作成しようとしています。基本的な計算機の機能は、実装するのに十分シンプルでした(加算、減算など)。ところが、ようやくロール式の追加に取り掛かったところ、困りました。理想的には、ロール式を次の形式にします。ndmここで、nはロールするサイコロの数、mは各サイコロの辺の数です。
ここでの私の問題は、dの横に式が必要なことです。これを行うと、Ironyはdが無効な文字であると文句を言います。その周りのスペースは機能し(1 d 6)、英数字以外の文字に置き換えると機能します(1%6)。現時点では、ソース内の各dを「d」に置き換えるだけで機能しますが、変数(変数を区別するために「$」を前に付ける予定です)に到達すると、これは明らかに機能しません。
問題は、スペースなし(1d6)で、できれば文法を大幅に変更せずに、どうすれば機能させることができるかということです。(注:それでもスペースで機能する場合は完全に問題ありません。スペースが必要になることは望ましくありません。)
expression = new NonTerminal("expression");
add = new NonTerminal("add");
subtract = new NonTerminal("subtract");
multiply = new NonTerminal("multiply");
divide = new NonTerminal("divide");
roll = new NonTerminal("roll");
expression.Rule = number | add | subtract | multiply | divide | roll;
add.Rule = expression + "+" + expression;
subtract.Rule = expression + "-" + expression;
multiply.Rule = expression + "*" + expression;
divide.Rule = expression + "/" + expression;
roll.Rule = expression + "d" + expression;
RegisterOperators(1, "+", "-");
RegisterOperators(2, "*", "/");
RegisterOperators(3, "d");
MarkPunctuation("+", "-", "*", "/", "d");
MarkTransient(expression);
this.Root = expression;