词法分析总结(词法分析是什么意思)

lxf2023-12-18 05:20:01
这个链接上有一点介绍,可以大致了解一下:http://blog.imaginea.com/mysql-query-parsing/要点:1。SQL解析包括一个解析器和一个词法分析器。 简单的方法是使用bison/flex组合。 但是,MySQL的词法分析器是手工制作的。 解析器的入口函数是MYSQLparse,词法分析器的入口函数是MYSQLlex。 2.词法分析将检查token是否是关键字。 最直接的方法是获取一个大的关键字数组,对半搜索。 MySQL在这里做了一些优化。 本文主要介绍这一部分。 考虑到关键字是只读列表,为其制作只读搜索树可以提高搜索性能。 生成搜索树:1 .读取关键字数组以生成Trie树。 2.调整树,生成数组(即没有链表的树)。 使用查找树:这个比较简单,看看函数get_hash_symbol就知道了。 生成查找树,相关Makefile规则:在` SQL/CMakeFiles/SQL . dir/build . make ':SQL/lex _ hash . h:SQL/gen _ lex _ hash $(CMAKE _ COMMAND)-E CMAKE _ PROGRESS _ report/Home/zed ware/Workspace/MySQL/CMAKE files $(CMAKE _ PROGRESS _ 153)@ $(CMAKE _ COMMAND)-E CMAKE _ echo _ COLOR-switch = $(COLOR)-blue-bold "生成lex _ hash . h " CD/Home/zed ware/Workspace/gen _ lex _ hash > lex _ hash.h很好找,最重要的函数是' get_hash_symbol '。其主要调用关系为:/* SQL/lex _ hash . h */get _ hash _ symbol-> SQL _ functions _ mapget _ hash _ symbol-> symbols _ map/* SQL/SQL _ lex . cc */Find _ keyword-> get _ hash _ symbolis _ keyword-> get _ hash _ symbolis _ lex _ native _ function-> get _ hash _ symbol文件" gen _ lex _ hash . cc ":& # 43;- +-+-+-+| len | 1 | 2 | 3 | & # 43- +-+-+-+| first _ char | 0 | 0 | a | | last _ char | 0 | 0 | d | | link | 0 | 0 | & # 43;| | V & # 43- +-+-+-+- +| 1 char | a | b | c | d | & # 43- +-+-+-+- +| first _ char | d | 0 | 0 | 0 | | last _ char | n | 0 | 0 |-1 | | link | & # 43;|0|0|+| | | | V |符号[2]("天")V & # 43- +- +-+-+-+-+-+-+-+-+-+- +| 2 char | d | e | f | j | h | I | j | k | l | m | n | & # 43;- +- +-+-+-+-+-+-+-+-+-+- +| first _ char | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | last _ char |-1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |-1 | | link | & # 43;|0|0|0|0|0|0|0|0|0|+|||| v v符号[0](“add”)符号[1](“and”)如果记住了Trie树,就更容易理解了。 下面是对应不同输入数组的树。 i = 0 & # 43- +-+- +| len | 1 | 2 | & # 43- +-+- +| first _ char | 0 |-1 | | last _ char | 0 | 0 | | char _ tails | 0 | x | | ithis | 0 | 0 | | I result | 0 | 0 | & & static SYMBOL symbols[]= { { " & & ",SYM(AND_AND_SYM)},static uchar symbols_map[8]= {0,0,0,1,0,0,0,0,};i = 1 & # 43- +- +- +| len | 1 | 2 | & # 43- +- +- +| first _ char |-1 |-1 | | last _ char | 0 | 0 | | char _ tails | x | x | | ithis | 0 | 0 | | I result | 1 | 0 | | | < & & static symbols symbols[]= { { " & & ",SYM(AND_AND_SYM)},{ " 我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在这个网站中,您可以学习最新的前端开发技术,了解前端开发的最新趋势和最佳实践。 我们提供丰富的教程和案例,让您快速掌握前端开发的核心技术和流程。 Adminjs.cn还提供了一系列实用的工具和插件,帮助你更高效的进行前端开发。 我们提供的工具和插件都是经过精心设计和优化的,可以帮助您节省时间和精力,提高开发效率。 在Adminjs.cn,你可以找到让你成为更优秀的前端开发者所需的所有前端开发资源。 欢迎加入我们的大家庭,一起探索前端开发的无限可能!