Skip to content

Latest commit

 

History

History
247 lines (165 loc) · 10.9 KB

File metadata and controls

247 lines (165 loc) · 10.9 KB

Charless命令セット

言語の基本仕様

  • 拡張子は .cless
  • 使用する文字は 0 から 9 の数字のみ

特殊な数字(予約語)

20: セパレータ(トークン間の区切り文字)

  • 命令や引数を区切るためのセパレータです。
  • トークン(単語)間の区切り文字として機能します(スペースの役割)。

99: 数値リテラルプレフィックス

  • 「数値リテラル」モードの開始を宣言するプレフィックスです。
  • 次に来るのが数値リテラルであることを示します。

数値リテラルの表現方法

数値をコードの一部として埋め込む方法:

  1. 99 トークンで「数値リテラル」モードを開始する。
  2. 99 の直後に続く数字の並びは、次に出現する 20 (区切り) まで、すべて1つの「数値」として解釈される。
  3. このモード中は、20 以外の数字(99 や他の命令番号を含む)はすべて数値の一部として扱われる。

例: 51209912320123 という数値をスタックにプッシュします。

文字列(連続可変長データ)の表現方法

特定の命令(例: 01 = 出力命令)に続くデータとして定義する。

  1. 形式は「長さプレフィックス」方式を採用する。
  2. フォーマット: [桁数][データ本体]
    • [桁数] : [データ本体] の桁数を表す数字。一バイトずつ処理するため一桁固定。
    • [データ本体] : 実際のデータ(文字コードなど)。
  3. この [桁数][データ本体] のペアは、次の 20 (区切り) が出現するまで、連続して並べることができる。
  4. データ本体部分はUTF-8を採用する。

例: 012029729820"ab" を出力

00: 終了命令

00: HALT

  • プログラムの実行を終了します。
  • 例: 0020

0x: 出力系

01: 文字列出力

  • 文字列を出力する命令です。
  • フォーマット: 0120[文字列データ]20
    • [文字列データ] は「長さプレフィックス」方式で表現されます([桁数][データ本体]のペアを連続して並べる)。
    • データ本体部分はUTF-8エンコーディングを使用します。
  • 例: 012029729820"ab" を出力
    • 2 (長さ) + 97 (文字 'a' のASCIIコード) + 2 (長さ) + 98 (文字 'b' のASCIIコード)

02: 数値出力

  • スタックの一番上にある値をポップして、それを10進数の数字としてコンソールに出力します。
  • 例: 51209912320220123 を出力
    • 51209912320 (push 123) + 0220 (出力)

03: メモリ中の文字列出力

  • スタックの一番上に格納されたメモリアドレスをポップし、そのアドレスが指す文字列を出力します。
  • 実行時に文字列のアドレスをスタックにプッシュしてから使用します。
  • 例: 0320 → スタックからアドレスをポップし、そのアドレスが指す文字列を出力

04: 文字出力

  • スタックの一番上にある値をポップして、それを1バイトの文字として出力します。
  • 例: 512099971200420 → 文字 'a' (ASCIIコード 97) を出力
    • 51209997120 (push 97) + 0420 (文字出力)

1x: 入力系

11: 文字入力

  • ユーザーに文字の入力を求め、入力された文字をメモリに格納し、格納したメモリアドレスをスタックにプッシュします。
  • 例: 1120 → 1文字の入力を求め、そのアドレスをスタックにプッシュ

12: 数値入力

  • ユーザーに数値の入力を求め、入力された数値をスタックにプッシュします。
  • 例: 1220 → 数値の入力を求め、その値をスタックにプッシュ

13: 文字列入力

  • ユーザーに文字列の入力を求め、入力された文字列をメモリに格納し、格納したメモリアドレスをスタックにプッシュします。
  • 例: 1320 → 文字列の入力を求め、そのアドレスをスタックにプッシュ

2x: 特殊出力系

21: 改行文字出力

  • 改行文字(\n)を出力します。
  • 例: 2120 → 改行を出力

5x: スタック・メモリ系

51: PUSH

  • スタックに値をプッシュします。
  • フォーマット: 512099[数値]20
    • [数値] は数値リテラルで指定します。
  • 例: 51209912320 → 値 123 をスタックにプッシュ

52: POP

  • スタックから値をポップします(スタックの一番上の値を削除します)。
  • 例: 5220 → スタックから値を一つポップ

53: STORE

  • スタックの一番上にある値をメモリに格納します。
  • フォーマット: 532099[変数ID]20
    • [変数ID] は数値リテラルで指定します(0 から 255 までの範囲)。
    • スタックから値を一つポップし、指定されたIDの「変数ストレージ」に保存します。
  • 例: 532099120 → スタックの値を変数ID 1 に保存

54: LOAD

  • メモリから値をロードします。
  • フォーマット: 542099[変数ID]20
    • [変数ID] は数値リテラルで指定します(0 から 255 までの範囲)。
    • 指定されたIDの「変数ストレージ」から値を読み出し、スタックにプッシュします。
  • 例: 542099120 → 変数ID 1 の値をスタックにプッシュ

6x: 算術演算系

61: ADD (加算)

  • スタックから2つの値をポップし、それらを足し合わせた値をスタックにプッシュします。
  • スタック操作: [a, b][a + b]bがスタックトップ、aがその下。a op bの順で演算)
  • 例: 6120 → スタックの上2つの値を加算

62: SUB (減算)

  • スタックから2つ値をポップし、減算した結果をプッシュします。
  • スタック操作: [a, b][a - b]bがスタックトップ、aがその下。a - bを計算)
  • 例: 6220 → スタックの上2つの値を減算

63: MUL (乗算)

  • スタックから2つ値をポップし、乗算した結果をプッシュします。
  • スタック操作: [a, b][a * b]bがスタックトップ、aがその下)
  • 例: 6320 → スタックの上2つの値を乗算

64: DIV (除算)

  • スタックから2つ値をポップし、除算した結果をプッシュします。
  • スタック操作: [a, b][a / b]bがスタックトップ、aがその下。abで割る)
  • ゼロ除算の場合はエラーになります。
  • 例: 6420 → スタックの上2つの値を除算

65: MOD (剰余)

  • スタックから2つ値をポップし、剰余演算した結果をプッシュします。
  • スタック操作: [a, b][a % b]bがスタックトップ、aがその下。abで割った余り)
  • ゼロ除算の場合はエラーになります。
  • 例: 6520 → スタックの上2つの値を剰余演算

7x: 制御系

71: JUMP

  • 指定されたアドレスに無条件にジャンプします。
  • フォーマット: 712099[アドレス]20
    • [アドレス] は数値リテラルで指定します(コード内の文字位置、0始まり)。
  • 例: 71209910020 → アドレス 100 にジャンプ

72: JZ (ゼロジャンプ)

  • スタックから値を一つポップし、それが0だったら指定のアドレスにジャンプします。
  • フォーマット: 722099[アドレス]20
    • [アドレス] は数値リテラルで指定します。
  • 例: 7220995020 → スタックの値が 0 ならアドレス 50 にジャンプ

73: JNZ (非ゼロジャンプ)

  • スタックから値を一つポップし、それが0でなければ指定のアドレスにジャンプします。
  • フォーマット: 732099[アドレス]20
    • [アドレス] は数値リテラルで指定します。
  • 例: 7320995020 → スタックの値が 0 でないならアドレス 50 にジャンプ

8x: 比較演算系

81: EQS (文字列等価比較)

  • スタックから2つ値をポップし、等しければ1、異なっていれば0をスタックにプッシュします。
  • スタック操作: [a, b][a == b ? 1 : 0]bがスタックトップ、aがその下。文字列比較)
  • 文字列比較にのみ使用可能です。
  • 例: 8120 → スタックの上2つの文字列を比較(等しければ 1)

82: EQN (等価比較)

  • スタックから2つ値をポップし、等しければ1、異なっていれば0をスタックにプッシュします。
  • スタック操作: [a, b][a == b ? 1 : 0]bがスタックトップ、aがその下。数値比較)
  • 数字比較にのみ使用可能です。
  • 例: 8220 → スタックの上2つの数値を比較(等しければ 1)

83: GT (大なり)

  • スタックから2つ値をポップし、下の値が上の値より大きければ1、そうでなければ0をスタックにプッシュします。
  • スタック操作: [a, b][a > b ? 1 : 0]bがスタックトップ、aがその下。a > bを評価)
  • 例: 8320 → スタックの上2つの値を比較(下の値 > 上の値 なら 1)

84: LT (小なり)

  • スタックから2つ値をポップし、下の値が上の値より小さければ1、そうでなければ0をスタックにプッシュします。
  • スタック操作: [a, b][a < b ? 1 : 0]bがスタックトップ、aがその下。a < bを評価)
  • 例: 8420 → スタックの上2つの値を比較(下の値 < 上の値 なら 1)

85: GTE (以上)

  • スタックから2つ値をポップし、下の値が上の値以上なら1、そうでなければ0をスタックにプッシュします。
  • スタック操作: [a, b][a >= b ? 1 : 0]bがスタックトップ、aがその下。a >= bを評価)
  • 例: 8520 → スタックの上2つの値を比較(下の値 >= 上の値 なら 1)

86: LTE (以下)

  • スタックから2つ値をポップし、下の値が上の値以下なら1、そうでなければ0をスタックにプッシュします。
  • スタック操作: [a, b][a <= b ? 1 : 0]bがスタックトップ、aがその下。a <= bを評価)
  • 例: 8620 → スタックの上2つの値を比較(下の値 <= 上の値 なら 1)

コメント

97: 一行コメント

  • 9720 から行末までをコメントとして扱います。
  • コメントはコンパイル時に無視されます。
  • 例: 9720299311131093109310131103116

98: 複数行コメント

  • 9820 から次の 9820 までをコメントとして扱います。
  • コメントはコンパイル時に無視されます。
  • 例:
    9820
    299311131093109310131103116
    9820