本章では、Vlrfsasmの文法について解説します。
前章の最後で「Hello world!」を出力しましたが、実のところあれはかなり高度な内容を含むので、解説は後の章で行います。
Vlrfsasmでは、データのことを「値」と呼びます。
値は、順序と方向をもつ1次元のビット列で表現されます。値には、型などの情報を分けて付加することはできません。全てこのビット列に埋めこむ必要があるので、利用する構造体には、判別できる情報を予め加えましょう。
値に含まれるビットの数を、「幅」と言います。「長さ」や「大きさ」も、Vlrfsasmにおいては同義語です。値は、0以上524288以下の個数のビットを含むことができますが、この範囲外の幅をもつ値は処理できず、エラーとなります。なお、この上限は、65536バイトや64KBとも言い換えられます。
ほとんどのプログラミング言語には文字があり、その並べ方が規定されています。Vlrfsasmにおいても、いくらかの決まりがありますが、プログラミング言語では標準的なものが多く、簡単に理解できると思います。
Vlrfsasmでは、Unicodeの全ての文字を許容していますが、特別な意味をもつものはASCIIの範囲のみです。
- "$%()0123456789@[]{}
これ以外の文字、例えばZ、_、σ、じ、字、자などは自由に使って構いません。しかし、特に日本語の設定での入力中は、全角スペースを避けましょう。Vlrfsasmはこれと半角スペースとを区別しますが、見た目にはわからないので、バグを生みます。
どんな言語でも、1字では意味を全て区別できません。いくつかの字をまとめ、単語として解釈することになります。英語ならスペースで区切れば単語を切り出せます。Vlrfsasmにおいても、区切り文字と括弧、文字列リテラル標識とコメント標識で単語を分けます。前節の文字一覧を参照してください。また、英語であれば記号.や?は単語として認められませんが、Vlrfsasmでは認めます。そこで、Vlrfsasmでは、これらの意味のまとまりのことを「符」と呼ぶことにしています。
符はスペースや改行、かっこによって区切られます。
動くプログラムと読みやすいプログラムは違います。他の人が読む場合、あるいは未来の自分が読む場合を考えて、簡単なメモを残しておくと、生産性がとても上がります。もちろん、プログラム中に突然、日本語や英語で書くわけにはいきません。Vlrfsasmはこのための「コメント」という機能を持っています。コメント開始標識[からコメント終了標識]までは、符として解釈されません。
Vlrfsasmはデータを変換して出力するプログラムです。変換対象のデータを入力する方法は2つあります。一方がソースファイル内に記述するもので、リテラルと呼ばれます。もう一方の生ファイルについては、後の章で説明します。
リテラルはさらに2種類に分けられます。片方は数値をそのまま記述する「数値リテラル」です。Vlrfsasmのコード中で、数字または後述の基数接頭辞から始まる単語は、数値リテラルとして認識されます。
- 0123456789$%
数値リテラルによる値の幅は、リテラルの桁数などに関わらず、64ビットになります。これを超える長さの値を表したいときは、後述の結合関数や、生ファイルを使うことになります。
数値リテラルの途中には、-や_のような記号を含めることができます。長いリテラルの桁区切りに活用しましょう。
数値リテラルでは、以下のように3種類の基数が使えます。
基数 | 記数法 | 接頭辞 | 例1 | 例2 |
2 | 二進法 | % | %1011 | %01001110 |
10 | 十進法 | なし | 11 | 78 |
16 | 十六進法 | $ | $B | $4E |
どの表記でも、値は等しいので、記述時にわかりやすいもので書きましょう。
なお、負の数を表す接頭辞はありません。正の数を書いてから符号を反転させます。
ご存知の通り、文字列はビット列です。Vlrfsasmでは、文字コードをUnicodeに統一しており、符号化方式はUTF-16BEを標準として他の形式との変換機能を提供します。リテラルのもう一方はこの文字列で、やはりUTF-16BEのビット列として扱われます。幅は1文字につき16ビットで、サロゲートペアがあれば32ビットです。
文字列リテラルは、文字列を二重引用符"で囲うことで表します。例えば、"文字列A"は、幅が64ビットですから、$6587-5B57-5217-0041と書くのと同じことです。
さて、文字列は二重引用符で囲むと書きましたが、二重引用符を文字列に入れたい場合はどうすればよいのでしょうか。このとき、特殊な表記を用います。記号\に続く文字に、通常と異なる意味を持たせるのです。この記号には、バックスラッシュや円記号など、環境によって様々な表示揺れがあります。Vlrfsasmの作者は、これを文字コードの数値から「5C」と呼んでいます。
表記 | 解釈値 |
"\r" | $000D |
"\n" | $000A |
"\"" | $0022 |
"\\" | $005C |
これらは見た目上2字ですが、16ビットの値になります。
なお、文字列リテラルが複数行に渡る場合、改行コードは"\r\n"、つまり32ビットの値$000D000Aになります。