« 遊びと人間 (4) | メイン | 大海戦 »

yacc 凡ミス

初歩的なミスで1時間ぐらい悩んだ……orz

 expr    : expr '+' expr {$$ = $1 + $3;}
         | expr '-' expr {$$ = $1 - $3;}
         | expr '*' expr {$$ = $1 * $3;}
         | expr '/' expr {$$ = $1 / $3;}
         | '(' expr ')'  {$$ = $2;}
         | '-' expr  %prec UMINUS {$$ = - $2;}
         | NUMBER
         ;
↑四則演算がreduce/reduceでうまく行かず、はまること1時間。
ふと上のほう見たら……

 function: FUNC expr expr { func($2,$3); }

とか何の疑問も持たずに書いていた俺がいる。
これじゃ、出来上がったスクリプトの方に func 3 -5 とか書いたら混乱するやん……


つまりは、
 function: FUNC expr ',' expr { func($2,$4); }

とカンマを入れておかないと、先ほどの部分で「3 -5」を「3 - 5」と区別がつかなくなるわけだ。
(というか、関数の前後に ( ) ぐらいつけろよ、俺)


yacc/lexに限ったことじゃないが、俺的プログラムの面白さは再帰に尽きる。
それこそ、一歩間違えばスタックを一瞬で破壊してくれるわけだが(爆)、たった数行の関数の再帰呼び出しが見事な結果を導くことがある。
この辺とかのフラクタル図形なんかが目に見えて典型的だ。
まだしばらくは先だろうが、Cellコンピューティングが視野に入ってくるにつれ、深~~~い分散型の再帰がとんでもない速度で動いてくれそうで楽しみだったりする。

トラックバック

このエントリーのトラックバックURL:
http://www.ranpub.com/mt32/mt-rpb-tb.cgi/703

コメント

With all the doggone snow we have had as of late I am stuck inside , fortunately there is the internet, thanks for giving me something to do. :)

コメントを投稿