1. 程式人生 > >【小技巧】如何修改 Lua 5.1 的引擎,讓Lua支援中文變數名、混合變數名

【小技巧】如何修改 Lua 5.1 的引擎,讓Lua支援中文變數名、混合變數名

最近在倒騰 Lua 指令碼引擎。Lua 現在廣泛用於各種遊戲、PSP中,速度極快,與 C++ 宿主程式碼“相處”能力強,還有第三方增強工程如 LuaPlus, LuaBind 等的支援,筆者正是在使用 LuaPlus 這個不錯的 Lua C++ 封裝,內建 Lua 5.1 引擎。Lua 本身不能支援中文變數名或函式名,作為想盡善盡美的支援指令碼的軟體來說,當然不爽啦。從網上搜到了一些程式碼,能夠修改老版本的 Lua 核心使得 Lua 支援中文變數名,如:價格=45 之類,但 Lua 5.1 的核心程式碼已經略有不同了。當然只要稍微作些改動,就能讓 Lua 5.1 乖乖的也認識起中文變數名、函式名來。以 LuaPlus 為例(Visual Studio 2005 IDE環境下):1. 找到 LuaPlus 工程下的 Lua Source Files 下的 llex.c;2. 在該檔案中找到下面所列函式;
  1. staticint llex (LexState *ls, SemInfo *seminfo)
3. 這是 Lua 的語法分析模組的關鍵函式,它由一長段 switch 構成,在一串 case 後找到 default 分支
4. 在該分支下找到如下程式碼段,這是一段完整的 if 分支,該程式碼段負責將符合條件的字元組合識別為 identifier (函式名或變數名)或 keyword (關鍵字)
  1. else
    if (isalpha(ls->current) || ls->current == '_') {
  2. /* identifier or reserved word */
  3.           TString *ts;
  4. if (ls->current == 'L') {
  5.             next(ls);
  6. if (ls->current == '"' || ls->current == '/'') {
  7.               read_wstring(ls, ls->current, seminfo);
  8. return TK_WSTRING;
  9.             }
  10.             save(ls, 
    'L');
  11.           }
  12. /* identifier or reserved word */
  13. do {
  14.             save_and_next(ls);
  15.           } while (isalnum(ls->current) || ls->current == '_');
  16.           ts = luaX_newstring(ls, luaZ_buffer(ls->buff),
  17.                                   luaZ_bufflen(ls->buff));
  18. if (ts->tsv.reserved > 0)  
    /* reserved word? */
  19. return ts->tsv.reserved - 1 + FIRST_RESERVED;
  20. else {
  21.             seminfo->ts = ts;
  22. return TK_NAME;
  23.           }
  24.         }

5. 將該段替換為下面這一段即可,其作用在於加入了對中文ASCII字元的識別
  1. elseif (isalpha(ls->current) || ls->current == '_' || ls->current > 0x80) {
  2. /* identifier or reserved word */
  3.           TString *ts;
  4. if (ls->current == 'L') {
  5.             next(ls);
  6. if (ls->current == '"' || ls->current == '/'') {
  7.               read_wstring(ls, ls->current, seminfo);
  8. return TK_WSTRING;
  9.             }
  10.             save(ls, 'L');
  11.           }
  12. /* identifier or reserved word */
  13. do {
  14. if(ls->current > 0x80)
  15.               {
  16.                  save_and_next(ls);
  17.                  save_and_next(ls);
  18.               }
  19. else
  20.                  save_and_next(ls);
  21.           } while (isalnum(ls->current) || ls->current == '_' || ls->current > 0x80);
  22.           ts = luaX_newstring(ls, luaZ_buffer(ls->buff),
  23.                                   luaZ_bufflen(ls->buff));
  24. if (ts->tsv.reserved > 0)  /* reserved word? */
  25. return ts->tsv.reserved - 1 + FIRST_RESERVED;
  26. else {
  27.             seminfo->ts = ts;
  28. return TK_NAME;
  29.           }
  30.         }

相關推薦

技巧如何修改 Lua 5.1引擎Lua支援中文變數混合變數

最近在倒騰 Lua 指令碼引擎。Lua 現在廣泛用於各種遊戲、PSP中,速度極快,與 C++ 宿主程式碼“相處”能力強,還有第三方增強工程如 LuaPlus, LuaBind 等的支援,筆者正是在使用 LuaPlus 這個不錯的 Lua C++ 封裝,內建 Lua 5.1 引

技巧之 python批量修改指定檔案型別的檔名

在工作學習當中,常常遇到要批量修改我檔名情況,要是一個一個的去重新命名,不是程式猿所為,今天分享一個批量修改檔名的方法,供大家參考: 例如下圖,在我的某一個資料夾下,又n個亂七八糟的“.txt”檔案,將這些檔案批量修改名稱。 直接上程式碼: import os files = os

技巧電腦開機自動關閉數字鍵盤方法

開機自動關閉數字小鍵盤方法開機自動關閉數字小鍵盤方法:在〔開始〕點擊{運行〕輸入〔Regedit〕選擇{HKEY_USERS〕→選擇〔.Default〕 →選擇〔Control Panel〕→選擇〔Keyboard〕→將數值名稱〔InitialKeyboardIndicators〕資料值更改為〔0〕順道來腦補

技巧Eclipse 中創建Maven項目後沒有WEB-INF文件夾以及web.xml文件

出現 可能 pan 3.0 開始 自動創建 TP 應該 xml文件 懶得截圖了,一張圖配下面步驟搞定。 1、右鍵項目,選擇propertities後選擇圖中①(被遮住了); 2、先不②勾選去掉,點擊Apply;然後在把②處勾選上。此時④位置會出現東東,點擊藍色超鏈接。填入

技巧某個網頁打不開怎麼辦?

最近電腦也不知道是怎麼了,突然就開始“挑剔”起來,有的網頁能開啟,有的網頁死活打不開!不知道小夥伴們有沒有遇到這種情況啊?一開始還以為是網路有問題,要麼是網斷了,要麼是網速太慢,於是各種檢查自己的網路

技巧限制windows server 2008的最大使用者登入數

把雲伺服器單純當作自己一個雲端主機的人大有人在。本人就是其中一位。 由於windows server 2008的會話保持機制,導致你關閉掉當前遠端桌面連線,並從另外一臺電腦上開啟遠端連線之後,另外一臺電腦預設並不會進入你之前的桌面,反而會重新再開一個賬戶 反正Windows server是多使用者作業系統

技巧無法連線到安全檢查代理伺服器,套接字建立失敗

        前幾天上網的時候,電腦出現了一些問題,連不上網,之前電腦還好好的,怎麼突然就上不去網了? 問題:         用的是學校的INODE客戶端,以為是配置出現了問題,進行了各種檢查

技巧文字編輯器Notepad++(v6.9)中Tab設定成4個空格

    Notepad++ 作為很順手的文字編輯器被程式猿廣泛運用。     養成良好的程式碼習慣,先從縮排標準4空格開始。     版本為6.9.2     流程:     設定—首選項—製表符

技巧Win10主機和Ubuntu虛擬機器/伺服器的檔案傳輸

       每次我們在伺服器或者虛擬機器編譯完程式碼,需要傳輸映象檔案回主機,最開始一直採用資料夾介面虛擬機器拖拽,或者FilZilla,         或者WinScap i 這些都只需要圖形化

技巧當對服務器做大負荷操作如何禁止普通用戶登錄

etc tro 我們 ron 希望 普通用戶 就是 png 看到了 日常運維中當我們在對服務器(root用戶)做大負荷操作時(占用系統資源較大),不希望普通用戶來登錄服務器進行其他操作,該怎麽做呢? 接下來就是見證奇跡的時刻(圖片中左側為root用戶,右側為普通用戶登錄測試

Day22 程序Credit Card(ATM)購物程序調用信用卡程序接口支付

logger nts 實現 管理 加載 相關 actions bin 目錄 程序介紹:   實現信用卡(ATM)常用功能:(支持多賬戶登陸)1.取款;2.還款;3.轉賬;4.查詢余額;5.查詢賬單(流水,支持按年月日時分秒記錄); 程序結構:ATM/├── README├─

重大更新IntelliJ IDEA v2017.1釋出功能大量更新先睹為快!|附下載

IntelliJ IDEA v2017.1到來!功能大量更新!本次更新圖文較多,部分功能詳細內容請點選文章末尾連結詳細檢視! Java java9支援(檢視詳情)java8功能改進升級至JUnit 5檢查egexp語法高亮顯示 JVM偵錯程式 Async異常堆疊更新

外貿技巧玩轉LinkedIn領英我的外貿開發客戶利器

作者:Aimm 職業:外貿SOHO(媽媽) 感言:十年外貿路,那些經歷,無論好的壞的,都是最美的風景 來源:米課(imiker) ** 我們要成長為一名自救型外貿人 ** 前幾天看到女神@紀三歲的一篇文章:《如何打造外貿業務的個人IP?》,讀完頗有感觸,雖

程式17 題目:輸入一行字元分別統計出其中英文字母空格數字和其它字元的個數

注意 c >= 'a'&&c <= 'z' 與 'a' <= c <= 'z' 並不相同 運算子根據自左向右的結合行 先運算'a' <= c 值為1 or 0 然後再與‘z’比較 #define _CRT_SECURE_NO_WARNINGS

程式7 題目:輸入一行字元分別統計出其中英文字母空格數字和其它字元的個數。

/* 2017年3月2日16:47:24 java基礎50道經典練習題 例7 Author:ZJY(&&) Purpose:對字串的資料的型別計數

sql技巧mysql修改動態指定要修改的字段 update `table` set (case when ....) = 1 where id = xx

幫助 ase stack pan 希望 需求 記錄 開始 lec 如果你點進了這篇帖子,那麽你一定遇到了跟我一樣的問題。別看題目的set case when...,我一開始也是第一反應是用case when但是發現並不好使。 問題呢,說得高大上一點:動態指定要修改的字段。

技巧CSS文字兩端對齊

兩個 isp images inline clas 我們 寬度 filter pre 需求如下,紅框所在的文字有四個字的、三個字的、兩個字的,如果不兩端對齊可以選擇居中對齊,或者右對齊。但是如果要像下面這樣兩端對齊呢? 我相信以前很多人都這麽幹過:兩個字中間使用 來隔開達

iOS UIKit-UIPageControl利用delegate定位圓點位置 之 四舍五入技巧

優化 距離 scroll current control 水平 技術 觸發 src 在UIScrollView中會加入UIPageControl作為頁碼標識,能夠讓用戶清楚的知道當前的頁數。我們須要優化的一點是讓pageControl

生活技巧存放衣物防皺的妙招

由於 有趣 body 產生 活動 下滑 最好的 AR target 生活中知道一些生活小技巧,不但可以節約時間,還可以更快的做好生活中的鎖事,讓生活效率大大提高,也讓生活更有情調,生活更有趣味,在這裏意空間主編把42個超實用的生活小技巧與妙招分享給大家。  1、毛巾發粘有怪

純幹貨技巧遺忘MySQL用戶密碼怎麽辦?

set change 情況 社會 驗證 停止 top skip 希望 遺忘MySQL用戶密碼怎麽辦? 在信息化社會,充分有效地管理和利用各類信息資源,是進行科學研究和決策管理的前提條件。數據庫技術是管理信息系統、辦公自動化系統、決策支持系統等各類信息系統的核心部分,是進行科