Lua5.0 语法分析

写着写着,又来到了这里。

这次是写还是不写,嗯,这是一个问题。

先说点题外话,没准也算是题内。

经过这段时间的代码阅读,分析,调试,感觉自己的代码控制力提高了一些。

当然了,不单是 Lua 相关的,也有其它的工作中的代码阅读。

相比之下,还是工作中阅读的代码量要更大一些,更快一些。

究其原因,可能是工作中的代码阅读的目的性要更强一些吧。

打个比方,工作中的代码阅读是为了解决某个很具体的问题。

带着问题去阅读代码,针对性更强一些。

也比较容易把关注点集中在相关的代码上,这个过程中不自觉地就忽略了其它的不相关的代码。

而这个 Lua 代码分析系列中的代码阅读则是另一种情况。

这是代码赏析,我很想把代码的方方面面都找到。

把那些展现出来的美好的代码,隐藏在代码背后的闪光点和精心的设计都挖掘出来。

看着看着就迷失了,迷失在字节码间,在循环之中,在跳转之时。

不知不觉间,最初的目标已经达到,甚至超越。

回顾一下最初的计划,如今已然完成!

语法分析这块和编译原理的联系太紧密了。

如果不了解一点编译原理相关的知识,硬看的话虽然能看懂,可是会很累。

LL(1) 文法还是很直观的,精简的像是工艺品。

手册的最后面有完整的语法 EBNF 。

照着看就可以了,在实际编码的时候有一定的转换,不过不影响调代码。

在 Lua4.0 的时候看了一个语法分析的输出 "hello, world" 的代码调用过程。

这里就不再重复一遍了。

Don‘t repeat yourself!

嗯,是的。

好像还没有开始呢,实际上已经结束了。

走了这么久,快到终点了,突然开始置疑比赛本身。

程序的世界,真的很精彩啊!

路漫漫其修远兮,吾将上下而求索!

时间: 2024-10-03 18:42:37

Lua5.0 语法分析的相关文章

Lua5.0 第零篇

Lua5.0 版本从这里下载: www.lua.org/ftp/lua-5.0.tar.gz 它的在线文档在这里: http://www.lua.org/manual/5.0/ 很好,终于进入版本五时代了. 打开下载下来的压缩包,好多的目录和文件.不管它们,把所有的源代码文件放到一起,编译一下. 一如既往的好编. 不过在 VS 中编编译器的时候有一个小插曲,就是 print.c 里的 luaP_opnames 找不到,有个链接错误. 原来是宏定义 LUA_OPNAMES 的问题,解决之,搜了一下

Lua4.0 语法分析

Lua 最初使用的是 Yacc 生成的语法分析器,后来改为手写的递归下降语法分析器(Recursive descent parser).因为一般在语言发展的早期,语言的语法还没有稳定下来,变动可能会比较多,用工具可以快速的验证自己的想法.当语法稳定下来之后,一般都会采用手写的语法分析器.因为这样程序员是调试可控的,并且一般也能有更好的性能表现.递归下降的语法分析对编程语言的语法有要求.因 Lua 的语法比较简单,是 LL(1) 文法.所以,手工编写语法分析也就是情理之中的事了. 关于递归下降的语

Lua5.0 编译器入口

编译器相关的文主要是 luac.c . 看一下它的内容: int main(int argc, char* argv[]) {  lua_State* L;  Proto* f;  int i=doargs(argc,argv);  argc-=i; argv+=i;  if (argc<=0) usage("no input files given",NULL);  L=lua_open();  luaB_opentests(L);  for (i=0; i<argc; 

Lua5.0 词法分析

语法分析器会调用词法分析器. 在语法分析之前,简单的看一下词法分析. 内存管理和 ZIO 输入在词法分析中会用到,因为它们相对比较孤立,不影响主流程的阅读. 上一个版本也看过它们了,这里就不再重复了. 词法分析最重要的函数就是 int luaX_lex (LexState *LS, SemInfo *seminfo); 如果你用其它的词法分析工具生成器,生成的词法分析器也会有个类似的函数. 这个函数主要就是从源代码中读出一个 token 返回给语法分析器. 在语法分析的 next 和 lookh

Lua5.0 语法解析之路

上回说到 luaL_loadfile ,这次把它的调用展开到语法分析器 parser. 先一下它的函数定义 LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {   LoadF lf;   int status, readstatus;   int c;   int fnameindex = lua_gettop(L) + 1;  /* index of filename on the stack */   if 

Lua5.0 非正式总结

如您所愿,这个 Lua 代码分析系列结束了. Lua 老版本代码的"考古工作"暂时告一段落. 以后应该也不会再拾起来了. 从写第一篇到现在已经快两年了,这是个不短的时间. 像有的网友说的,这个事儿的意义何在? 我可以说出很多个意义,但最初也是最重要的一条,兴趣. 最开始的时候是兴趣使然,挺高兴的一件事儿,还能收获知识,何乐而不为? 写着写着,目标清晰起来,既然高兴的开始了,何不愉快的结束. 到如今,应当算是一个愉快的结束,最初的目标虽然没有百分百实现,但中间修改后的目标都实现了. 比起

http://mirror2.openwrt.org/sources/

http://mirror2.openwrt.org/sources/ Index of /sources/ ../ 1.0.4.3.arm 22-Dec-2008 20:29 93996 2.13.0.0.a.13.14.arm 10-Aug-2010 16:23 30888 2.13.12.0.arm 18-Feb-2009 16:31 29036 2.13.24.0.lm86.arm 18-Feb-2009 16:31 30083 2.13.24.0.lm87.arm 28-Nov-200

lua与c++的相互调用入门篇

进入游戏行业,开始学习lua,lua脚本语言的优势在于灵活,游戏行业应用相当广泛,因为支持动态加载,所以是必不可少的存在.可以想想,如果死守C++不放,有一个bug,莫非修正bug后重启服务器?这得浪费多少时间? 好了,废话少说,上流程. 1:下载lua源码:http://www.lua.org/ftp/ 2:建立控制台应用程序,选择“静态库”,去掉“预编译头”选项 3:将下载的lua源码 添加到工程,如下图 4:选择Release 模式 5:为了防止4996错误,在“预处理器”中加入 “_CR

《Programming in Lua 3》读书笔记(二十八)

日期:2014.8.15 PartⅣ The C API 32 Memory Management Lua是动态的对其数据结构进行管理的.所有数据结构按需求进行增长,最终进行释放.Lua对其内存的使用控制较为严格,当我们关闭了一个Lua state的时候,Lua会立即释放其内存占用.不仅如此,Lua中的所有对象都被垃圾回收器管理,包括tables,strings,和functions,threads,和modules. Lua进行内存管理的方式对多数程序来说都是挺合适的.但是还是有一些特殊的程序