-
Notifications
You must be signed in to change notification settings - Fork 1
fenildf/lemon
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
LEMON语法分析生成器 豆瓣链接: https://book.douban.com/subject/1954135/ 本书说了代码基于sqlite-2.8.17.tar.gz ,其实经过我本人的严格对比,本书其实是基于sqlite-3.1.2.tar.gz,这是个大坑。 sqlite-3.1.2.tar.gz代码下载网址: http://pkgs.fedoraproject.org/repo/pkgs/sqlite/sqlite-3.1.2.tar.gz/d9c52489aa95d618842bf97778c17f04/ lemon.c 跟 lempar.c是从sqlite-3.1.2.tar.gz 代码中取得的。 parse.y就是sqlite-3.1.2.tar.gz 中针对SQL写的语法文件。 0、修改lemon.c 的3358行为:out = file_open(lemp,".cpp","wb"); #支持c++ 1、gcc -o lemon lemon.c #编译得到lemon可执行文件 2、./lemon example4.y -c #得到example4.cpp、example4.h、example4.out三个文件 2.1、从Mac OS X 10.9/Xcode 5开始,系统里没有GCC了,你以为是GCC的那些gcc和g++之类的命令只是clang的别名。所以Mac下面用g++ -o example1 example1.cpp来编译,用gcc会报错。 2.2、如果Linux下的是GCC的话,直接gcc -o example1 example1.cpp也是可以的。 3、剩下看CMakeLists.txt文件 4、// LEMON有下述20个特殊的申明符号。每一个特殊符号都以"%"字符为首,后面跟着由小写字母和下划线组成的字符串 %code %default_destructor %default_type %destructor %extra_argument %include %left %name %nonassoc %parse_accept %parse_failure %right %stack_overflow %stack_size %start_symbol %syntax_error %token_destructor %token_prefix %token_type %type 语法文件.y 中允许出现的20个以%开头的特殊指定符,在lemon数据结构中居然有16个与之相关,而不出现在lemon数据结构中的仅仅为%left %right %nonassoc %ifdef-%endif 跟 %ifndef-%endif 5、语法分析的5个基本数据结构: symbol符号(包括终结符,非终结符) rule(产生式) config(项目,产生式的变形==LEMON在.out文件中用*号代替了黑点) state(状态) action(动作) 还有全局变量lemon 跟 存放符号名称的xla结构体 6、LEMON有两个特殊符号,一个是$ 另一个是error,这两个符号不出现在.y语法文件中,是LEMON程序为进行语法分析而自行"硬填"进去的符号。 x1a 装备字符串,相当于名字name的存储区域。Strsafe()相关函数 x2a 装备符号,Symbol_new()函数,包括终结符,也包括非终结符 x3a 装备状态state x4a 装备项目config。。装备同一状态下面的不同config。。当进行到下一个状态的时候,x4a会被回收清空 7、词法扫描 过程
About
基于<LEMON语法分析生成器>本书的学习笔记
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published