标识符(Name),是一个非常重要的概念.标识符可以用来命名变量或者标签,很多语句的定义都用到了它.
首先我们先定义一个和 Name 有点差异的 NameString.
NameString = (Letter | '_') , {Letter | Digit | '_'};
Name 就是从 NameString 中排除所有的关键字:
KeyWords = 'and' | 'break' | 'do' | 'else' | 'elseif' | 'end' | 'false' | 'for' | 'function' | 'goto' | 'if' | 'in' | 'local' | 'nil' | 'not' | 'or' | 'repeat' | 'return' | 'then' | 'true' | 'until' | 'while';
Name = NameString - KeyWords;
exp = NilValue | BoolValue | Numeral | LiteralString | '...' | functiondef | prefixexp | tableconstructor | exp, binop, exp | unop exp;
表达式和语句(stat)类似,包含非常多内容,并且嵌套了自身.
其中用到的的一些名词我们已经介绍过,剩下的我们将会在后边介绍.
这一部分介绍的是构造表的语法.
tableconstructor = '{', [fieldlist], '}';
fieldlist = field, {fieldsep, field}, [fieldsep];
field = '[', exp, ']', '=', exp | Name, '=', exp | exp;
fieldsep = ',' | ';';
之前可能漏讲了一点关于 Lua 表构造表达式的内容--不同成员项目之间可以用逗号分隔,也可以用分号分隔.
二元运算符
binop = '+' | '-' | '*' | '/' | '//' | '^' | '%' | '&' | '~' | '|' | '>>' | '<<' | '..' | '<' | '<=' | '>' | '>=' | '==' | '~=' | and | or;
一元运算符
unop = '-' | not | '#' | '~';
注意这些同样是语法层面的定义,并不能检测变量可不可以进行这样的运算.
NilValue = 'nil';
BoolValue = 'true' | 'false';