LÖVE (Love2D) LuaJIT言語編:2.字句

(2018.7.10. 公開)

 「字句」とは見慣れない言葉だが、プログラミング言語で「一定の意味を持つ文字の並びの最小単位」を表す。大まかに言えば「単語」に近いが、下に説明するように、もう少し広い意味を持つ。

2-1. 名前

 「名前」は、アルファベット・数字・アンダーバーを1つ以上組み合わせた文字列である。ただし、先頭の文字は半角数字であってはいけない。「名前」は、変数名・関数名・テーブルのフィールド名・goto ラベルなどに用いられる。

 以下の名前は、「予約語」である。これらは、Lua/LuaJIT 言語での役割が決まっているため、その他の目的で使うことはできない。

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

 Lua/LuaJIT では、大文字と小文字は区別される。and は予約語だが、And, AND, aNd などは予約語ではなく、通常の名前として使うことができる(紛らわしいのでお勧めはしない)。また、半角文字と全角文字も区別される。予約語はすべて半角文字である。

 Lua/LuaJIT では、名前を構成する「アルファベット」として、半角の英文字だけでなく、記号・数字でない任意の文字を使うことができる。ひらがな・カタカナ・漢字などを名前として使ってもよい。

2-2. 記号字句

 以下の記号、または記号の並びは、それぞれ1つの字句である。

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

2-3. 数値定数

 数値定数は、数字を並べたものである。途中に小数点が1個あってもよい。また、末尾に e または E に続けて符号のつかない整数値または負の整数値を書いてもよい。この「e◯◯またはE◯◯(◯◯は符号のつかない整数または負の整数)」記法は、その前の数値を「10の◯◯乗」倍することを示す。

1.53e4 = 1.53×104 = 15300

 16進数の数値定数は、0x または 0X に16進数の数字(0-9 の数字と a-f または A-F の英字)を並べたものである。途中に小数点が1個あってもよい(16進数の小数が使われることは稀だが)。

0x4a = 74
0x4a.3f = 74.24609375 (= 74 + 3/16 + 15/256)

 数値定数に含まれる文字は、すべて半角文字である。

2-4. 文字列定数

 文字列定数は、シングルクォート ' またはダブルクォート " で囲まれた文字の並びである。先頭と同じ種類のクォート、改行、バックスラッシュ \、およびゼロ文字(文字コード 0 で表される文字)以外は任意の文字を入れることができる。

 シングル(またはダブル)クォートで囲まれた文字列定数の中にバックスラッシュ \ があると、それは「エスケープシーケンス」の始まりを示す。エスケープシーケンスには、次のものがある。

シーケンス表す文字文字コード
\aベル7
\bバックスペース8
\f改ページ12
\n改行10
\r復帰13
\t水平タブ9
\v垂直タブ11
\\バックスラッシュ(または円記号)92
\"引用符(ダブルクォート)34
\'アポストロフィ(シングルクォート)39
\改行改行10
\ddd任意の8ビット文字
dddは最大3桁の10進数)(*)
ddd

(*) C言語では \ddd の数値エスケープシーケンスは8進数で表すが、Lua/LuaJIT では10進数で表す。

2-5. 長かっこを使った文字列定数

 複数行にまたがる文字列定数を、「長カッコ」を使って書くことができる。「開く長カッコ」は、2つの[ の間に0個以上の = を置いたものであり、「閉じる長カッコ」は、2つの ] の間に開く長かっこと同数の = を置いたものである。たとえば、「0段の長カッコ」は [[]] であり、「1段の長カッコ」は [=[]=] である。長カッコの間には、ゼロ文字と「閉じる長カッコ」以外の任意の文字を含めることができる。改行を含めてもよい。

 特例として、「開く長カッコ」の直後にある改行文字は、無視される。したがって、次の (1)(2) は同じ内容の文字列定数となる。

(1)  [[一行目
     二行目]]
(2)  [[
     一行目
     二行目]]

 なお、同じ内容の文字列定数をシングル(またはダブル)クォートとエスケープシーケンスを使って書くこともできる。

(3)  "一行目\n二行目"
(4)  "一行目\10二行目"
(5)  "一行目\
     二行目"

2-6. コメント

 コメントは、-- で始める。-- の直後に「開く長カッコ」があれば、対応する「閉じる長カッコ」までがコメントとなる。「開く長カッコ」がない場合は、行末までがコメントとなる。プログラムの実行の際には、コメントはすべて読み飛ばされる。

 コメントは、プログラムを作成した人の「意図」を書き残しておくために役に立つ。

2-7. 空白文字

 Lua/LuaJIT では、空白文字(半角スペース、タブ文字、改行)は構文上の意味を持っていない。つまり、空白は必要なときに好きなだけ書いてよい。この規則の例外となるのは、次の場合である。

2-7-1. 文字列定数とコメント

 文字列定数の中では、空白文字は書かれた通りの意味を持つ(つまり、空白文字1個の" " と空白文字2個の " " は異なる文字列である)。また、文字列定数・コメントの中での改行文字の解釈については、2-4, 2-5, 2-6 ですでに説明した。

2-7-2. 2つの字句を区切る空白文字

 2つの字句を続けて書くと別の字句と見なされる場合、それらを1個以上の空白文字で区切る必要がある。

  2<xandx<8        -- 'xandx' という名前になってしまう
  2<x and x<8      -- 空白を入れる
  2 < x and x < 8  -- もちろんこれでもよい
  (2<x)and(x<8)    -- こう書くのもあり

2-7-3. 関数呼び出しの左カッコ

 関数呼び出し(後述)の関数名(引数リスト) の間には、改行を入れてはいけない。

  print(x, y)  -- x, y を表示する
  print
  (x, y)  -- こう書いてはいけない

目次