一桁だけの逆ポーランド計算機
気が向いたので作ってみた。
逆ポーランド記法はパーサーがいらないので簡単。
字句解析も手抜きで一桁しかダメですが、
計算機としてはちゃんと動きますので可愛いです。
vc++でコンパイルしたものも置いておきます。
http://props.at.infoseek.co.jp/calc.exe
逆ポーランド記法というのは、
「5+3」を「5 3 +」というように演算子を後置で書く記法で、
スタックを使って簡単に構文を処理できる。
((5+3-2)*4)/2 は 5 3 + 2 - 4 * 2 / となる
C:\test>calc >5 3 + 2 - 4 * 2 / 5 3 + 2 - 4 * 2 / 12 >
実は、日本語は逆ポーランド記法になっていて、通常日本人は
「5+3」のことを「5と3を足す」と言う
日本語は、動詞を文章の最後に書くことが特徴で、
膠着語になってるのも特徴。
膠着後は「名詞+助詞」のように「ご飯を」という形になっていて、
これは英語のように言葉の位置が明確に決まっていないので、
助詞が言葉の位置を決めているだと思う。
日本語が議論に適さないというのは、この曖昧性にあると思いますが、
でも、曖昧性は裏を返せば表現の多様性を生み出すし、
それは日本人のものの考え方にも多大な影響を与えていると思う。
あと、述語が後置なのは、
文末まで聞いてみないと何が言いたいのか解らない。重要なことを最後まで隠す
という負の面にもつながっていると思われる。
しかし、「5+3」「5 3 +」という考え方の両方を要求される日本人は
知らず知らずのうちに頭を使っているので、脳が鍛えられていると思う。
スタック型の言語は作るのが簡単でForthという言語が有名ですが、
PostScriptやJavaのVMなどもスタック型の言語らしい。
日本語はスタック型であり、日本人はスタック型アーキテクチャーであると考えると
興味深い。(日本語言語の古参mindはスタック型)
#include <stdio.h> #include <stdlib.h> #include <ctype.h> int stack[1024]; int sp=0; char buf[1024]; int bp=0; int ac=0; void push(int v) { ac=stack[sp++]=v; } int pop() { return stack[--sp]; } void parse() { ac=sp=bp=0; for(;;) { int c=buf[bp++]; if( c==0 ) return; if( c==' ' ) continue; printf("%c ",c); if( c=='q' ) { exit(1); } else if( isdigit(c) ) { push(c-'0'); } else if( c=='+' ) { int x=pop();int y=pop();push(x+y); } else if( c=='-' ) { int x=pop();int y=pop();push(y-x); } else if( c=='*' ) { int x=pop();int y=pop();push(y*x); } else if( c=='/' ) { int x=pop();int y=pop();push(y/x); } } } void main() { for(;;) { printf(">"); fgets(buf, sizeof(buf), stdin); parse(); printf("%d\n",ac); } }