通过对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复杂太多,实现步骤根据编译原理的知识,实现步骤如下:
- 根据词法规则生成NFA图;
- 根据NFA图生成DFA图;
- 根据DFA图生成词法分析器;
这些NFA和DFA图中大部分是图结构的构造和转换过程。
这是自定义词法规则的词法分析器下载的地址http://download.youkuaiyun.com/source/2693443