このページの内容

3 – 言語

この節では、Luaの字句、構文、意味論について説明する。言い換えると、有効なトークン、それらを組み合わせる方法、およびその組み合わせが持つ意味を説明する。

言語構造の説明には通常の拡張BNF表記を使用する。{a}は0個以上のaを、[a]は省略可能なaを意味する。非終端記号はnon-terminalのように、キーワードはkwordのように、その他の終端記号は‘=’のように示す。Luaの完全な構文は、このマニュアル末尾の§9にある。

3.1 – 字句規則

Luaは自由形式の言語である。2つのトークンを区切る場合を除き、字句要素(トークン)間の空白とコメントを無視する。ソースコードでは、標準ASCII空白文字であるスペース、フォームフィード、改行、キャリッジリターン、水平タブ、垂直タブを空白として認識する。

Luaの名前識別子とも呼ばれる)は、ラテン文字、アラビア・インド数字、アンダースコアからなる任意の文字列にできる。ただし、数字で始めることはできず、予約語と同じにすることもできない。識別子は、変数、テーブルフィールド、ラベルの名前に使用する。

次のキーワードは予約されており、名前として使用できない。

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

Luaでは大文字と小文字が区別される。andは予約語だが、AndANDは互いに異なる有効な名前である。慣例として、アンダースコアの後に1文字以上の大文字が続く名前(_VERSIONなど)をプログラムで作成することは避けるべきである。

次の文字列は、その他のトークンを表す。

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

短いリテラル文字列は、対応する一重引用符または二重引用符で囲むことができ、次のC形式のエスケープシーケンスを含められる。‘\a’(ベル)、‘\b’(バックスペース)、‘\f’(フォームフィード)、‘\n’(改行)、‘\r’(キャリッジリターン)、‘\t’(水平タブ)、‘\v’(垂直タブ)、‘\\’(バックスラッシュ)、‘\"’(引用符[二重引用符])、‘\'’(アポストロフィ[一重引用符])。バックスラッシュの直後に改行があると、文字列内では改行となる。エスケープシーケンス’\z’は、その後に続く改行を含む一連の空白文字を読み飛ばす。これは、文字列内容へ改行や空白を追加せずに、長いリテラル文字列を複数行へ分割してインデントする場合に特に便利である。短いリテラル文字列には、エスケープされていない改行や、有効なエスケープシーケンスを形成しないエスケープを含められない。

短いリテラル文字列では、埋め込まれたゼロを含む任意のバイトを、その数値で指定できる。正確に2桁の16進数字XXを持つエスケープシーケンス\xXX、または最大3桁の10進数字dddを持つエスケープシーケンス\dddを使用する。(10進エスケープシーケンスの直後に数字を続ける場合は、正確に3桁で表現しなければならないことに注意すること。)

Unicode文字のUTF-8エンコーディングは、エスケープシーケンス\u{XXX}(波括弧は必須)を使用してリテラル文字列へ挿入できる。XXXは、その文字のコードポイントを表す1桁以上の16進数字である。このコードポイントには、*231*未満の任意の値を指定できる。(ここでLuaは、有効なUnicodeコードポイントだけに制限されない、元のUTF-8仕様を使用する。)

リテラル文字列は、長い括弧で囲む長い形式でも定義できる。レベルnの開始長括弧を、開き角括弧、n個の等号、もう1つの開き角括弧からなるものとして定義する。したがって、レベル0の開始長括弧は[[、レベル1は[=[と記述し、以下同様である。終了長括弧も同様に定義する。たとえば、レベル4の終了長括弧は]====]と記述する。長いリテラルは任意のレベルの開始長括弧で始まり、同じレベルで最初に現れる終了長括弧で終わる。同じレベルの終了括弧を除く任意のテキストを含められる。この括弧形式のリテラルは複数行にわたることができ、エスケープシーケンスを解釈せず、他のレベルの長い括弧を無視する。あらゆる行末シーケンス(キャリッジリターン、改行、キャリッジリターンに続く改行、改行に続くキャリッジリターン)は、単一の改行へ変換される。開始長括弧の直後に改行がある場合、その改行は文字列へ含まれない。

例として、ASCIIを使用するシステム(‘a’が97、改行が10、‘1’が49として符号化される)では、次の5つのリテラル文字列が同じ文字列を表す。

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

前述の規則による明示的な影響を受けないリテラル文字列内のバイトは、それ自体を表す。ただし、Luaは解析対象のファイルをテキストモードで開くため、システムのファイル関数が一部の制御文字を扱えない場合がある。したがって、バイナリーデータは、テキストでない文字を明示的なエスケープシーケンスにした引用符付きリテラルで表す方が安全である。

数値定数(または数値リテラル)は、省略可能な小数部と、文字’e’または’E’で示す省略可能な10進指数を付けて記述できる。Luaは、0xまたは0Xで始まる16進定数も受け付ける。16進定数にも、省略可能な小数部と、文字’p’または’P’で示し10進数で記述する省略可能な2進指数を指定できる。(たとえば0x1.fp10は、0x1f / 16に*210*を乗じた1984を表す。)

基数点または指数を持つ数値定数は浮動小数点数を表す。それ以外の場合、値が整数に収まるか16進定数なら整数を表し、そうでなければ(すなわちオーバーフローする10進整数リテラルなら)浮動小数点数を表す。基数点も指数も持たない16進数値リテラルは常に整数値を表す。値がオーバーフローする場合は、有効な整数へ収まるようラップアラウンドする。

有効な整数定数の例を次に示す。

     3   345   0xff   0xBEBADA

有効な浮動小数点定数の例を次に示す。

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

コメントは、文字列の外部にある2つのハイフン(--)で始まる。--の直後のテキストが開始長括弧でない場合、そのコメントは行末まで続く短いコメントとなる。それ以外の場合は、対応する終了長括弧まで続く長いコメントとなる。