代码改变世界

LUA5.3的BNF范式学习笔记

2016-12-21 16:25  撞破南墙  阅读(931)  评论(0编辑  收藏  举报
 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)。
下列字符串是另外一些符记:
+ - * / % ^ # & ~ | << >> // == ~= <= >= < > = ( ) { } [ ] :: ; : , . .. ...
 
 
后记,事实上,还有优先级等等细节。这个只是一个简单的语法检测。