スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

LuaのプログラムでUnicodeの識別子・演算子を使う (Yueliang+ICU4Lua使用)

Yueliangという、LuaによるLuaのコンパイラの実装がある。この字句解析の部分でICU4Luaを使えば、Unicode識別子に容易に対応出来るのではないか。というわけでやってみた。つーかこれをやるためにICU4Luaを入れた。

やったこと

  • ファイルの先頭でlocal string=require "icu.utf8"
  • #strstring.len(str)に置き換える
  • string.findで使っているパターンを少し書き換え(e.g. "%a"→"%!a")

こんなコードが書けるようになった:

-- test.lua
あいうえお = "かきくけこ"
print(あいうえお)
math.π = math.pi
local α,β = math.π+1,math.π-1
print(α×β)
 -- ←全角空白
if あいうえお≠"ほげほげ" then
  print(あいうえお)
end
if math.π≥3 then
 print("π≥3")
end
if math.π≤3 then
 print("π≤3")
end

Metaluaで同じことをすればUnicodeの演算子を活かせると思う。

以下Yueliangへのパッチ。

diff yueliang-0.4.1/orig-5.1.3/llex.lua yueliang-0.4.1-icu/orig-5.1.3/llex.lua
69a70,71
> local string = require "icu.utf8"
> 
179,180c181,182
<       bufflen = bufflen - #" '...' "
<       local l = #source
---
>       bufflen = bufflen - string.len(" '...' ")
>       local l = string.len(source)
189,190c191,192
<       len = len and (len - 1) or #source
<       bufflen = bufflen - #(" [string \"...\"] ")
---
>       len = len and (len - 1) or string.len(source)
>       bufflen = bufflen - string.len(" [string \"...\"] ")
193c195
<       if len < #source then  -- must truncate?
---
>       if len < string.len(source) then  -- must truncate?
358c360
<   --if #buff > self.MAX_SIZET then
---
>   --if string.len(buff) > self.MAX_SIZET then
406c408
<   for p = 1, #buff do
---
>   for p = 1, string.len(buff) do
661a664,678
>     elseif c == "≤" then
>       self:nextc(ls); return "TK_LE"
>     ----------------------------------------------------------------
>     elseif c == "≥" then
>       self:nextc(ls); return "TK_GE"
>     ----------------------------------------------------------------
>     elseif c == "≠" then
>       self:nextc(ls); return "TK_NE"
>     ----------------------------------------------------------------
>     elseif c == "×" then
>       self:nextc(ls); return "*"
>     ----------------------------------------------------------------
>     elseif c == "÷" then
>       self:nextc(ls); return "/"
>     ----------------------------------------------------------------
663c680
<       if string.find(c, "%s") then
---
>       if string.find(c, "%!s") then
669c686
<       elseif string.find(c, "[_%a]") then
---
>       elseif string.find(c, "[_%!a]") then
673c690
<         until c == "EOZ" or not string.find(c, "[_%w]")
---
>         until c == "EOZ" or not string.find(c, "[_%!w]")
diff yueliang-0.4.1/orig-5.1.3/lzio.lua yueliang-0.4.1-icu/orig-5.1.3/lzio.lua
44a45,46
> local string = require "icu.utf8"
> 
109c111
<   z.n, z.p = #buff - 1, 1
---
>   z.n, z.p = string.len(buff) - 1, 1
Common subdirectories: yueliang-0.4.1/orig-5.1.3/test and yueliang-0.4.1-icu/orig-5.1.3/test
スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。