文字で書いた記号を記号として扱うにはどういう変換方法があるか教えていただきたいです
目的 文字列の式を動的に解釈したい
C#
1コード 2int a = 0; 3string str = "a < 1"; 4 5//このような値と文字で書かれた式を 6 7if(a < 0) Console.WriteLine(""); 8//こういう形に変換したい
考えたことは、文字"a"をclassにあるaに参照して変数を取り出して、0は数値として見分ける。
文字"<"はSiwtch文で
C#
1コード 2string code = "<"; 3switch (code) 4 { 5 case "<": 6 //bool型の関数に割り当てる 7 bool result = a < 0; 8 break; 9 case ">": 10 //bool型の関数に割り当てる 11 bool result = a > 0; 12 break; 13 }
実際にはビジュアルスタジオにはstring str = "a < 1";は書かずに、ノベルゲーム内の読み込むシナリオ(外部ファイル)の次のステップに進む条件でa < 1と書きます。
質問が意味不明です
まず、なにをしたいのかを説明されては
文字で書いた記号を記号に変換の仕方です。
あなたはなにをしたくて記号を変換したいんでしょうか。
> if(a ">" 1)の場合 この">"はどのように記号として変換できるかを知りたいです。
意味が分かりません。if(a ">" 1) とかは C# の文法的にも成り立たないし・・・
例えがおかしかったかもしれないですね。
"a > 1" これの文字で書いた記号">"はどのようにダブルクオーテーションを廃した記号(>)として変換する方法です。
やろうと思えばソースジェネレーターや式木やデリゲートでできなくはありませんが、そのようなことはしません。元々の目的を果たすためのもっと良い方法があるはずです。
依然として意味不明です。とんでもなく斜め上のことを考えているような気がします。そもそものやりたいこと(あなたの言う「ダブルクオーテーションを廃した記号」をどういう目的でどのように使いたいか)を書いた方が良さそうです。
記号というのが何を意味しているかが不明なので、回答者に判るように書いてください。
stringからchar一文字を切り出したいということですか?stringに含まれるダブルクォーテーション文字を除去したいということですか?
ほんとに分からないですね。文字列である">"を「大なり」の意味を成す式の記号にするのはどうしたら?と言うことでしょうか。目的として、
文字列の式を動的に解釈したいとか。質問からは読み取れませんね。
質問伝達能力皆無です。
dodox86さんのおっしゃる通りです。
やろうと思えばソースジェネレーターや式木やデリゲートでできなくはありませんが、そのようなことはしません。元々の目的を果たすためのもっと良い方法があるはずです。
int a = 0;
string str = "a < 1";
という定義がされていたとして、if (str) のようにして true と判定するようにしたいということ?
もう一度言いましょうか?
はい!
ではもう一度。
やろうと思えばソースジェネレーターや式木やデリゲートでできなくはありませんが、そのようなことはしません。元々の目的を果たすためのもっと良い方法があるはずです。
念のためもう一度。中学生程度の能力があるならそろそろググって理解できるはず。
やろうと思えばソースジェネレーターや式木やデリゲートでできなくはありませんが、そのようなことはしません。元々の目的を果たすためのもっと良い方法があるはずです。
元々の目的を果たす良い方法とは、文字列で比較するのではなく別の方法を考えるべきということですか?
ソースジェネレーターや式木やデリゲートこの辺は最初に言われて即ググりましたよ。
まず元々の目的を書かなければ伝わりませんが、ググってわからないならしょうがないですね。
昨日丸一日ググってもわからなかったので最終手段としてここで聞いています。
元々の目的は、外部ファイルで文字として書かれた "a < 1"をC#にもってきて文法に合うように変換するにはです。
ググった結果、それがこの質問にどう関連するかわからないのでは、どのように説明しても無駄でしょう。
> そのようなことはしません。
この意味もわからないということですよね。元々の目的を書いていないので、実際に何がしたいのか伝わりませんが、あなたのしようとしていることは、ほんの少しの手間でできることをわざわざ無駄に大きな方法を使っているようにしか見えません。
XY 問題になっていると思います。Y だけでなく X も書いてもらえるとより的確な回答が得られるのではないかと思います。
上の質問でもう一度書き直しますが、
目的は、文字列の式を動的に解釈したい。
解決策は考えれるのは">"をSiwtch文を使って、この文字ならもともと書式で書いた式に割り当てるくらいです。
また、元々知りたいことは上で書いた通り、stringで書いた記号をstringを廃した記号に変換するということです。
私が「書いていない」と言っているのは、なんのために文字列の式を動的に解釈したいのかという目的のことです。
> 目的 文字列の式を動的に解釈したい
それは「目的」ではなくて、その上のレイヤーにある目的を果たすための手段に過ぎないのでは? つまり、依然として XY 問題の Y を書いていて、X が書いてないと思うのですが・・・
そうではなくて、目的だというなら Zuishin さんのコメントを参考に自助努力でできるところまでやってみては?
書き直しましたが言ってることは同じで伝わりにくいと思います。
(すれ違いました)
質問内の一番下に書いてます。
ノベルゲーム内の読み込むシナリオ(外部ファイル)の次のステップに進む条件でa < 1と書きます。
それと、興味本位というのも混じっています。
https://www.peyarogu.com/entry/roslyn-csharp
よく判りませんけど、こういう感じの事をしたいんですかね。
いえ、これならわかります。
単純な構文しか無いなら、私ならデリゲートを Dictionary に入れますが、それをしなくても単に switch で分岐するので十分じゃないですか?
複雑な構文解析が必要なら Roslyn を使います。他の言語で言う eval のようなことができます。
他にも少し情報は古いですが、次のような方法があります。
https://dobon.net/vb/dotnet/programing/eval.html
このような感じの解析です。それの"<"この文字記号を文字として扱い変換する方法です。
他の文字"a"や文字数値の解析に関しては問題ないです。
delegateをDictionary に入れることもできるのですね。
このリンクの方法は読んでてかなり参考になりました。
初めから詳細に情報を書くべきでした、申し訳ございません。
ありがとうございました。
解決後で申し訳ないのですが、仰るような目的なら、インタープリタを検索のキーワードにしてみるのをお勧めします。
回答1件
あなたの回答
tips
プレビュー