PG电子 PGdianzi 分类>>
海山数据库(He3DBPG电子游戏- PG电子平台- 官方网站)源码解读:海山 词法、语法分析
pg电子游戏,pg电子接口,pg电子官网,pg电子试玩,pg电子app,pg电子介绍,pg电子外挂,pg游戏,pg电子游戏平台,pg游戏官网,PG电子,麻将胡了,PG电子试玩,PG模拟器,PG麻将胡了,pg电子平台,百家乐,龙虎,捕鱼,电子捕鱼,麻将胡了2,电子游戏在解析之前,我们先来了解一下 token 的意义,这对我们理解为何要用 Flex 生成一个词法分析器有着莫大意义。当 Flex 读进一个代表词法分析器规则的输入字符串流,然后输出以C语言编写的词法分析器源代码。利用这个词法分析器可以将一个文本中的单词提取出来,而这其实就是提取编程语言占用的各种保留字、操作符等等语言的元素,我们也将这些元素称为令牌(token)。词法分析器一般以函数(yylex()函数)的形式存在,供语法分析器调用。
对于一种编程语言来说,token 的类型是有限的。Flex 工具会帮我们生成一个 yylex() 函数,Bison 通过调用这个函数来得知拿到的 token 是什么类型的,而这,便是 scan.l 和 Flex 的关联之处。Flex 的输入文件一般会被命名成 .l 文件,通过 scan.l 我们得到输出的文件是 scan.cpp,yylex() 函数就在这个文件中。这个过程的结构图大概是这样的,yylex() 函数就是我们所说的词法分析器的主体了:
%option reentrant可重入词法分析器,传统词法分析器只能一次处理一个输入流,所以很多变量都定义的为静态变量这样分析器才能记住上次分析的地方继而可以继续分析。但是不能同时处理多个输入流。为了解决这个问题引入了可重入词法分析器。通过参数reentrant来控制。这样通过一个yyscan_t类型变量来保存中间状态。yyscan_t为void,但是在yylex_init初始化的时候是分配了sizeof(yyguts_t)大小的空间,yyguts_t 是一个结构体,保存了所有需要记录的中间的状态。通过这个结构体里的变量替换了原来的静态变量。即在yylex中这个yygut_t类型的变量被传入,这样就通过这个结构体保存了所有原来很多静态变量保存的值。实现了多个输入流同时被分析。只要针对每个输入流,创建一个yyscan_t类型的scanner.传入到yylex中。