Skip to content

Latest commit

 

History

History
218 lines (192 loc) · 7.07 KB

spec.md

File metadata and controls

218 lines (192 loc) · 7.07 KB

CheapBasic言語仕様

概要

実数型BASICのサブセットです。数値の表せる範囲はCやJavaのdouble値と同じです。昔のBASICと違い、行番号はありません。一般的なプログラム言語と違い、変数は宣言無しで使えます。変数は数値型のみです。

# 九九の表を出力するプログラム例

for x = 1 to 9
    for y = 1 to 9
        if x * y < 10 then print " ";
        print x * y;" ";
    next y
    print
next x
end

# 実行
>cb ファイル名
 1  2  3  4  5  6  7  8  9 
 2  4  6  8 10 12 14 16 18 
 3  6  9 12 15 18 21 24 27 
 4  8 12 16 20 24 28 32 36 
 5 10 15 20 25 30 35 40 45 
 6 12 18 24 30 36 42 48 54 
 7 14 21 28 35 42 49 56 63 
 8 16 24 32 40 48 56 64 72 
 9 18 27 36 45 54 63 72 81 
ok.

文字列

print文とinput文のみで、表示用の文字列を使用できます。文字列はダブルクォーテーション(")でくくります。

print "日本語も使えます。"

大文字、小文字の区別

識別子や予約語では大文字、小文字は区別されません。
変数「A」と変数「a」は同一の変数です。
次の2行も同じ内容のプログラムです。

IF A = 1 THEN PRINT "ok"
if a = 1 then print "ok"

ただし、文字列の中では大文字、小文字の区別があります。

print "OK"
PRINT "ok"

それぞれ、大文字の"OK"と小文字の"ok"を出力します。
※この仕様の理由はCheapBasicの元がPL/0のため。

変数

変数は宣言無しで使えます。数値型のみです。変数名は1文字目は英文字、2文字目以降は数字または英字で、31文字までです。変数の初期値は0です。

配列

DIM宣言はありません。宣言なしで配列を使えます。

a(0) = a(1) + a(2)

添え字の大きさに制限はありません。配列の次元にも制限はありません。

a(100000,1,2,3,4,5) = 123

「a(1)」と「a」はそれぞれ異なる変数です。

※賢明なかたは気がついているかもしれませんが、連想記憶方式です。つまり、内部的には、「a(100000,1,2,3,4,5)」という変数名で認識されています。この文字列が31文字を超えるとエラーになります。
※添字に少数が指定された場合は自動的に整数に丸められます。

真偽値

0以外が真です。 0が偽です。

ステートメント(文、命令)一覧

ステートメントの区切りは「改行」または「:」です。
# 文字列 コメントを記述します。(コメント文は通常のBASICと表記が異なります。)

例: # これはテストプログラムです。

変数 = 式 

式を計算して変数に代入します。LETキーワードはありません。

例: a = b + c

if 式 then ステートメント(列)

式が0でなければステートメント列を実行します。0なら次の行から実行を継続します。elseはありません。(後述のマルチステートメントも参照のこと)

例: if (a = 0) and (b = 1) then goto loop

print [[文字列|式|];]... 

print文の最後が;で終わった場合は改行しません。
引数なしのprint文は、改行します。

例: print "計算結果="; 1 + 2 + 3 + 4; "円"

「,」キーワードはサポートしていません。

input [文字列;]変数 

標準入力から入力した値を変数に代入します。

例:input "XY="; xy

label ラベル 

ラベルを定義します。ラベルで使用できる文字は変数名と同じです。

例:label loop

goto ラベル

ラベルを定義した位置に飛びます。

例: goto loop

gosub ラベル 

ラベルを定義した位置に飛びます。

例: gosub sub

return 

gosubで飛んだとき、元の位置に戻ります。

例: return

for 変数=式A to 式B [step 式C] 

変数の値を変化させながらnextまで繰り返します。
stepを省略した場合、常にステップ値は1になります。
最後の変数の値が終値に一致せず、終値+ステップ値が正または負の値を超える場合は、超えた時点でループを終了します。

例: for i=0 to 10 step 2

next [変数] 

forステートメントの位置に戻って動作を繰り返します。forステートメントで示した条件が満たされた場合は、nextの次に動作が進みます。nextの後の変数名は省略可能です。

例: next

end 

プログラムの実行を終了します。

マルチステートメントについて

ステートメントの後で「:」を追加すると同じ行に複数のステートメントを記述できます。if文の後で使った場合、条件に合致した場合のみ実行されます。

例: if a = 1 then print "OK": goto LABEL1
※ステートメント一覧は株式会社ピーデーのWonderWitch用BASIC言語「ワンべぇ」のステートメント一覧を参考にさせて頂きました。


演算子と優先順位

演算子の優先順位は高い順に次の通りです。

  1. INT (整数化) + - (単項演算子)
  2. * / MOD (乗算, 除算, 剰余)
  3. + - (加算, 減算)
  4. = < > <= >= <>  (比較演算)
  5. NOT (真偽反転)
  6. AND OR (論理積,論理和)

NOTおよびAND ORの動作はビット演算ではありません。次の動作になります。

  • NOT : 0ならば1になる。0でないならば0になる。
  • AND : 両辺が0でないならば1になる。そうでないならば0になる。
  • OR : 両辺ともに0ならば0になる。そうでないならば1になる。

INTは32ビットの符号付き整数に丸められます。
剰余はC言語の計算方式です。


予約語(キーワード)

次の通りです。

  • PRINT
  • INPUT
  • IF
  • THEN
  • LABEL
  • GOTO
  • GOSUB
  • RETURN
  • END
  • AND
  • OR
  • NOT
  • MOD
  • FOR
  • TO
  • NEXT
  • STEP
  • INT


制限値一覧

#define値とあるのは、定義値を変更して再コンパイルすれば変更可能です。

属性 #define値 備考
ソースの最大長 10000バイト maxsourcesize 最後のEOFを含まない長さ
使用できる変数の最大個数 5000 maxvariable 変数領域、GOSUB/FORスタック、ラベル領域は共用
GOSUB/FORのネスト段数の上限 maxvariable
ラベルの最大個数 maxvariable
変数名の最大長 31文字 maxnamesize
ラベル名の最大長 30文字 maxnamesize - 1
配列の添え字の上限値 無制限 - 整数の最大値まで可能
配列の最大次元 無制限(注1) (maxnamesize)
文字列定数の最大長 1023バイト maxstrsize

注1:次元は無制限ですが、連想記憶方式のため、変数を表す文字の長さが制限となります。 

例:a(100,200,300,400,500,600,700) 
->文字列として31文字を超えるのでエラー