プログラミング言語を作ってみた.


たぶん「難解プログラミング言語」に分類されるのかな.

でも単にアセンブリを置き換えただけに近いww

使える文字は + - * / | だけです.

簡単でしょ?


この言語の特徴の一つとして,構文エラーがありませんww

どんなにでたらめに書こうが構文として解釈され,エラー無く実行されます.

・・・たぶんw


次のプログラムは1〜255の数字を足して出力します.

*/********

+/*
+/*
++++

*+|*
+*+
*+
+*
++
*/*
*+
****

+*|*
++
*/****
*/***
***
*/**
*/*
***
*+
-*

/*


まぁこの言語自体の製作時間が半日も無いので大分適当ですがww

コンパイラなんて数時間ですしw

# C++で300行強


なんでこんな言語を作ったかというと,+-*/|以外はすべて無視されるのでゆのin languageが簡単だ!ってだけですw

しかもまだ文字表示できないwww


簡単な言語説明(仕組みは簡単です).


●各行の一番左の文字は特殊

* スタックにプッシュ
+ キューにエンキュー
- 条件分岐(スタックを3回ポップ)
/ 表示

●一番左以外に単体で来た場合

/ スタックとキューをポップして値の小さいほうが使われる
- 上に逆(大きいほう)
* スタックをポップした値
+ キューをデキューした値


●それ以外は計算

r = +-*/
rr = r + r
rrr = r - r

R = rrrrrrr....
S = rrrrrrr....
T = rrrrrrr....

# ただし隣接するR S Tのrは同じではない

RS = R+S

RST = S - T (Rは無視)


● 条件分岐

- r

int condition = r
int line_true = スタックポップ
int line_false = スタックポップ

if(condition)
  line_true行へジャンプ
else
  line_false行へジャンプ

# 空行無視


●数字表記

/rrrrr.... は数字

/* = 1
/- = 0001
/+ = 00000001

例:/*-+*は2進数で10001000000011

この馬鹿な表記方法のせいで
4は
r/**//*/
0は
r/*//*//*
と書く必要がある.


正直0のこの書き方は今気づいたww

r/*
r/*
rrrr
って書いてたよ(書いてある).

再帰BNFみたいに(違うかも)実装したので,こういう記法が勝手にできるようになってるって,なんか感動する.



また/で数字を終わる.
*/*/*
は1+ポップをプッシュ


●区切り

は式を区切る

ただし一番左にある|は特殊

*+*|*
n = ポップ
プッシュ n
エンキュー n
プッシュ n

-|r
n = ポップ
スタックとキューをポップして値の大きいほうにnをプッシュ(エンキュー)
/|r
上の逆(小さいほう)

**|/*|/**

1をプッシュx2
3をプッシュx2


これくらいかな.

疲れた.