浅谈SQLite:浅析Lemon

1、概述

Lemon是一个LALR(1)文法分析器生成工具。虽然它是SQLite作者针对SQLite 写的一个分析器生成工具,但是它与bison和yacc类似,是一个可以独立于 SQLite使用的开源的分析器生成工具。而且它使用与yacc(bison)不同的语法规 则,可以减少编程时出现错误的机会。Lemon比yacc和bison更精致、更快,而且 是可重入的,也是线程安全的——这对于支持多线程的程序是非常重要的。

Lemon的主要功能就是根据上下文无关文法(CFG),生成支持该文法的分析器 。程序的输入文件有两个:

(1) 语法规则文件;

(2) 分析器模板文件。

一般来说,语法规则是由程序员定义的;Lemon有一个适用于大多数应用程序 的默认分析器模板。根据命令行选项,Lemon会生成以下一些文件:

(1) 分析器的C代码;

(2) 一个为每个终结符定义一个整型ID的头文件;

(3) 一个描述分析器状态的文件。

语法规范文件以”.y”为后缀,如果语法规范文件为”gram.y”,则可以使 用如下命令生成分析器:

lemon gram.y

1.1、分析器接口

Lemon不会生成一个完整的、可以运行的程序。它仅仅生成一些实现分析器的 子例程,然后由用户程序在适当的地方调用这些子例程,从而生成一个完整的分 析器。

1.1.1、ParseAlloc

程序在使用Lemon生成的分析器之前,必须创建一个分析器。如下:

void *pParser = ParseAlloc( malloc );

ParseAlloc为分析器分配空间,然后初始化它,返回一个指向分析器的指针 。SQLite对应的函数为:

void *sqlite3ParserAlloc(void *(*mallocProc)(size_t))

函数的参数为一个函数指针,并在函数内调用该指针指向的函数。如:

代码

void *sqlite3ParserAlloc(void *(*mallocProc)(size_t)){
   yyParser *pParser;
   pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser)  );
   if( pParser ){
     pParser->yyidx = -1;
#ifdef YYTRACKMAXSTACKDEPTH
     pParser->yyidxMax = 0;
#endif
#if YYSTACKDEPTH<=0
     pParser->yystack = NULL;
     pParser->yystksz = 0;
     yyGrowStack(pParser);
#endif
   }
   return pParser;
}

时间: 2024-10-29 17:06:42

浅谈SQLite:浅析Lemon的相关文章

浅谈PHP的数据库接口和技术_php实例

1.php支持哪些数据库(拥有哪些数据库接口) Adabas D ,InterBase ,PostgreSQL ,dBase ,FrontBase ,SQLite ,Empress ,mSQL ,Solid ,FilePro(只读),Direct MS-SQL ,Sybase ,Hyperwave ,MySQL ,Velocis ,IBM DB2 ,ODBC ,Unix dbm ,informix ,Oracle(OCI7 和 OCI8),Ingres ,Ovrimos 以上数据库都支持,简言之

浅谈PHP的数据库接口和技术

1.php支持哪些数据库(拥有哪些数据库接口) Adabas D ,InterBase ,PostgreSQL ,dBase ,FrontBase ,SQLite ,Empress ,mSQL ,Solid ,FilePro(只读),Direct MS-SQL ,Sybase ,Hyperwave ,MySQL ,Velocis ,IBM DB2 ,ODBC ,Unix dbm ,informix ,Oracle(OCI7 和 OCI8),Ingres ,Ovrimos 以上数据库都支持,简言之

浅谈Python中copy()方法的使用

  这篇文章主要介绍了浅谈Python中copy()方法的使用,Python中的拷贝分为潜拷贝和深拷贝,本文只是简单介绍用法,需要的朋友可以参考下 copy()方法返回字典的浅拷贝. 语法 以下是copy()方法的语法: ? 1 dict.copy() 参数 NA 返回值 此方法返回字典的浅拷贝. 例子 下面的例子显示了copy()方法的使用. ? 1 2 3 4 5 6 #!/usr/bin/python   dict1 = {'Name': 'Zara', 'Age': 7};   dict

浅谈document.write()输出样式

  这篇文章主要介绍了浅谈document.write()输出样式,十分的简单实用,有需要的小伙伴可以参考下. js中的最基本的命令之一:document.write(),用于简单的打印内容到页面上,可以逐字打印你需要的内容--document.write("content"),这里content就是需要输出的内容;当然还有一种情况,需要输出JS之中比如变量等等变化的东西,那么就需要用document.write(+variable);当然variable就是你想要输出的变量. 既然可

图标字体化浅谈[转]

在做手机端Web App项目中,经常会遇到小图标在手机上显示比较模糊的问题,经过实践发现了一种比较好的解决方案,图标字体化.在微社区项目中,有很多小的Icon(图 标),如分享.回复.赞.返回.话题.访问.箭头等,这些Icon(图标)一般都是纯色的.开始制作时考虑用双倍大小的Sprite图,通过CSS样式设 置只显示二分之一尺寸,这样在Retina屏上显示的大小是正常的,一旦放大屏幕后图标又变得模糊不清,测试的效果不是很理想,后来又考虑多套图标适配方 案.SVG矢量图等,都因为种种原因放弃掉了(

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言:PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection).现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完全兼容.PHP5.3在PHP5.2的基础上做了诸多改进,其中垃圾回收算法就属于一个比较大的改变.本文将分别

浅谈算法和数据结构 十一 哈希表

在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是他们在平均以及最差情况下的时间复杂度: 可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度. 那么有没有查找效率更高的数据结构呢,答案就是本文接下来要介绍了散列表,也叫哈希表(Hash Table) 什么是哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 哈希的思路很简单

浅谈关于JavaScript API设计的一些建议和准则

  这篇文章主要介绍了浅谈关于JavaScript API设计的一些建议和准则,文中列举了许多知名的JS API进行辅助说明,极力推荐!需要的朋友可以参考下 设计是一个很普遍的概念,一般是可以理解为为即将做的某件事先形成一个计划或框架. (牛津英语词典)中,设计是一种将艺术,体系,硬件或者更多的东西编织到一块的主线.软件设计,特别是作为软件设计的次类的API设计,也是一样的.但是API设计常常很少关注软件发展,因为为其他程序员写代码的重要性要次于应用UI设计和最终用户体验. 但是API设计,作为

浅谈在openSUSE下ASP.NET 4开发环境配置(1)

浅谈在openSUSE下ASP.NET 4开发环境配置(1)