Lua 源码分析
----我要卖书赚钱
第0节 一切从这里开始
Lua是边进行语法分析,边词法分析。其中,词法分析的模块是:llex。其对外暴露的接口是:llex_next()。并且,在整个语法分析、词法分析的过程中,只有一个唯一的全局实例:llex_state。
在词法分析的过程中,lua会处理以下几种情况:
<1> ‘/r’, ‘/n’ 这两个东西的任意组合,是换行,lua直接跳过,其中是用inclinenumber(ls)这个函数跳过的。
<2> -- 或 –--[ ] 注释,lua也会跳过,不过,lua是通过把注释当作字符串读取后跳过的。
<3>[==[ ]==],中间是等量=的字符串,lua会读取字符串,通过read_long_string()。并返回:TK_STRING。
<4> “ ”,‘ ’ 用引号引起来的字符串,lua会通过read_string()读取字符串。并返回:TK_STRING。
<5> ==,等于号,这是lua的保留符号,返回:TK_EQ。
<6> <,小于号,返回:TK_LT。
<7> >,大于号,返回:TK_GT。
<8> ~,返回~,如果下一个字符是=,如下:
<9> ~=,不等于号,返回:TK_NE。
<10> . , 返回:’.’。
<11> .. , 返回:TK_DOTS。
<12> … , 返回:TK_CONCAT。
<13> .(0~9), 返回:TK_NUMBER,小数点+数字的形式。
<14> EOZ , 返回:TK_EOS。
<15> 如果是数字开头,则lua会读取数字,用函数read_numberal(),返回:TK_NUMBER。
<16> 如果是字母开头或_开头,则为变量、函数名或保留字,lua会区别开来,分别返回保留字的标志或TK_NAME。
<17> 如果是:+-*/等,lua会返回其ASCII码。
注:
1、如果遇到[=,lua会假设这是一个长字符串,并检查其后面的=的数目,并且如果=后面没有紧跟着[,则报错。
2、有时候数字是小数,直接以.开始,如:.31415926。lua会把这个当作一个数字,也就是TK_NUMBER类型。
3、 因为在不同国家,小数点可能不同,lua会检查到这种情况,并作处理。
4、 以下划线_开头的文字,lua会当作保留字处理。
5、 当lua读取一个字符串的时候,会新建一个TString类型的数据,并存在G(L)中,以便进行垃圾回收。
6、 保留字是lua预先建好的TString类型的字符串,在lua初始化的时候存在了G(L)中。
7、 在lua中,字符串是常量,所以,当在程序中用到相同的字符串的时候,lua会让他们指向同一个G(L)中的字符串,以便节省内存。
(2008-10-30)
第1章 lua是如何生成中间码的
lua会解释lua程序,然后生成