• 締切済み

逆ポーランド記法における単項演算子などの処理

Tacosanの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

加減と乗除で分けているのは, まさに言われる通り「優先順位」のためです. 優先順位を文法で表すためには, このように分けて書く必要があります. 実際, 例えば C の規格を見るとこのようにわらわらと並んでいます. で, 再帰下降パーザではそれぞれの構文要素に対してそれを処理する関数があるので, 結局「優先順位ごとに関数がある」ということになります. 確かに気持ち悪いところですが. 再帰下降パーザを選んでしまうとなかなか回避できません. YACC なら (あるいは演算子順位文法なら) 逃げられるところなんですけどね. 本ですか.... う~ん, 振っておいてなんですがなにがいいかはよくわかんないです.... ただ, YACC を使ってないものだとほとんど再帰下降パーザを使っていると思うので, 実際に構文解析する部分はほとんど同じだと思いますよ. もちろん, 構文解析の前の字句解析の部分とか, あるいは構文解析した結果をどのように保存するかがものによって違うので, その違いが構文解析部分の実際に影響します.

関連するQ&A

  • 逆ポーランド記法

    電卓もどきのアルゴリズムを教えて下さい 指定された数式を解読して、演算結果を求める処理を作成したいのですが・・・・ 今考えている手順は (1) 数式を解析して 逆ポーランド記法の中間言語にして於いておく (2) 逆ポーランド記法の中間言語を演算して答えを求める と考えているのですが・・・ << 例 >>  演算式 1+2×3=    答え 7  演算式 (1+2)×3=  答え 9 大昔の知識ですのでもっとシンプルな方法が有りましたらアドバイス頂けませんでしょうか?

  • 中置記法から前置記法(ポーランド記法)について

    どうも、はじめまして 初めて質問を投稿させていただきます・・・ ひとつどうしても前置記法(ポーランド記法)についてわからないことがあります。 中置記法で A×(B + C)  と  (B + C)×A は同じ答えですよね? これをそれぞれ前置記法にすると・・・ ×A + BC    と   × + ABC となるのでしょうか?? もし、そうであるのならば・・・ 2つとも前置記法で出される結果は同じでしょうか?? よろしくおねがいします。

  • オーバーロードされたメンバ関数のポインタをとる

    オーバーロードされたメンバ関数のポインタをとるにはどうしたらよいでしょうか? 具体的には前置インクリメント演算子 ++()と、後置インクリメント演算子 ++(int)の両方のをオーバーロードしたときに両方のメンバ関数ポインタがとりたいです。 環境はVC7.1です。 よろしくお願いします。

  • インクリメントについて

    インクリメントについて C言語のプログラム中に(1)の文(前置演算子)が存在するのですが、(2)の文(後置演算子)に置き換えても構いませんか? if(a) ++a; ・・・(1) if(a) a++; ・・・(2) 教授下さい。 よろしくお願い致します。

  • C#における++演算子のオーバーロードについて

    はじめまして。 いろいろ調べてみたのですが、わからなかったので、質問させてください。 C#における++演算子のオーバーロードについてなのですが、 まずは、以下のコードをご覧ください。 ================================================================ using System; class Test { private int Num; public Test(int x) { this.Num = x; } public static Test operator ++(Test t) { Test result = new Test(t.Num + 1); return result; } public override string ToString() { return this.Num.ToString(); } } class TestDemo { public static void Main() { Test t = new Test(0); Console.Write(t++ + "\n"); Console.Write(t + "\n"); Console.Write(++t + "\n"); Console.Write(t + "\n"); } } ================================================================ 実行結果 0 1 2 2 ================================================================ ++演算子のオーバーロード関数の実装が一つなのに 前置インクリメントと後置インクリメントが適切に行われています。 二つのインクリメントが行われるときに同じメソッドが 呼び出されていると思うのですが、同一の実装で、振る舞いが 異なるのは、なぜなのでしょうか?どのようなカラクリで 実行されているのでしょうか?全くわかりません。どなたか 教えてください。よろしくお願いします。

  • Perlインクリメントデクリメント

    あっていますでしょうか? インクリメント演算子とデクリメント演算子 インクリメント(加算)演算子は変数の数値を一つ増やす。 デクリメント(減算)演算子は変数の数値を一つ減らす。 ++ インクリメント演算子 変数の値を1増やす $a++ ++$a $aの値を1増やす -- デクリメント演算子 変数の値を1減らす $a-- --$a $aの値を1減らす $a=1; 変数$aに1を代入する print "はじめは$aでした。\n"; $aの代わりに1が入り はじめは1でした。と表示する。 $a++; $aに1を足す。 print "1増えて$aになりました。\n"; $aの代わりに2が入り、1増えて2になりました。 と表示する。 $a--; $aから1減らす。 print "1減って$aに戻りました。\n"; $aの代わりに1を入れて 1減って1に戻りました。 と表示する ↓ 実行結果 ↓ はじめは1でした。 1増えて2になりました。 1減って1に戻りました。 $a++ と ++$a の違い インクリメント演算子、デクリメント演算子には2通りの書き方があります。 ++$a(前置)と$a++(後置) --$a(前置)と$a--(後置) 前置の場合は変数の参照より先に演算が行われます。 後置の場合は変数の参照より後に演算が行われます。 $x=$a=1; 変数$xと$aに1を代入する。 $x=++$a; $aに1を足した後に$xに代入する。$xの値は2になる。 $x=$a=1; 変数$xと$aに1を代入する。 $x=$a++; 変数$aの値を$xに代入した後に$aに1を足す。$xの値は1。 文字もインクリメント出来ます。 $x="A"; "A"を$xに代入する。 $x=++$x; Aから一つ増やしてBにして$xに代入する。 $x="aaa"; "aaa"を$xに代入する。 "aaa"を一つ増やして"aab"を$xに代入する。 ただし、文字のデクリメントはできません。

    • ベストアンサー
    • Perl
  • 後置インクリメントの計算過程について

    後置インクリメントの計算過程について Javaに関して初めての質問となります。よろしくお願いいたします。数日前に学習し始めたばかりの超・初心者です。 現在、基本的な演算について、インクリメント・デクリメントのそれぞれ前置と後置の違いを学習したところなのですが、どうも後置の理解が完璧でないようで、仮に変数をxとした場合、式内にxが二度出てくる場合の後置の計算が理解できません。 具体的には int x, y; x = 10; y = x++ + x++; 上記でコンパイルした結果、y=21となる過程を教えていただけませんでしょうか。 私の理解では、x++は計算に使用した後にxに1を加算するので、まず y = 10 + 10 で、y = 20 となり、その後にxに1を加算してx=11が私の理解です。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 逆ポーランド記法

    C言語で逆ポーランド記法への変換をしようとしています. 演算子の優先順位の付け方がわかりません. 構造体の配列に数式を入れて,それぞれに優先度をつけてみたりしたのですが,いい方法でないように思います. 適切な方法を知っている方よろしくお願いします.

  • 逆ポーランド記法

    逆ポーランド式12*3+というのがあります。これを、スタックをつかって評価しようと思ったのですが、 スタック 上位⇔下位   入力記号列 12*3+ 1      2*3+ 21      *3+ 2       3+ 23      + 5 こんな感じの評価でいいんですか?くだらない質問すいませんm(__)m

  • 逆ポーランド記法について

    学校で A=(B-C)/D+E*Fを逆ポーランド記法で書くのを講師が ABC-DE+F*/= と書いたのですが/の位置は ABC-D/E+F*= こう書くのだと思ったのですが何が違うのでしょうか?