0

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;
4

1 に答える 1

2

問題は、トークンがどこから始まりどこで終わるかを知るための何らかの方法が必要なことです。最初に文字列をトークンに分割できなければ、文法は何が何であるかを理解できません。

Ironyはこれをサポートしていると思います。AssignWhitespaceAndDelimiters()を見てください。キー用語のリストに「d」を追加する必要があるか、区切り文字自体として追加できるようです。

于 2012-10-04T00:13:48.097 に答える