我们知道,任何高级一点的编译器,在解析源代码时,都需要进行词法分析。而词法分析的过程就是先识别token的一个过程,总体来说,lua里面的token大致分为:
1. 数字和字符串
2. 特殊字符:包括运算符和括号
3. 关键词
对于每一类token lua都有唯一的id与之对应,此id用int来表示,对于第2种类型,直接用该字符的ASCII码来表示,对于1,3两类,则定义一组枚举,为了与第2种区别开,枚举从257开始。比如关键字break 对应 TK_BREAK,do 对应 TK_DO。
先来看看luaX_next,它用来识别下一个token,会调用 llex 函数,返回token type和seminfo。有了token,接下来就会分析一条条的语句。
一个statementlist 的 production为: statlist -> { stat [`;'] } ,下面先将一个statement的grammer production列出:
stat = { ifstat | dostat | whilestat | functionstat | localstat | retstat | forstat | repeatestat | goto | breakstat | exprstat }
以ifstat为例:
ifstat -> IF exprstat THEN statlist END
exprstat -> subexpr
subexpr ->(simpleexp | unop subexpr) { binop subexpr }