R-BASIC (Robot BASIC) 言語仕様書

本書は、ロボット建築シミュレータ (Robot Building Simulator: RBS) における自律ロボット制御用スクリプト言語 R-BASIC の完全な言語仕様を定義します。


1. 概要と実行モデル

1.1 基本コンセプト


2. 構文仕様 (Syntax)

2.1 行・コメント・空白

2.2 ラベル

2.3 変数 (Variables)

2.4 メモリー配列 (mem[])


3. 式と演算子 (Expressions & Operators)

3.1 演算子一覧と優先順位

数式は標準的な演算子の優先順位に従って評価されます。カッコ ( ... ) を用いて優先順位を自由に変更できます。

優先度 演算子 種別 説明 結合性
1 (高) ( ... ) グループ カッコ -
2 - (単項), ! (または NOT) 単項演算子 符号反転(マイナス)、論理否定 右結合
3 *, /, % 算術積除 乗算、除算、剰余(整数演算) 左結合
4 +, - 算術加減 加算、減算 左結合
5 == (または =), != (または <>), <, <=, >, >= 比較 等価・不等価・大小比較(真なら 1、偽なら 0) 左結合
6 && (または AND) 論理積 両辺が真(非ゼロ)なら 1、それ以外は 0 左結合
7 (低) \|\| (または OR) 論理和 いずれかが真(非ゼロ)なら 1、それ以外は 0 左結合

注意 (ゼロ除算): / または % で除数が 0 の場合、エラー "Division by zero" が記録され、結果は 0 となります。

3.2 文字列リテラル


4. 制御構文 (Control Flow)

4.1 無条件ジャンプ (goto)

指定したラベルへプログラムカウンタをジャンプさせます。ラベル名の先頭の * は省略可能です。

goto *target_label
goto next_step

4.2 サブルーチン呼出と復帰 (gosub / return)

指定ラベルへサブルーチンジャンプし、呼び出し元の次の命令アドレスをコールスタックに退避します。 return で退避されたアドレスへ復帰します。

gosub *turn_around
; ここに復帰する

*turn_around
    turn RIGHT
    turn RIGHT
    return

4.3 条件分岐 (if ... then ... else ...)

条件式が真(非ゼロ)なら then 側、偽(ゼロ)なら省略可能な else 側の文を実行します。 then は必須で、それぞれの分岐には goto、gosub、代入、ロボット命令などの1文だけを記述できます。入れ子の if とコロン : による複数文は使用できません。

if carrying != NONE then goto *do_put
if units >= 4 then gosub *full_stack
if check(FRONT) == EMPTY then step else turn RIGHT

4.4 プログラム終了・スリープ (end)

ロボットのスクリプト実行を停止し、ロボットを待機(スリープ)状態にします。

end

4.5 プログラム末尾の自動ループ

プログラムの末尾行まで実行が進むと、自動的に先頭(アドレス 0)に戻ってループ実行を継続します。明示的な goto *start を記述しても構いません。


5. 組み込み定数シンボル

以下の識別子は予約定数として定義されており、式の中で直接利用できます。大文字・小文字は問いません。

定数は32bit整数の上位バイトにカテゴリ、下位24bitに表中の値を持ちます。同じ下位値でも、材料・部材・セル・マーカー・相対方向・絶対方向は異なる値です。通常の整数として加減算でき、命令が消費する時点でカテゴリと下位値の範囲を検査します。

5.1 相対方向 (Relative Direction)

定数名 下位値 説明
FRONT 0 ロボットの正面
RIGHT 1 ロボットの右側(時計回りに90度)
BACK 2 ロボットの後方(180度)
LEFT 3 ロボットの左側(反時計回りに90度)

5.2 絶対方角 (Absolute Direction)

定数名 下位値 説明
NORTH 0 北 (+Y 方向)
EAST 1 東 (+X 方向)
SOUTH 2 南 (-Y 方向)
WEST 3 西 (-X 方向)

5.3 材料種別 (Material)

定数名 下位値 説明
NONE 0 材料なし / 手ぶら
GROUND 1 地面ブロック(採取・運搬不可)
LIGHT 2 軽量材(木材系: 基礎耐震 25)
BALANCED 3 標準材(鉄骨系: 基礎耐震 35)
HEAVY 4 重量材(コンクリート系: 基礎耐震 50)
TENSILE 5 高張力材(炭素繊維・テンシル系: 基礎耐震 40)

5.4 部材種別 (Build Part)

定数名 下位値 必要材料ユニット 説明
PART_NONE 0 0 部材なし
PILLAR 1 4 柱(鉛直荷重・階層支持の中核)
FLOOR 2 2 床(ロボットの移動面・上層建築基盤)
WALL 3 2 壁(横方向の耐力壁)
STAIR 4 2 階段(階層間の上下昇降用部材)

5.5 セル種別 (Cell Kind)

定数名 下位値 説明
EMPTY 0 空き空間
MATERIAL 1 配置済み材料スタック
ORDER 2 建築指示(未着工セル)
CONSTRUCTION 3 施工中(一部ユニット投入済み)
MARKER 8 誘導・巡回用マーカー

5.6 マーカー形状 (Marker Kind)

定数名 下位値 外観
MK_NONE 0 マーカーなし
MK_RED_CONE 1 赤色コーン
MK_BLUE_CUBE 2 青色キューブ
MK_GREEN_SPHERE 3 緑色スフィア
MK_YELLOW_DIAMOND 4 黄色ダイヤモンド
MK_PURPLE_CYLINDER 5 紫色シリンダー

5.7 その他


6. 状態変数とセンシング関数(0 Tick / 即時評価)

式の中で呼び出され、同一 Tick 内で最新のロボット環境情報を取得します。時間を消費しません。

6.1 ロボット状態変数

6.2 周囲センシング関数

引数 dir には相対方向(FRONT, RIGHT, BACK, LEFT)または絶対方角を指定します。

6.3 目標探索関数 (find)

失敗時は以前のターゲットを保持します。結果座標を読む前に戻り値を確認してください。マーカー検索はマンハッタン距離で選択し、到達性を保証しません。

6.4 座標指定ナビゲーション

読取専用状態値 意味
has_target 目標があれば1、なければ0
target_x, target_y, target_z 対象物のセル座標
dest_x, dest_y, dest_z ロボットが立つ作業位置・移動先のセル座標
go_result 直前のgoの結果

目標未設定時の座標はすべて -1。座標系は pos_x/y/z と共通でZが高さです。履歴ではないため、保持したい座標は変数や mem[] に保存します。

両方とも3個の整数式を左から右へ評価する0 Tickの関数で、成功1・失敗0を返します。例: ok = move_to(pos_x + 2, pos_y, pos_z)。単独呼出文ではなく、代入やifの式で使用します。実際の移動は別途 go で行います。

範囲外・対象なし・到達不能では失敗し、以前の目標も解除します。成否によらず go_result を GO_NONE に戻します。既存findは成功時のみ GO_NONE に戻し、失敗時は目標と結果を保持します。

結果定数 値 意味
GO_NONE 0 初期状態または目標設定後でgo未実行
GO_MOVED 1 1歩進んだ。最後の1歩も含む
GO_ARRIVED 2 go開始時に移動先におり、向き調整と目標解除を完了
GO_FAILED -1 移動不能または目標未設定

最後の1歩の次のgoで到着となり、この到着処理も1 Tick消費します。結果は次のgoまたは目標設定まで保持し、wait/get等では上書きしません。Pause・休眠では保持、Reset・プログラム適用・セッション読込で初期化します。目標と結果は保存されません。読込後の再指定に使う座標は mem[] に保存してください。

対象は予約されず、消失・置換しても保存した作業位置への移動を続けます。到着は作業成功を保証しないため、作業前にセンサーで確認してください。経路が塞がれるとgoが失敗して目標解除・右旋回し、自動再試行は行いません。

新しい状態値・結果定数・関数名は予約名で代入できません。同名の既存変数は改名が必要です。


7. 物理アクション命令(1 Tick 消費)

ロボットが実世界に対して作用する命令です。実行された時点でそのロボットの 当 Tick の行動が確定し、1 Tick 経過するまで次の命令は実行されません。

7.1 get

7.2 put

7.3 step / move

7.4 turn <dir>

7.5 go

7.6 wait


8. デバッグ・ログ命令

8.1 print <式>

文字列と数値を + で連結できます。両辺が数値なら加算、どちらかが文字列なら連結です。通常の数値は符号付き10進数へ変換されますが、タグ付き定数や状態変数(HEAVY, carrying, NORTH, dir, PILLAR など)は対応するシンボル名("HEAVY", "NORTH", "PILLAR" 等)として自動的に文字列化されます。通常の優先順位に従い、+ は左から評価します。

print "材料を探しています"
print "所持数=" + units
print "位置=(" + pos_x + "," + pos_y + "," + pos_z + ")"
print "値=" + 1 + 2       ; 値=12
print "値=" + (1 + 2)     ; 値=3
print 1 + 2 + "個"        ; 3個
print "引用符=\" バックスラッシュ=\\"

文字列の使用はprintの式内に限定され、変数・mem[]は整数のままです。文字列の減算・乗算・比較・数値関数への引数渡しはコンパイルエラーになります。引用符は \"、バックスラッシュは \\ で表し、その他のエスケープや文字列内の改行には対応しません。引用符内の ;・//・:・= はそのまま出力できます。

print "heavy" は heavy、print HEAVY は 4 を出力します。文字列長はCP932で1,023バイトまで。リテラルと各連結段階で、日本語の文字境界を保って末尾を ... に省略します。

頭上表示は半透明の背景に白文字で最大2行。長い内容は画面上だけさらに省略され、ログでは上記上限まで確認できます。各ロボットの最新1件を実時間3秒表示し、Pause中は残り時間を停止します。速度倍率には依存しません。新しいprintで内容と残り時間を更新し、同一フレームに複数出力した場合も全件をログへ記録します。print "" は頭上表示を消し、ログへ空行を追加します。

画面外・表示階層外のロボットは非表示。建築物による遮蔽は判定せず、重なった場合は選択中ロボットのメッセージを最前面に描画します。メッセージはクリックを遮りません。Reset・セッション読込・プログラム適用で頭上表示を消し、保存にはログのみを含めます。


9. システム制限値 (Resource Limits)

項目 制限値 超過時の動作
最大バイトコード命令数 4,096 命令 コンパイルエラー (Program exceeds maximum bytecode capacity)
最大ローカル変数数 128 個 コンパイルエラー (Variable limit exceeded)
最大定義ラベル数 256 個 コンパイルエラー
式コンパイラの演算子スタック深度 256 コンパイルエラー(括弧・演算子の組み合わせで消費量が変わります)
データスタック深度 256 満杯の場合、追加の値は保存されません
コールスタック深度 128 サブルーチン呼出が無視されます
メモリー配列容量 (mem[]) 64 要素 (0..63) 実行時エラー記録、0 を返却
1 Tick あたりバイトコード命令数 500 命令 当 Tick の実行を打ち切り、Instruction limit reached (500) を記録。次 Tick で再開
GUI・インポート・保存で扱えるソースコード最大長 65,535 バイト(CP932変換後) 入力を制限、または読込・保存を拒否