SQLite源代码分析----------分析器②

2021SC@SDUSC

导言

       书接SQLite源代码分析----------分析器①,本节介绍lemon的相关知识。

在堆栈上分配Parse对象

       如果所有对Parse()接口的调用都是从内部进行的%code,则可以从堆栈而不是从堆中分配解析对象。这些步骤如下:

1.声明“yyParser”类型的局部变量
2.使用ParseInit()初始化变量
3.在调用ot Parse()中传递一个指向变量的指针
4.使用ParseFinish()在解析变量中取消分配子结构。

下面的代码说明了如何做到这一点:

ParseFile(){
    
    
      yyParser x;
      ParseInit( &x );
      while( GetNextToken(pTokenizer,&hTokenId, &sToken) ){
    
    
         Parse(&x, hTokenId, sToken);
      }
      Parse(&x, 0, sToken);
      ParseFinalize( &x );
   }

接口摘要

       下面简要介绍了lemon生成的解析器的C语言接口:

void *ParseAlloc( (void*(*malloc)(size_t) );
void ParseFree(void *pParser, (void(*free)(void*) );
void Parse(void *pParser, int tokenCode, ParseTOKENTYPE token, ...);
void ParseTrace(FILE *stream, char *zPrefix);

注意:

使用%name指令若要更改接口中过程的“Parse”前缀名称,请执行以下操作。
使用%token_type指令定义“ParseTOKENTYPE”类型。
使用%extra_argument指令为Parse()函数指定第四个参数的类型和名称。

构建可执行的“lemon”或“lemon.exe”

       “lemon”或“lemon.exe”程序是由名为“lemon.c”的文件生成的。“.Lemon源代码是通用的C89代码,不使用不寻常的或非标准的库。任何合理的C编译器都应该足以编译lemon.c程序。下面这样的命令行通常可以工作:

cc -o lemon lemon.c

在Windows机器上安装VisualC++,打开一个“VS20xx X64命令提示符”窗口并输入:

cl lemon.c

编译lemom真的很简单。如果需要,可以添加额外的编译器选项,如“-O2”或“-g”或“-Wall”,但它们是不必要的。
附:

-Wall:选项可以打印出编译时所有的错误或者警告信息。
-O2: 表示编译时使用二级优化。
-g:可执行程序包含调试信息,目的是为了给GDB工具调试程序使用。

Guess you like

Origin blog.csdn.net/wy_csdn_sdu/article/details/121195390