2014年10月24日

Luaの文字列リテラル

Luaの文字列リテラルの字句構造についてのメモです。

Luaの文字列リテラルは対応するシングルクォートまたはダブルクォートで囲みます。
文字列リテラルの中には、以下のエスケープシーケンスを含むことができます。
それぞれ、対応するLuaのバージョンを示し、Lua 5.3については5.3(alpha)の時点のものとします。


制御文字 (Lua 5.1, 5.2, 5.3)


\a   -   bell、ベル
\b   -   backspace、後退
\f   -   form feed、改頁
\n   -   newline、改行
\r   -   carriage return、復帰
\t   -   horizontal tab、水平タブ
\v   -   virtical tab、垂直タブ
\\   -   back slash、バックスラッシュ
\"   -   double quote、引用符・ダブルクォート
\'   -   apostrophe (single quote)、アポストロフィ (シングルクォート)
\(実際の改行)   -   改行
\z   -   後続の改行を含むスペース文字をスキップします。

バイト値 10進数 (Lua 5.1, 5.2, 5.3)


\ddd   -   dddは最大3桁の10進数 (0〜255) で、後続に数字があるときは0を左詰めして3桁にします。

バイト値 16進数 (Lua 5.2, 5.3)


\xXX   -   XXは2桁の16進数 (00 〜 FF)。

Unicode (Lua 5.3)


\u{XXX}   -   XXXは1文字以上の16進数 (0〜10FFFF)。波括弧で囲む点に注意。内部ではUTF-8として扱われます。

長括弧 (Lua 5.1, 5.2, 5.3)


Luaの文字リテラルは長括弧 ( [[, ]] ) で囲むこともできます。
長括弧内ではエスケープシーケンスは無視され、改行は改行そのものとして扱われます。ただし、開き長括弧の直後の改行は無視されます。
レベル0長括弧 ( [[, ]] )、レベル1長括弧 ( [=[, ]=] ) 、さらにレベル2長括弧 ( [==[, ]==] )と角括弧に任意の個数の等号を加えた形式にすることもできますが、開き長括弧と閉じ長括弧のレベルは同じである必要があります。

Luaの文字列リテラルは単なるバイト列で文字コードに依存しませんが、Shift_JISなどの2バイト目が0x5C(バックスラッシュまたは円記号)となりうる文字コードではそれがエスケープシーケンスとして扱われてしまい問題となります。いわゆるダメ文字です。その場合、他の言語でもありがちですが以下のように2つ重ねることで文字そのものとすることができます。

print( "表\" )      --   Shift_JISにおける print( "\149\\" ) と同じ

長括弧がエスケープシーケンスを無視する性質であることを利用して以下のようにも記述できます。

print( [[表]] )

今日一般的によく使われると思われるUTF-8ではこのような考慮は不要です。
というわけで、Windows版ですが、文字列リテラルをUTF-8固定としてUnicode版の各種WindowsAPIやCランタイム関数を呼ぶようにパッチを当てたLuaの派生を作りました。CorvusSKKに組み込む目的で作りましたが、Luaの部分を抜き出した形で公開したものです。

lua-u8w
https://github.com/nathancorvussolis/lua-u8w

Lua 5.3のリリース版はまだかなと思っていたら先程ベータ版が出たようです。
http://www.lua.org/work/



【参照】

Lua 5.1 - Lexical Conventions
http://www.lua.org/manual/5.1/manual.html#2.1

Lua 5.2 - Lexical Conventions
http://www.lua.org/manual/5.2/manual.html#3.1

Lua 5.3(alpha) - Lexical Conventions
http://www.lua.org/work/doc/manual.html#3.1

0 件のコメント:

コメントを投稿