lex和yacc解析SQL语句语法解析(2)

  通过对lex和yacc对SQL语句的分析,使自己对lex和yacc有更深刻的认识。

  lex功能就是词法规则定义和划分词;

  yacc功能就是完成文法规则的定义和处理;

  例如:

   

    whname_list:
        whname                                      {$$=oper(OPT_BROTHER,1,$1);}
        |whname_list WHSPLIT whname     {$$=oper(OPT_BROTHER,3,$1,$2,$3);}
        ;

 

这前部分就是对部分文法规则的定义,而后部分就是所要完成的功能。

有了lex和yacc是对文法的分析和解析的难度大大的降低。

但是有一点我们应该特别注意:lex和yacc不能在多线程的环境下运行,就是lex和yacc生成的代码不是线程安全的(至少根据目前网上资料,确实找不到关于lex和yacc线程安全方面设置的资料),如果实在多线程环境下,我建议用flex 和 bison

 

让我想起了大学编译原理的课程实践,当时是让我们做词法分析器。当时做那词法分析器做了一个多月。当时的要求是:用户可以随意定义词法规则,并可验证相应的输入词是否满足该词法规则。

根据老师的要求采用C++实现词法分析。

 

 实现步骤比起lex复杂太多,实现步骤根据编译原理的知识,实现步骤如下:

  1.  根据词法规则生成NFA图;
  2.  根据NFA图生成DFA图;
  3.  根据DFA图生成词法分析器;

这些NFA和DFA图中大部分是图结构的构造和转换过程。

这是自定义词法规则的词法分析器下载的地址http://download.csdn.net/source/2693443

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(lex和yacc解析SQL语句语法解析(2))