LUA5.3的BNF范式学习笔记

BNF巴科斯范式 {A} 表示 0 或多个 A , [A] 表示一个可选的 A

chunk ::= block

block ::= {stat} [retstat]

stat ::= ‘;’ |

varlist ‘=’ explist | --变量列表=表达式列表

functioncall |

label |

break |

goto Name |

do block end |

while exp do block end |

repeat block until exp |

if exp then block {elseif exp then block} [else block] end |

for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end |

for namelist in explist do block end |

function funcname funcbody |

local function Name funcbody |

local namelist [‘=’ explist]

varlist ::= var {‘,’ var} 变量列表是一个或多个 var

var ::= Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name

VAR是Name 或者前缀表达式[表达式]或者前缀表达式.Name

prefixexp ::= var | functioncall | ‘(’ exp ‘)’

prefixexp 前缀表达式:变量 或者 函数调用 或者(表达式)

functioncall ::= prefixexp args | prefixexp ‘:’ Name args

前缀表达式 参数 或者 前缀表达式:变量 参数

args ::= ‘(’ [explist] ‘)’ | tableconstructor | LiteralString

参数 (表达式列表) 或 表的构造式 或 字符串

refixe xp前缀表达式

exp ::= nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | prefixexp | tableconstructor | exp binop exp | unop exp

表达式=空或false或ture或数字或字符串或...或函数定义或前缀表达式

或表构造或 表达式二元操作符表达式 或 一元操作符表达式

label ::= ‘::’ Name ‘::’ 纯标记用于goto

Lua 中的 NAME名字 (也被称为 标识符) 可以是由非数字打头的任意字母下划线和数字构成的字符串。 标识符可用于对变量、表的域、以及标签命名。

下列 关键字 是保留的,不可用于名字:

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

Lua 语言对大小写敏感: and 是一个保留字,但 And 与 AND 则是两个不同的有效名字。 作为一个约定,程序应避免创建以下划线加一个或多个大写字母构成的名字 (例如 _VERSION)。

下列字符串是另外一些符记:

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

后记,事实上,还有优先级等等细节。这个只是一个简单的语法检测。