- 拡張子は
.cless - 使用する文字は 0 から 9 の数字のみ
- 命令や引数を区切るためのセパレータです。
- トークン(単語)間の区切り文字として機能します(スペースの役割)。
- 「数値リテラル」モードの開始を宣言するプレフィックスです。
- 次に来るのが数値リテラルであることを示します。
数値をコードの一部として埋め込む方法:
99トークンで「数値リテラル」モードを開始する。99の直後に続く数字の並びは、次に出現する20(区切り) まで、すべて1つの「数値」として解釈される。- このモード中は、
20以外の数字(99や他の命令番号を含む)はすべて数値の一部として扱われる。
例: 51209912320 → 123 という数値をスタックにプッシュします。
特定の命令(例: 01 = 出力命令)に続くデータとして定義する。
- 形式は「長さプレフィックス」方式を採用する。
- フォーマット:
[桁数][データ本体][桁数]:[データ本体]の桁数を表す数字。一バイトずつ処理するため一桁固定。[データ本体]: 実際のデータ(文字コードなど)。
- この
[桁数][データ本体]のペアは、次の20(区切り) が出現するまで、連続して並べることができる。 - データ本体部分はUTF-8を採用する。
例: 012029729820 → "ab" を出力
- プログラムの実行を終了します。
- 例:
0020
- 文字列を出力する命令です。
- フォーマット:
0120[文字列データ]20[文字列データ]は「長さプレフィックス」方式で表現されます([桁数][データ本体]のペアを連続して並べる)。- データ本体部分はUTF-8エンコーディングを使用します。
- 例:
012029729820→"ab"を出力2(長さ) +97(文字 'a' のASCIIコード) +2(長さ) +98(文字 'b' のASCIIコード)
- スタックの一番上にある値をポップして、それを10進数の数字としてコンソールに出力します。
- 例:
51209912320220→123を出力51209912320(push 123) +0220(出力)
- スタックの一番上に格納されたメモリアドレスをポップし、そのアドレスが指す文字列を出力します。
- 実行時に文字列のアドレスをスタックにプッシュしてから使用します。
- 例:
0320→ スタックからアドレスをポップし、そのアドレスが指す文字列を出力
- スタックの一番上にある値をポップして、それを1バイトの文字として出力します。
- 例:
512099971200420→ 文字'a'(ASCIIコード 97) を出力51209997120(push 97) +0420(文字出力)
- ユーザーに文字の入力を求め、入力された文字をメモリに格納し、格納したメモリアドレスをスタックにプッシュします。
- 例:
1120→ 1文字の入力を求め、そのアドレスをスタックにプッシュ
- ユーザーに数値の入力を求め、入力された数値をスタックにプッシュします。
- 例:
1220→ 数値の入力を求め、その値をスタックにプッシュ
- ユーザーに文字列の入力を求め、入力された文字列をメモリに格納し、格納したメモリアドレスをスタックにプッシュします。
- 例:
1320→ 文字列の入力を求め、そのアドレスをスタックにプッシュ
- 改行文字(
\n)を出力します。 - 例:
2120→ 改行を出力
- スタックに値をプッシュします。
- フォーマット:
512099[数値]20[数値]は数値リテラルで指定します。
- 例:
51209912320→ 値123をスタックにプッシュ
- スタックから値をポップします(スタックの一番上の値を削除します)。
- 例:
5220→ スタックから値を一つポップ
- スタックの一番上にある値をメモリに格納します。
- フォーマット:
532099[変数ID]20[変数ID]は数値リテラルで指定します(0 から 255 までの範囲)。- スタックから値を一つポップし、指定されたIDの「変数ストレージ」に保存します。
- 例:
532099120→ スタックの値を変数ID 1 に保存
- メモリから値をロードします。
- フォーマット:
542099[変数ID]20[変数ID]は数値リテラルで指定します(0 から 255 までの範囲)。- 指定されたIDの「変数ストレージ」から値を読み出し、スタックにプッシュします。
- 例:
542099120→ 変数ID 1 の値をスタックにプッシュ
- スタックから2つの値をポップし、それらを足し合わせた値をスタックにプッシュします。
- スタック操作:
[a, b]→[a + b](bがスタックトップ、aがその下。a op bの順で演算) - 例:
6120→ スタックの上2つの値を加算
- スタックから2つ値をポップし、減算した結果をプッシュします。
- スタック操作:
[a, b]→[a - b](bがスタックトップ、aがその下。a - bを計算) - 例:
6220→ スタックの上2つの値を減算
- スタックから2つ値をポップし、乗算した結果をプッシュします。
- スタック操作:
[a, b]→[a * b](bがスタックトップ、aがその下) - 例:
6320→ スタックの上2つの値を乗算
- スタックから2つ値をポップし、除算した結果をプッシュします。
- スタック操作:
[a, b]→[a / b](bがスタックトップ、aがその下。aをbで割る) - ゼロ除算の場合はエラーになります。
- 例:
6420→ スタックの上2つの値を除算
- スタックから2つ値をポップし、剰余演算した結果をプッシュします。
- スタック操作:
[a, b]→[a % b](bがスタックトップ、aがその下。aをbで割った余り) - ゼロ除算の場合はエラーになります。
- 例:
6520→ スタックの上2つの値を剰余演算
- 指定されたアドレスに無条件にジャンプします。
- フォーマット:
712099[アドレス]20[アドレス]は数値リテラルで指定します(コード内の文字位置、0始まり)。
- 例:
71209910020→ アドレス 100 にジャンプ
- スタックから値を一つポップし、それが
0だったら指定のアドレスにジャンプします。 - フォーマット:
722099[アドレス]20[アドレス]は数値リテラルで指定します。
- 例:
7220995020→ スタックの値が 0 ならアドレス 50 にジャンプ
- スタックから値を一つポップし、それが
0でなければ指定のアドレスにジャンプします。 - フォーマット:
732099[アドレス]20[アドレス]は数値リテラルで指定します。
- 例:
7320995020→ スタックの値が 0 でないならアドレス 50 にジャンプ
- スタックから2つ値をポップし、等しければ
1、異なっていれば0をスタックにプッシュします。 - スタック操作:
[a, b]→[a == b ? 1 : 0](bがスタックトップ、aがその下。文字列比較) - 文字列比較にのみ使用可能です。
- 例:
8120→ スタックの上2つの文字列を比較(等しければ 1)
- スタックから2つ値をポップし、等しければ
1、異なっていれば0をスタックにプッシュします。 - スタック操作:
[a, b]→[a == b ? 1 : 0](bがスタックトップ、aがその下。数値比較) - 数字比較にのみ使用可能です。
- 例:
8220→ スタックの上2つの数値を比較(等しければ 1)
- スタックから2つ値をポップし、下の値が上の値より大きければ
1、そうでなければ0をスタックにプッシュします。 - スタック操作:
[a, b]→[a > b ? 1 : 0](bがスタックトップ、aがその下。a > bを評価) - 例:
8320→ スタックの上2つの値を比較(下の値 > 上の値 なら 1)
- スタックから2つ値をポップし、下の値が上の値より小さければ
1、そうでなければ0をスタックにプッシュします。 - スタック操作:
[a, b]→[a < b ? 1 : 0](bがスタックトップ、aがその下。a < bを評価) - 例:
8420→ スタックの上2つの値を比較(下の値 < 上の値 なら 1)
- スタックから2つ値をポップし、下の値が上の値以上なら
1、そうでなければ0をスタックにプッシュします。 - スタック操作:
[a, b]→[a >= b ? 1 : 0](bがスタックトップ、aがその下。a >= bを評価) - 例:
8520→ スタックの上2つの値を比較(下の値 >= 上の値 なら 1)
- スタックから2つ値をポップし、下の値が上の値以下なら
1、そうでなければ0をスタックにプッシュします。 - スタック操作:
[a, b]→[a <= b ? 1 : 0](bがスタックトップ、aがその下。a <= bを評価) - 例:
8620→ スタックの上2つの値を比較(下の値 <= 上の値 なら 1)
9720から行末までをコメントとして扱います。- コメントはコンパイル時に無視されます。
- 例:
9720299311131093109310131103116
9820から次の9820までをコメントとして扱います。- コメントはコンパイル時に無視されます。
- 例:
9820 299311131093109310131103116 9820