No.2ベストアンサー
- 回答日時:
お手軽に作りたいなら #1 の再帰下降解析がお勧め. 「入力された式をすぐに計算してそれでおしまい」のときには関数から return するときに「自分が担当した部分式の結果」を返せばいいし, 「入力した式を一度記憶して, あとで計算する」という形であっても入力された式を簡単に「構文木」に変換できます. いずれにしても, 「基本パターン」はできあがっているので, パターンに従う限り間違いようがないはずです.
問題点は複雑な構文になると「再帰がとても深くなる」ことで, これがいやだと LR系 (式の解析なら演算子順位解析あたり) を使うことになります. 演算子順位解析は「スタックを使って式を RPN に変換する標準的な方法」とほぼ同じで, バックエンド (あとで計算するところ) に RPN を使うなら扱いやすいかと思います. ただし, スタックの管理を自分でやらないといけないので変なところを間違える可能性はあります.
ちなみに最近のコンパイラでは RPN を使うことはほとんどないはずです. 普通は構文木を作って, その上で最適化とかかけていくんじゃないかな.
念の為指摘しておきますが「RPN」は表現方法, 「再帰下降解析」は解析方法であってこの 2つは相反するものではありません>#1. 普通はしないけど「再帰下降解析で解析して RPN で記憶する」ことも可能です... ま, しないけど.
色々とアドバイスありがとうございます。
やはり「逆ポーランド記法」なんて時代遅れのようですね。
日進月歩のこの分野で30年以上も前の手法をいつまでも使ってる分けないですね・・・・・
昔人間なので「演算子順位解析」、「構文木」、「再帰下降解析」等よく判っていません、若い人にもう少し調べてから最適な方法を検討してみます。
アドバイス有りがとうございました。
No.1
- 回答日時:
★再帰下降構文解析
・逆ポーランド記法以外にも『再帰下降構文解析』という方法もあります。
これは再帰関数を使って数式を計算します。
例えば
(1)Factor()…数値、変数、括弧
(2)MulDiv()…乗算、除算、剰余
(3)AddSub()…加算、減算
(4)Compare()…比較
(5)Express()…数式評価
このような関数を用意して
Express()→Compare()→AddSub()→MulDiv()→Factor()→Express()
と再帰呼び出しを行うだけで加減算よりも乗除算を優先して計算してくれます。
下に参考になりそうなリンクを貼って置きます。
参考URL:http://ruffnex.oc.to/kenji/src/dentaku2.c
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三菱シーケンサ(Aシリーズ)で...
-
VB.net Double と...
-
16進数 加算 減算 C言語
-
floatの有効桁数
-
どんな数字を入力してもaverage...
-
ExcelでPC(パソコン)によって...
-
三角関数、逆三角関数の算出方...
-
O(n log n)について2
-
c languageで 簡単な質問があ...
-
VBAでミリ秒まで出力する方法
-
有効数字について 以前質問をし...
-
-2.18+2.11=-7.00000000000003E...
-
エクセルの多い桁数を表示させ...
-
C#にて電卓を作りたいのですが...
-
100桁の計算ができなくて困って...
-
三角比の俯角の計算
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
c languageで 簡単な質問があ...
-
16進数 加算 減算 C言語
-
有効数字について 以前質問をし...
-
ExcelのINT関数の計算結果がお...
-
除算を使わずに10で割りたい。
-
VB.net Double と...
-
2進数の足し算(C言語)
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
EXCELの関数"STDEV(標準偏差)"...
-
”/”を使わずに割り算したいんで...
-
floatの有効桁数
-
VBAでミリ秒まで出力する方法
-
コンピューターは指数関数をど...
-
距離から緯度経度を求める方法
-
VB6.0での小数点の扱いについて
-
時刻の比較
-
どんな数字を入力してもaverage...
-
powf を使わずにべき乗を計算
おすすめ情報