00:00
好的,那接下来呢,我们进到这个pass解析器的方法当中,那我们点开pass啊,呃,调用重载的方法,没什么好说的,点进来,那么这个里边呢,最核心的当然大家看到应该是这行代码吧,诶,他呢就得到了这样一个东西,呃,他就创建了一个pass driver。解析的驱动对吧?然后呢,拿着它去解析我们的命令行,得到我们的抽象语法数,最后呢,做一个返回,所以外面呢,我们看到接收到的结果就是这样的一个结果对吧?这个不用关心的,那我们点进来看啊,这个pass,那在这个当中呢,它核心的做了两件事情,第一个我们之前说了,它是通过对我们的hi客做这个词法语法的解析,得到token啊,第一个那这就是词法语法的解析对象,诶然后呢,把它放进去得到我们的token,第二个对于我们的token呢做解析,诶在这一边另有一个还有passer,把token放进来,最后得到一个passl,对吧?那这个内容呢,对于我们的数据做解析,最终得到我们的数来看passer.statement把这个语句解析过后的内容,把它拿到,拿到以后呢,得到一个R。
01:06
啊,得到一个r ten,对吧,一个结果啊,那拿到我们结果以后呢?那我们数在哪呢?在这从R当中去获取我们的数就OK了,对吧?其实呢,这个里边解析的过程分为两大步,第一步呢是我们的词法语法解析,第二步就是将解析之后的一个token,把它转化为我们的一个解析器,从解析器当中工作得到我们的树找结构,啊那这块的东西呢,但这块东西确实相对来说比较抽象,因为大家可能看到这个token什么东西,对吧?那接下来呢,我们结合文档当中给大家做一个介绍,啊在我们的语法中,嗯,就刚才我们所看到的,呃,Compel,同时我们作为回顾compel方法,Compel方法当中呢,就有一个最核心的,这样是生成语法数的,对吧?我们将用pass重载的pass之后呢,呃,他用了一个pass driver去调用pass方法进到这个里边,我们看到有词法语法解析,最后呢,得到一个token,然后继续拿着我们的token去做解析。
02:06
对吧,电代码在这块,那我们就看一下它的这个,诶词法语法解析器是个什么东西,那在have里边呢,它其实用的是这个一个框架啊,其实在前面我们介绍整理流程的时候也提到了,它是用来做这个S的词法语法解析的啊,它呢比较复杂,它是专门的一个框架啊,我我们在网上可以去搜一下这个out的这个东西啊,那在老版本当中呢,其实只有一个have.g这样的一个文件完成它这个内容,但是后来随着我们语法越来越复杂,现在呢,它总共有这么四个文件了。这里边定义的就是一些词法语法的规则,那我们可以带大家去找一下啊,这里边其实就是将我们搜当中的一些关键字跟他所要的这个token呢,做了一个匹配啊,那在源码当中呢,我们给他看一下,呃,首先呢,在我们的我给大家找一下啊。
03:05
在这个里边有一个CLA con,嗯,然后呢,在这个包当中。这是我们的客户端包对吧?然后呢,我们要找到它啊,那或者说这样吧,我们点到这个类里边来看一下它的一个包结构啊,呃,那它是这个have.ql.pass包下的对吧?呃,have.ql包啊,那我们找到这个QR,有同学看到这个QL包在这啊,在这个地方好,那这个类呢,都是这里边出来的,所以我们点到这来看就行了啊在这个里边呢,有一个Java。啊,这是哈杜op的一个QR啊,那在这个里边呢,我们去找到我们要的那个文件,其实就够了,对吧?嗯,那我们点开看一下resource目录底下,看有没有它我们要的东西,嗯,然后呢,我们看到它应该是这个Q r.pass包下的,那我们找到这个pass包对吧?好好,那这个里边呢,就有我们看到刚才我们给大家提供了说的那四个。
04:08
From语句对吧,Have正常的一个词法啊,解析器啊,有这些个文件啊,那我们随便点开看一下这个词法语法解析这个内容啊,呃,那在这个当中呢,它就定义了很多的一些什么。看这个当中呢,就对我们关键字true false or and or,呃,Not like any,对吧,If exist,它都有一个自己的解析,诶是一个简值,对它就拿着我们S当中,你看这后半部分呢,都是我们S里边所用到的关键字,前面呢,它有一个匹配,是它要自己做词法语法解析,那这块呢,我们不对这个内容做具体的详细的介绍啊,大家了解一下有这个东西,然后呢,如果说你想要去看这个内容的话,你还要专门的去学out的这个语法啊,它主要是由这四个文件构建的,然后将我们四个语句当中那一个一个的关键词啊,把它。
05:04
做一个解析对吧?啊,就根据这个来的,最终呢,生成我们的语法数啊,那语法数又是一个什么东西呢?你比方这边我放了一个例子啊,你比方这样的一个circle。这样的一个色格,我们来看一下,首先呢,从两张表当中我们去查询数据,同时group这个是外层的查询,那内涵内部呢,包含了有什么?只不过说这边呢,我们是要将查询结果呢,放入到另外一张表里边,对吧,然后呃,我们查询的内容呢,是从另外一张表里边查到的这个东西啊,做了一个子查询啊叫base啊,其实呢,在这个过程当中有两个draw操作吧,啊抓过程当中,从三张表分别三张表当中取一个字段放到我们新的表里面,并对它做count处理啊就这样这样的一个circle,最后呢,生成的语法数啊呃,我们看到将会这样,前面呢,你看token query。
06:02
表示一个查询。啊,那查询当中呢,是大的一个查询,包括两大部分吧,一个是我们的from啊,那评级的还有一个什么insert,因为我们要的是一个什么,从一张表里边查询东西,把它插入到另外一张表里边儿啊,所以大的逻辑呢是from,还有insert。好,那在from当中呢,我们又看到了,哎,它中间呢,包括的是一个紫查询,然后query from drawing drawing,那每一个呢,你看都可以展开,因为呢,我们join的语法,这里边不是又一张表吗?我们对于这张表也要做解析啊,所以呢,它就将我们的这个思索语句啊,变成这样的一个树状结构,因为你join之后,Join子句就相当于每一个句开头的东西都是一个token token关键词,就是刚才我们看到的匹配的那部分,对吧?那后面呢,这个from,还有这个drawing啊呃,Ins色的这些东西都是我们正常的关键词will条件对吧?都是正常关键词,它把这个内容呢翻译成了。
07:03
抽象的语法数,当然了,等会呢,我们可以在呃,Debug的时候可以给这个语法抽象语法数,这个对象我们可以看到里边的值对不对啊好,那这块呢,就是我们解析器它所完成的事情,总结一下完成两件事情,第一个根据我们定义好的规则,也就是说这四个文件对我们的hi语句当中关键词呢做词法语法解析,第二个将解析后它得到的是不是叫token对象,将这个token对象呢,生成我们最终的。抽象语法数啊,当然这个都是这个奥这个框架所实现的啊,那这边呢,其实大家也一样,没有必要去深究这个框架,因为它呢还要独立它独特的一个语法,它里面语法刚才我们看到都不太一样,对吧?好,这个是我们所说的,呃,获得了ast抽象语法数解析器,它所完成的一个工作,OK。
我来说两句