
No.2ベストアンサー
- 回答日時:
お手軽に作りたいなら #1 の再帰下降解析がお勧め. 「入力された式をすぐに計算してそれでおしまい」のときには関数から return するときに「自分が担当した部分式の結果」を返せばいいし, 「入力した式を一度記憶して, あとで計算する」という形であっても入力された式を簡単に「構文木」に変換できます. いずれにしても, 「基本パターン」はできあがっているので, パターンに従う限り間違いようがないはずです.
問題点は複雑な構文になると「再帰がとても深くなる」ことで, これがいやだと LR系 (式の解析なら演算子順位解析あたり) を使うことになります. 演算子順位解析は「スタックを使って式を RPN に変換する標準的な方法」とほぼ同じで, バックエンド (あとで計算するところ) に RPN を使うなら扱いやすいかと思います. ただし, スタックの管理を自分でやらないといけないので変なところを間違える可能性はあります.
ちなみに最近のコンパイラでは RPN を使うことはほとんどないはずです. 普通は構文木を作って, その上で最適化とかかけていくんじゃないかな.
念の為指摘しておきますが「RPN」は表現方法, 「再帰下降解析」は解析方法であってこの 2つは相反するものではありません>#1. 普通はしないけど「再帰下降解析で解析して RPN で記憶する」ことも可能です... ま, しないけど.
この回答へのお礼
お礼日時:2008/04/21 10:14
色々とアドバイスありがとうございます。
やはり「逆ポーランド記法」なんて時代遅れのようですね。
日進月歩のこの分野で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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 逆ポーランド法の計算について 3 2023/05/27 00:53
- 政治 ポーランドの損害に比べたら韓国の損害など取るに足りませんよね?それなのに何故文句を言ってますか? 8 2023/03/07 15:41
- システム CPUの問題について 2 2022/07/09 12:04
- 物理学 スピン 行列表示 固有状態 測定値 1 2022/08/16 18:39
- その他(プログラミング・Web制作) プログラミングって本来数学的な計算をする為のものではないのですか? 学校で配られたFortran90 11 2022/08/25 22:14
- 高校 有効数字計算 確定した値を含む 2 2023/01/18 06:03
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- 化学 [例題①]プロパンのOHとの反応速度定数を k=1.0×10⁻¹²cm³s⁻¹、 [OH]=1.0× 0 2023/05/28 13:12
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進数 加算 減算 C言語
-
有効数字について 以前質問をし...
-
VB.net Double と...
-
ExcelでPC(パソコン)によって...
-
2進数データのビット演算
-
c languageで 簡単な質問があ...
-
VB6のFIX関数での誤差について
-
VBAでミリ秒まで出力する方法
-
除算を使わずに10で割りたい。
-
floatの有効桁数がわからない
-
乱数 なぜ剰余を使うのか
-
有効桁数の数え方・誤差
-
-2.18+2.11=-7.00000000000003E...
-
大きすぎる数値になるとE+にな...
-
浮動小数演算は実行環境の変化...
-
ExcelのINT関数の計算結果がお...
-
浮動小数演算での誤差の蓄積が...
-
EXCELの関数"STDEV(標準偏差)"...
-
2038年問題 日付算出
-
計算の丸め誤差の解消について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
VB.net Double と...
-
VBAでミリ秒まで出力する方法
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
EXCELの関数"STDEV(標準偏差)"...
-
16進数 加算 減算 C言語
-
三菱シーケンサ(Aシリーズ)で...
-
除算を使わずに10で割りたい。
-
”/”を使わずに割り算したいんで...
-
CRCの計算方法について
-
VB6.0での小数点の扱いについて
-
UTF8からUnicode(コードポイン...
-
2進数の足し算(C言語)
-
色の判定
-
MATLABでの行列の全要素の和
-
計算の丸め誤差の解消について
-
BCD・HEX・BINについて
おすすめ情報