一桁だけの逆ポーランド計算機

気が向いたので作ってみた。
逆ポーランド記法はパーサーがいらないので簡単。
字句解析も手抜きで一桁しかダメですが、
計算機としてはちゃんと動きますので可愛いです。

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やJavaVMなどもスタック型の言語らしい。
日本語はスタック型であり、日本人はスタック型アーキテクチャーであると考えると
興味深い。(日本語言語の古参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);
	}
}