3.1 字句規則

Lua は自由形式 (free-form) の言語です。字句要素 (トークン) の間にあるスペースやコメントは無視され、まとめてトークンを区切る分離記号として解釈されます。Lua はソースコードに含まれる ASCII 空白文字 (スペース・フォームフィード・改行・キャリッジリターン・水平タブ・垂直タブ) を空白として認識します。

Lua における名前 (name) またの名を識別子 (identifier) とは、アルファベット・アラビア数字・アンダースコアからなる数字で始まらない文字列であって予約語でないものを言います。識別子は変数・テーブルフィールド・ラベルの名前に利用できます。

次のキーワード (keyword) は予約語であり、名前として使うことはできません:

and       break     do        else      elseif    end
false     for       function  goto      if        in
local     nil       not       or        repeat    return
then      true      until     while

Lua は大文字と小文字を区別します。例えば and は予約語ですが、AndAND は予約語ではなく、二つの異なる正当な名前を表します。慣習として、アンダースコアに大文字が続く名前 (_VERSION など) はプログラムで作成すべきでないとされます。

次の文字列は異なるトークンを表します:

+     -     *     /     %     ^     #
&     ~     |     <<    >>    //
==    ~=    <=    >=    <     >     =
(     )     {     }     [     ]     ::
;     :     ,     .     ..    ...

短文字列リテラル (short literal string) はペアとなるシングルクオートまたはダブルクオートによって囲まれる文字列です。短文字列リテラルでは次の C 風なエスケープシーケンスが利用できます:

バックスラッシュの直後に改行が続くと、それは文字列に含まれる改行となります。またエスケープシーケンス \z があると、Lua は以降の連続した空白文字 (改行含む) を無視します。長い文字列リテラルを改行とインデントを使って複数行に分けて書くときに \z を使えば文字列に改行やスペースを入れずに済むので特に便利です。短文字列リテラルにはエスケープされていない改行とエスケープシーケンスを構成しないエスケープ文字を含めることができません。

短文字列リテラルでは数値を使ってゼロを含む任意のバイトを表現できます。その方法はエスケープシーケンス \xXX を使うものであり、ここで XX はちょうど二桁の十六進数です。また \ddd というシーケンスを使っても同じことができ、ここでは ddd は最大三桁の十進数です (十進数を使うエスケープシーケンスの後に数字が続くときは必ず三桁の数字でシーケンスを表す必要があることに注意してください)。

UTF-8 でエンコードされた Unicode 文字を短文字列リテラル中に挿入するには、エスケープシーケンス \u{XXX} を使います (中カッコは省略できます)。ここで XXX は文字のコードポイントを表す一桁以上の十六進数であり、コードポイントには 231 より小さい任意の値を指定できます (Lua はオリジナルの UTF-8 仕様を採用しており、Unicode のコードポイントとして正当でない値も利用できます)。

文字列リテラルの定義には長括弧 (long bracket) を使った長いフォーマットを使うこともできます。レベル n の長括弧開き (opening long bracket of level n) は「角括弧開き・ n 個の同じ文字・角括弧開き」という文字列を言います。例えばレベル 0 の長括弧開きは [[ で、レベル 1 の長括弧開き (の一つ) は [=[ です。長括弧閉じも同様に定義され、例えばレベル 4 の長括弧閉じは ]====] と書きます。長文字列リテラル (long literal string) は任意のレベルの長括弧開きで始まり一番最初にある同じレベルの長括弧閉じで終わる文字列です。この中には同じレベルの長括弧閉じ以外の任意の文字列を含めることができます。長文字列リテラルは複数行に渡ることができ、エスケープシーケンスは一切解釈されず、他のレベルの長括弧は無視されます。あらゆる種類の改行シーケンス (キャリッジリターン, 改行文字, キャリッジリターンと改行文字, 改行文字とキャリッジリターン) は一つの改行文字に変換されます。また長括弧開きの直後に改行がある場合には、その改行は文字列に入りません。

文字列の例を示します。システムが ASCII コード (a が 97, 改行が 10, 1 が 49 で表される文字コード) を使うとすれば、次の五つの文字列リテラルは同じ文字列を表します:

a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"'
a = [[alo
123"]]
a = [==[
alo
123"]==]

文字列リテラルに含まれる文字でここまでに述べた規則で触れられていないものは全てそれ自身を表します。ただし Lua はパースするファイルをテキストモードで開くので、システムのファイル関数が制御文字の読み込みで問題を起こす可能性があります。そのためバイナリデータを扱うときはテキストでない文字を明示的にエスケープシーケンスで置き換えたクオート済みのリテラルを使った方が安全です。

数値定数 (numeric constant) またの名を数値 (numeral) には、省略可能な小数部分と省略可能な十進指数を付けることができます。十進指数は e または E で表します。Lua は 0x または 0X で始まる十六進定数も受け付けます。十六進定数には省略可能な小数部分と省略可能な二進指数を付けることができ、二進指数は p または P で表します。

小数部分と指数部分のいずれかを持つ数値定数は浮動小数点数を表します。そうでない数値定数では、十六進定数と値が整数に収まる十進定数は整数を表します。それ以外の場合 (つまりオーバーフローする十進整数定数) は浮動小数点数となります。小数部分と指数部分を持たない十六進定数は必ず整数を表し、オーバーフローした場合にはラップアラウンドして有効な整数値となります。

正当な整数定数の例を示します:

3   345   0xff   0xBEBADA

正当な浮動小数点数定数の例を示します:

3.0     3.1416     314.16e-2     0.31416E1     34e1
0x0.1E  0xA23p-4   0X1.921FB54442D18P+1

コメント (comment) は文字列中でない任意の場所にある二つのハイフン (--) で始まります。-- の直後が長括弧開きでないなら、そのコメントは短コメント (short comment) であり、行の終わりまで有効になります。そうでなく -- の直後が長括弧開きなら、そのコメントは長コメント (long comment) であり、対応する長括弧閉じまで有効になります。