lua 5 3語法分析的BNF

2021-09-26 04:53:18 字數 1698 閱讀 2205

看lua直譯器源**的時候發現和lua官網上給的有點出入,自己記錄一下

官網的文件:直接在頁面搜尋bnf就行了

以下是從原始碼的注釋裡扣出來的,原始碼注釋有些地方寫的有點問題,可能是作者版本迭代的時候忘記改注釋了,幫作者改了一點

block 		-> statlist

statlist ->

fieldsel -> ['.' | ':'] name

index -> '[' expr ']'

constructor -> ' [sep] ] '}'

sep -> ',' | ';'

field -> listfield | recfield

recfield -> (name | '['exp1']') = exp1

listfield -> exp

body -> '(' parlist ')' block end

parlist -> [ param ]

param -> name | '...'

explist -> expr

funcargs -> '(' [ explist ] ')' | constructor | string

primaryexp -> name | '(' expr ')'

suffixedexp -> primaryexp

******exp -> flt | int | string | nil | true | false | ... | constructor | function body | suffixedexp

subexpr -> (******exp | unop subexpr)

assignment -> ',' suffixedexp assignment | '=' explist

cond -> exp

label -> '::' name '::'

whilestat -> while cond do block end

repeatstat -> repeat block until cond

forstat -> for (fornum | forlist) end

fornum -> name = exp1,exp1[,exp1] forbody

forlist -> name in explist forbody

forbody -> do block

stat -> local name ['=' explist] | return [explist]

| ';' (empty statement) | fistat | whilestat | do block end | forstat | repeatstat

| funstat | localstat | label | retstat | breakstat | 'goto' name | suffixedexp | assignment

ifstat -> if cond then block [else block] end

test_then_block -> [if | elseif] cond then block

funcname -> name [':' name]

funcstat -> function funcname body

Lua5 3遇到的坑

attempt to call a nil value global unpack 在lua 5.2和5.3的版本中,全域性的unpack函式已經被移除了,改為table.unpack,所以如果用到的第三方庫或者源 使用了unpack方法,可以在 前面加上 local unpack unpack o...

Lua5 3 虛擬機器指令分析(五)函式呼叫

op closure,a bx r a closure kproto bx ttcs mac mini opcode ttc cat top closure.lua function f1 end ttcs mac mini opcode ttc luac l l top closure.lua m...

SLua 中使用 Lua 5 3 的編譯工程

2016 03 05 更新 之前編譯的庫,在 android 下 lua number 和 lua integer 被編譯為了32位,導致從 c 到 lua 過程中有64位到32位整型轉換會出現溢位出錯,出現異常大的負整數。以下修改或是之前遺漏的部分均使用紅色表示。2016 11 21 更新 之前編...