1. 程式人生 > >lua 5.1語法約定

lua 5.1語法約定

Lua 5.1參考手冊

由羅伯特·Ierusalimschy路易斯Henrique de Figueiredo沃爾德蔡氏

‚一個版權©2006 A¢A€“2012 Lua.org,銀行業者。免費的根據Lua許可證

1 A¢A€“介紹

Lua是一個擴充套件程式語言設計的支援一般程序式程式設計與資料描述設施。它還提供了很好的支援面向物件程式設計,函數語言程式設計,資料驅動的程式設計。Lua是打算作為一個強大的、輕量級的對任何程式,需要一個指令碼語言。Lua是實現為一個庫,編寫的清潔C(也就是說,在共同的子集ANSIA‚C和c++)。

作為一個擴充套件語言,Lua沒有概念的“主要”計劃:它只工作

嵌入式在客戶端,被稱為嵌入程式或者簡單地主機。這個主程式可以呼叫函式來執行一個Lua程式碼,可以寫和讀Lua變數,和CA‚可以註冊一個函式呼叫Lua程式碼。通過使用CA‚功能,Lua可以增強應對各種不同的領域,因此建立定製程式語言共享一個語法框架。Lua分佈包含一個示例主程式呼叫lua,它使用Lua庫提供一個完整的、獨立的Lua直譯器。

Lua是免費軟體,像往常一樣沒有提供擔保,如上所述的許可證。本手冊中所描述的實現在Lua的官方網站,www.lua.org

像任何其他參考手冊,本文件是乾燥的地方。討論決定的背後Lua的設計,在Lua看到可用的技術論文的網站。的詳細介紹在Lua程式設計,看到羅伯特的書,

在Lua程式設計(第二版)

2 A¢A€“的語言

本節描述的詞彙、語法和語義的Lua。換句話說,本節描述令牌是有效的,他們如何可以組合,和他們的組合的意思。

語言結構將解釋使用通常的擴充套件的BNF符號,在這{一個}一個意味著‚‚0或更多一個的年代,(一個‚一個可選的一種手段一個。非終結符顯示非終結符,關鍵字如所示kword,和其他終端符號顯示“=‚´。Lua中可以找到的完整語法‚§8在本手冊的結束。

¢A€2.1”詞法約定

的名字(也稱為識別符號)在Lua中可以是任何字串的信件,數字和下劃線,沒有一個數字開始。這個名字在大多數語言的定義是一致的。(字母的定義取決於當前語言環境:任何字元是字母由當前的語言環境可以使用一個識別符號)。識別符號用於變數和表字段名稱。

以下關鍵字保留和不能使用的名字:

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

Lua是一個區分大小寫的語言:是一個保留字,但是兩個不同的有效名稱。作為一個慣例,之後下劃線開頭的名稱大寫字母(如_VERSION)是留給內部Lua使用的全域性變數。

以下字串表示其他標記:

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

字串字面量可以被匹配的單引號或雙引號分隔,並可以包含以下c轉義序列:”、一個'(貝爾)”\ b”(退格),”\ f(換頁),”\ n(換行),”r \'(回車)”\ t”(水平選項卡),”v \”(垂直製表符),”\ \”(反斜槓),”\””(引號(雙引號)),和“\ '撇號(單引號)。此外,一個反斜槓緊隨其後的是一個真正的換行符結果在一個換行符的字串。一個字元在字串也可以指定的數值使用轉義序列\ddd,在哪裡ddd是一個序列的三個小數位數。(注意,如果一個數值逃脫,後跟一個數字,它必須使用完全表達了三位數)。在Lua字串可以包含任何8位值,包括嵌入式零,可以指定為“\ 0”。

字串也可以使用很長一段定義格式包圍長支架。我們定義一個開啟長支架的水平n作為一個開放方括號緊隨其後n平等其次是另一個跡象方括號。所以,開放長支架levelA‚寫成一個0[[,開放長支架levelA‚寫成1(=(,等等。一個關閉長支架類似的定義;例如,關閉長支架levelA‚寫成4)= = = =)。一個長字串從一個開放和支架的水平結束於第一次關閉長支架的同一水平。文字在這個括號形式可以執行幾行,不解釋任何轉義序列,而忽略長支架的其他級別。它們可以包含除了括號的適當水平。

為了方便起見,當開啟長支架立即後跟換行,不包括換行符的字串。作為一個例子,在一個系統使用ASCII(“一個編碼asA‚97,換行符編碼asA‚10,1是編碼asA‚49),下面的五個字串表示相同的字串:

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

一個數值常數和一個可選的小數部分可以寫嗎和一個可選的十進位制指數。Lua還接受整數16進位制的常量,通過加上字首0 x。有效的數值常量的例子

     3   3.0   3.1416   314.16e-2   0.31416E1   0xff   0x56

一個評論開始於一個雙連字元(- - -)以外的任何一個字串。如果文字後立即- - -不是一個開放長支架,評論是一種簡短的評論,執行,直到行結束。否則,這是一個長時間的評論,執行,直到相應的關閉長支架。長評論常用暫時禁用程式碼。

¢A€2.2”值和型別

Lua是一個動態型別語言。這意味著變數沒有型別,只有價值觀。沒有型別定義語言。攜帶自己的所有值型別。

在Lua中所有值一流的值。這意味著所有的值都可以儲存在變數中,作為引數傳遞給其他函式,作為結果返回。

在Lua中有八個基本型別:,布林,數量,字串,函式,使用者資料,執行緒,值的型別嗎,其主要屬性是不同於任何其他值;它通常代表缺乏有用的價值。布林值的型別嗎真正的。這兩個使條件錯誤;任何其他值使它正確。數量代表真正的雙精度浮點數字。(很容易構建使用其他的Lua直譯器內部表示的數字,如單精度浮點數或長整數;看到檔案luaconf.h)。字串表示的字元陣列。Lua是8位清潔:字串可以包含任何8位字元,包括嵌入式零('\ 0”)(見‚§2.1)。

Lua可以呼叫函式用Lua編寫和(和操作)用C編寫的函式(見一個‚§2.5.8)。

型別使用者資料允許任意的CA‚資料提供嗎被儲存在Lua變數。這種型別對應於原始記憶體塊在Lua中,沒有預定義的業務,除了任務和身份測試。但是,通過使用元表,程式設計師可以定義使用者資料值的操作(見‚§2.8)。在Lua中不能建立或修改使用者資料值,只有通過CA‚API。這保證資料由主機程式的完整性。

型別執行緒代表獨立執行緒的執行用於實現協同程式(見‚§2.11)。不要混淆Lua與作業系統執行緒的執行緒。Lua支援協同程式在所有系統上,即使是那些不支援執行緒。

型別實現關聯陣列,即陣列可以被索引不僅與數字,但任何值(除了)。表可以異構;也就是說,它們可以包含所有型別的值(除了)。表是唯一在Lua中資料組織機制;它們可以用來代表普通陣列,符號表、設定、記錄、圖形、樹木等。代表記錄,Lua使用欄位名作為索引。支援這種語言表示提供a.name作為語法糖(“名稱”)。有幾個在Lua中方便的方法來建立表(見一個‚§2.5.7)。

等指標,一個表字段的值可以是任何型別(除了)。特別是,因為功能一流的價值觀,表字段可以包含函式。因此表可以攜帶方法(見一個‚§2.5.9)。

表、函式、執行緒和使用者資料值(完整)物件:變數實際上並沒有包含這些值,只有引用給他們。賦值、引數傳遞和函式返回總是操作引用這樣的價值觀;這些操作並不意味著任何型別的副本。

的庫函式型別返回一個字串描述型別一個給定的值。

2.2.1¢A€“強迫

Lua之間提供了自動轉換字串和數字值在執行時。任何試圖把算術運算應用到一個字串後一個數字,這個字串通常的轉換規則。相反,當一個數字預計使用一個字串,數字轉換為字串,在一個合理的格式。為完全控制數字轉換為字串,使用格式從字串庫函式(見string.format)。

¢A€2.3”變數

變數是儲存值的地方。有三種變數在Lua中:全域性變數,區域性變數,和表字段。

一個名字可以表示全域性變數和區域性變數(或一個函式的形式引數,這是一種特殊的區域性變數):

	var ::= Name

名字表示識別符號,如中定義‚§2.1

任何變數被認為是全球性的,除非顯式宣告作為一個本地(見一個‚§2.4.7)。區域性變數在詞法上確定範圍:區域性變數可以自由訪問功能在他們的範圍(見定義‚§2.6)。

之前第一次賦值給一個變數,它的值是多少

使用方括號索引表:

	var ::= prefixexp `[´ exp `]´

訪問全域性變數的意義通過元表和表字段可以更改。一個訪問索引變數t[我]相當於一個電話gettable_event(t,我)。(見‚§2.8的完整描述gettable_event函式。這個函式沒有定義或呼叫Lua。我們在這裡使用它僅用於說明的目的。)

的語法var.Name只是語法糖var(“名稱”):

	var ::= prefixexp `.´ Name

全域性變數一樣生活所有欄位在普通Lua表,被稱為環境表或者簡單地環境(見‚§2.9)。每個函式都有自己的引用一個環境,所以這個函式所有的全域性變數將引用這個環境表。建立一個函式時,它繼承了環境建立它的功能。環境一個Lua函式表,你叫getfenv。來代替它,你叫setfenv。(你只能操作環境的CA‚功能通過除錯庫;(見‚§5.9))。

一個全域性變數的訪問x相當於_env.x,進而相當於嗎

     gettable_event(_env, "x")

在哪裡_env環境的執行功能。(見‚§2.8的完整描述gettable_event函式。這個函式沒有定義或呼叫Lua。類似地,_env在Lua變數沒有定義。我們在這裡使用它們僅用於說明的目的。)

¢A€2.4”語句

Lua支援一組幾乎傳統的語句,類似Pascal和C。這組包括作業,控制結構,函式呼叫,和變數宣告。

2.4.1¢A€“

Lua稱為的執行單位。一塊是一個簡單的語句序列,順序執行。每個語句可以選擇由分號結尾:

	chunk ::= {stat [`;´]}

沒有空語句,因此“;;”是不合法的。

Lua處理一塊作為一個匿名函式的身體具有數量可變的引數(見一個‚§2.5.9)。因此,塊可以定義區域性變數,接收引數和返回值。

一塊可以儲存在一個檔案或一個字串在主程式。執行一個塊,第一次預編譯Lua塊為一個虛擬機器指令,然後執行編譯後的程式碼虛擬機器的譯員。

塊也可以預編譯成二進位制形式;看到程式luac獲取詳細資訊。專案原始碼和編譯的形式是可以互換的。Lua自動檢測的檔案型別和相應的行為。

2.4.2¢A€“

塊語句的列表;語法,一塊一塊是一樣的:

	block ::= chunk

一塊可以明確分隔出一個宣告:

	stat ::= do block end

明確的塊是有用的控制變數宣告的範圍。有時也用來明確的塊新增一個返回打破宣告在中間另一個塊(見‚§2.4.4)。

2.4.3¢A€“賦值

Lua允許多個作業。因此,語法任務定義了一個變數在左邊的列表和右邊表示式的列表。兩個列表中的元素之間用逗號分隔:

	stat ::= varlist `=´ explist
	varlist ::= var {`,´ var}
	explist ::= exp {`,´ exp}

表示式討論了‚§2.5

在作業之前,值的列表調整的長度變數的列表。如果有比所需值,扔掉多餘的值。如果有更少的比所需值,與儘可能多的擴充套件列表根據需要的。如果表示式的列表以一個函式呼叫,然後呼叫返回的所有值輸入值的列表,調整前的(除了當呼叫被括在括號裡,看到的‚§2.5)。

賦值語句首先評估它的表示式也只有到那時正在執行的作業。因此,程式碼

     i = 3
     i, a[i] = i+1, 20

一個[3]20日,在不影響一個[4]因為(我)評價(3)之前assignedA‚4。同樣,行

     x, y = y, x

交流的值xy,和

     x, y, z = y, z, x

週期性排列的值x,y,z

分配給全域性變數的意義通過元表和表字段可以更改。一個索引變數賦值t[我]=瓦爾相當於settable_event(t,我,val)。(見‚§2.8的完整描述settable_event函式。這個函式沒有定義或呼叫Lua。我們在這裡使用它僅用於說明的目的。)

一個全域性變數的賦值x =瓦爾相當於賦值_env。 x =瓦爾,進而相當於嗎

     settable_event(_env, "x", val)

在哪裡_env環境的執行功能。(_env在Lua變數沒有定義。我們在這裡使用它僅用於說明的目的。)

2.4.4¢A€“控制結構

控制結構如果,,重複通常的意義和嗎熟悉的語法:

	stat ::= while exp do block end
	stat ::= repeat block until exp
	stat ::= if exp then block {elseif exp then block} [else block] end

Lua也有一個語句,在兩種一個‚§2.4.5)。

條件表示式的控制結構可以返回任何值。這兩個被認為是錯誤的。所有的值不同被認為是真的(尤其是數字0和空字串也是如此)。

重複¢A€“直到迴圈,內部塊不會結束的直到關鍵字,但只有在條件。所以,條件可以參考本地變數宣佈在迴圈塊。

返回語句用於返回值從一個函式或一塊(也就是一個函式)。功能塊可以返回多個值,所以的語法返回語句是

	stat ::= return [explist]

打破語句用於終止執行,重複,或迴圈,跳轉到下一個語句後迴圈:

	stat ::= break

一個打破最裡面的封閉迴圈結束。

返回打破語句只能寫成的去年語句塊。如果確有必要返回打破在一塊,然後可以使用顯式內塊,的成語做返回結束做休息結束,因為現在返回打破最後一個語句嗎(內部)塊。

2.4.5¢A€“For語句

宣告有兩種形式:一個數字和一個通用的。

數字迴圈重複的程式碼塊,而控制變數貫穿一個等差數列。它有以下語法:

	stat ::= for Name `=´ exp `,´ exp [`,´ exp] do block end

是重複的的名字開始的價值第一個經驗值第二,直到通過經驗值的步驟第三經驗值。更準確地說,一個語句

     for v = e1, e2, e3 do block end

相當於程式碼:

     do
       local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3)
       if not (var and limit and step) then error() end
       while (step > 0 and var <= limit) or (step <= 0 and var >= limit) do
         local v = var
         block
         var = var + step
       end
     end

請注意以下幾點:

  • 這三個控制表示式只計算一次,在迴圈開始之前。他們必須所有導致數字。
  • var,限制,一步是看不見的變數。這裡顯示的名字僅用於說明的目的。
  • 如果表示式(第三步)缺席,然後使用步驟‚一個1。
  • 您可以使用

    相關推薦

    lua 5.1語法約定

    Lua 5.1參考手冊 由羅伯特·Ierusalimschy路易斯Henrique de Figueiredo沃爾德蔡氏 ‚一個版權©2006 A¢A€“2012 Lua.org,銀行業者。免費的根據Lua許可證。 1 A¢A€“介紹 Lua是一個擴充套件

    lua-5.1lua-5.2 之間的一些差異

    1. luaL_register 2 luaL_setfuncs lua5.1 之中有一個luaL_register,用於把luaL_Reg 陣列中的所有函式註冊到lua中。但在lua5.2中已經不支援這一函數了, lua5.2的手冊中建議使用luaL_setfuncs來替代luaL_regis

    lua-5.1lua-5.2 之間的一些差異。

    1. luaL_register 2 luaL_setfuncs lua5.1 之中有一個luaL_register,用於把luaL_Reg 陣列中的所有函式註冊到lua中。但在lua5.2中已經不支援這一函數了, lua5.2的手冊中建議使用luaL_setfunc

    lua 5.1.5安裝

    1 安裝luan wget http://www.lua.org/ftp/lua-5.1.5.tar.gz tar-xf lua-5.1.5.tar.gz cd lua-5.1.5 make generic make install

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

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

    高速掌握Lua 5.3 —— I/O庫 (1)

    跳過 控制 ont haml end {} simple table 最大 Q:什麽是”Simple Model”? A:全部的文件操作都基於一個默認的輸入文件和一個默認的輸出文件。這就意味著同一時間對於輸入和輸出來說,僅僅可操作一個文件(默認的文件)

    高速掌握Lua 5.3 —— 擴展你的程序 (1)

    lac ould key article start markdown max 高速 擴展程序 Q:怎樣在C中將Lua作為配置文件語言使用? A: “config.lua”文件裏: -- window size width = 200 heig

    1.1 學習之初;1.2 約定1.3 認識Linux;1.4 創建虛擬機;1.5安裝centos7

    安裝centos7給自己定個位:1. 定位:為更好地就業,不被社會淘汰,做一名合格的運維工程師2. 目標:半年左右學習完成基礎,之後跳槽運維工作,工作中多多積累經驗3. 工資:第一次奔著8k+起,一到兩年提升到15k-20k學習:1. 班主任每天安排的學習課程完成後,如果有空余時間精力再繼續預習新的課程,每天

    1.1學習之初1.2約定1.3認識Linux1.4創建虛擬機1.5安裝CentOS7

    size mar 職位 重要 pad lis 設定 ans otto 1.1 學習之初一、給自己定位1、學這個課程的目的是什麽?2、學完之後要做什麽職位?3、學完之後要再哪個城市發展二、給自己設定一個目標1、何時學完?2、何時跳槽3、第一份薪資多少4、一年後多少,兩年後多少

    1.1 學習之初 1.2 約定 1.3 認識Linux 1.4 安裝虛擬機 1.5 安裝centos

    2018-03-181,安裝好虛擬機後,文件---新建虛擬機--然後就下一步--,2下一步選如下:3.如下圖4.下一步直到如下圖5.下一步直到如下圖:6.下一步:7.下一步 直到完成即可。8.下面開始配置:編輯虛擬機:9.配置網絡:10.然後開始點 開啟此虛擬機--然後按上下左右箭頭按鍵--選擇第一個In

    5.1-day01-C++語言語法基礎

    bank.cpp #include <iostream> using namespace std; //namespace { void print (int money) { cout << money <&

    Lua 5.3 -- SOL2.0 用戶指南 【1

    .com 目錄 了解 詳細 rip set 特定 hub 發送 SOL2.2 是一個快速、簡單的C++與LUA的綁定器。如果確定要在你的程序裏面同時運行Lua和C++,SOL 是一個高性能的綁定器,是一個API使用方便的 GO-TO 框架。 簡單看一下特點:這個鏈接到(

    Lua BitOp 提供5.15.2版本位操作運算 (跨平臺C語言實現 說明部分1

    BitOp作為The LuaJIT Project中的一個子專案。 Lua BitOp is a C extension module for Lua 5.1/5.2 which adds bitwise operations on numbers. Features 特點

    快速掌握Lua 5.3 —— "metatables" and "metamethods" (1)

    Q:什麼是”metatable”? A:”metatable”是一張定義了一些特殊功能的”table”,當他被分配給某個”table”(另一個”table”,與”metatable”不是同一個”table”)時,這個”table”就具有了這些特殊功能。 當在

    Swift基礎1.5——基本語法——集合

    這一篇,簡單介紹一下Swift中的陣列與字典 陣列使用 [] 定義,這一點與 OC 相同//: [Int] let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    Laravel 5.1 中的異常處理器和HTTP異常處理 abort()

    錯誤日誌 exce ant upload 記錄 再次 .org splay don 原文 http://laravelacademy.org/post/1867.html 錯誤和異常是處理程序開發中不可回避的議題,在本地開發中我們往往希望能捕獲程序拋出的異常並將其顯示打印

    mac下配置phonegap(cordova)5.1.1開發環境

    ice npm安裝 ont plugin ejs 終端 orm 點擊 add 眼下最新的cordova的版本號是5.1.1,在mac下搭建開發環境過程例如以下: 1)首先安裝NODEJS環境 進入官網: http://nodejs.org/ 。眼下的版本號: v0.1

    VirtualBox-5.1.22​無法掛載u盤解決辦法

    virtualbox無法掛載u盤解決辦法W10環境下 VirtualBox-5.1.22裝WIN7無法掛載U盤.。VirtualBox-5.1.22可能還需要安裝擴展插件(我裝了),地址如下http://download.virtualbox.org/virtualbox/5.1.22/Oracle_VM_V

    用for和while循環求e的值[e=1+1/1!+1/2!+1/3!+1/4!+1/5!+...+1/n!]

    主函數 int class urn log emp art print tracking /*編敲代碼,依據下面公式求e的值。要求用兩種方法計算: 1)for循環。計算前50項 2)while循環,直至最後一項的值小於10-4 e=1+1/1!+1/2!+1/

    USACO 5.1.1凸包

    blog n) pre pos blank ace stdin href sqrt 轉自:http://blog.csdn.net/cnyali/article/details/50097593 程序: #include <iostream> #includ