00:00
好,我们继续来编写ast的这样的一个底层啊,就是手写实现ast抽象的语法数啊。那么嗯,手写实现它的话呢,我们现在就需要嗯,再把这个站这个东西呢,咱们再去看一遍啊。咱们要知道我们的目标,我们的目标呢,是到最后折叠成children这样的一个形式啊,就是你的这个人,他需要放到这个上一层的这个children当中,对吧,那所以说就相当于我们现在呢,嗯。他谈战的这个元素啊,谈战的这个元素,到最后是要谈战的这个,这是一个string啊,对吧,你谈战的这个string呢,实际上是最后要成为你要要成为一个对象,这个对象呢,它是有一个children准属性,然后children属性呢,这个时候要把这个数组给它合进去,它是这样子的一个思路啊,是这样子的一个思路,所以。本质上讲呢,这个东西呢,它是属于什么,他就是一句话就能给他说清楚,就相当于是这个战士打辅助的。
01:05
啊,这个战他是打辅助的,打的是这个标签名。啊,打的是这个标签,我们把这div删了,打的是这个标签名,这里头放比如说div啊,可能放H3呀,然后这里头可能是URL啊这样子的,然后这个站呢,这个站呢,实际上是最核心的一个站,对吧?哎,那咱们现在写一步,咱们看一步啊,那到底应该是干什么,那所以说我们现在呢,就先把这个。这个呃,到底要做哪些操作,我们现在给他整理出来,首先呢,是我们先把这些乱七八糟的我们都先删掉啊。好诶,这些先不删,我们给新建一张幻灯片,然后备份一下,然后把这个删掉,对吧,这些乱七八糟的删掉啊。把这个缩小。好,这些都删掉。OK,这回好了啊,那首先呢,是我们这个div肯定是要进来,那这没有问题,然后H3呢,肯定也要进来,这都是很正常的一个操作,但每进来一个呢,我们现在都需要放一个数组。
02:10
啊,那么这个操作呢,实际上我们已经都完成了,那最关键的是遇见这个文字的时候,这个文字要怎么办?对这个文字呢,实际上它这个文字如果遇见到咱们这不是文字吗?那遇见这个时候是文字的话,我们这个时候就需要把它推入到咱们的数组当中。啊,就推入到咱们这个数组当中,是这样子的对吧?哎,所以我们现在呢,就把它给,哎,把这个文字当前也输出一下检测到文字,那所以说这个时候这个文字呢,就会推入到此时STA2。啊,占顶元素中我们就推入就行,所以就是STA2我们push一下啊不是push啊是是不是,呃,不是推入到此时是改变此时,所以就是相当于它的占点元素,那是谁呀,那不就是STA2的Les减一这一项,对吧?哎,我们要往里头增加一个啊叫text为我们这个word的这项。
03:14
啊T的是,为什么叫T的呢?因为我们在前边这张PPT上已经看见了,这里实际上是内部的文字呢,实际上叫做啊text。对吧,在这呢啊,然后type呢,它应该是3TYPE类型是三啊,我们把这个type也加上。哎,我们把这个type属性呢,也加上这个三。好,那这样的话我们可以发现,诶就可以发现,就是在便利完文字的时候,你看这个你好实际上就已经在这了,对吧,这个你好检测到文字你好,那这个你好呢,实际上就已经在这个最后了,啊这个泰克斯的C也进来了,然后这个B也进来了,A也进来了,然后这个你好也进来,那为什么检测到你好的时候这ABC进来了呢?因为咱们这个对象是引用类型纸,咱们的Chrome浏览器它有一个特点就是哪怕你后边把这个对象改变了,他这也会变。
04:13
对吧,哎,他这也会变啊,所以它这个就是你展开之后,它实际上是最新的一个情况。啊,检测到一个,呃,检测到这个文字是这个word,哎,这块是这样子的,好,那么检测到文字是word之后,那这个时候的话,最关键的事来了,就是如果一旦遇见这个回退的符号,就是一旦遇见这个结束标记的话,我们这个是要干什么。那你别忘了,我们现在这个站顶上已经有了这个T坦为,嗯,这个你好已经在里头了,那我这个时候要干什么?对H3肯定要出战,H3要出战的话,我们现在是不是要意味着把他要推入进去啊,对吧,是不是要往这个数组中去推入进去,比如他要谈战。这个是不是就特别像咱们之前的那个对吧?哎,对,特别像咱们之前做过的那个储备算法训练,所以你只要做过邵老师的这个储备算法训练的话呢,啊,就刚才咱们上课那个储备算法训练,只要能做出来,那么这个地方实际上你就能够明白他是怎么回事,对吧?哎,你也就能够明白他这块到底是怎么,哎,你也就能够明白他这里到底是怎么样跑通的啊,那所以说我们先把这个逻辑写一写,就是说这不是谈战吗?谈战的话,那就有一个这叫pop的一个tag,哎,弹出来的这个标签名。
05:37
对吧,然后我们是不是还要去弹出来一个那个那个你当前那个STACK2中的那个元素,对吧,STA2中的时候那个数组,所以就arr啊,它一定是个数组啊。好,那么这样子的话呢,我们就谈战,这不能看见了吗?我们现在的目的是什么?对,就是要往你带克二当中最后一项就是新的站点,那不就是STA2的Les减一,好,这一项我们要干嘛呢?对,我们要去让他的children。
06:09
啊,但是他这个children不一定有,能明白吗?就是他这一项不一定有这个children,所以说我们每每建立一项的时候,他不一定有这个children,所以说我们现在还要需要判断他有没有这个准啊,如果STA2的最后一项。哎,这一项啊,就二的这个,一的这个项叫property。啊,然后children。哎,就说如果他没有没有这个children好,那我这个时候就给他创建一个children属性。就等于一个空。啊,等于个空。所以在这里呢,就是要检查star是否有children准属性,如果没有,就创建一个数组。
07:02
很简单。好,然后我们让这个children属性是不是就可以啊,Push咱们刚刚弹入的这一项。就可以了,好,那这时我们再看一下,他这报错了,还啊拼错。好,我们看一下。嗯,还是报错啊,他说这是安地范,就说你这一项是没有的啊,他是可能是,呃,没有。这是因为代码到最后了,对吧,代码到最后的话,它占点已经是安迪范了,所以说这一块咱们是小于,你看index小于它的Les减一,所以说他到嗯。他到最后的时候检测到的这个结束标记的话,我们这个站就已经清空了,相当于。啊,我想想啊,咱们这个站对这个站因为他已经弹出来了,已经清空了。所以说这个时候就相当于我们再去验证一下,就是怕他最后一步啊。就如果STA2的Les,哎,还是大于零的。
08:02
啊。好,还是大于零的啊,然后我们刷新诶这个时候就OK,咱们来看一下这个啊,这个这个变成了什么样啊,但是这个啊,你看这个数项都一项一项都长度为零了。啊,说明这块还是有毛病的,咱们看看啊,嗯,Push你这个pop a,你这个children sta2的Les减一,你先去弹出来,弹出来的话呢,如果长度是大于零的话,那么我再看,如果没有,那我就给他补一个children准。啊,那这里的谬误是什么呢?这里的谬误是STA2的这一项,它是个数组。啊,它不一定是一个对象,就是说这个对象还没有创建出来,所以说当我们检测开始标签的时候,实际上我们可以把这个对象。啊给推进去,那我们在这个时候就不要推空数组了,我们就可以推一个对象啊,这样会简单一点,就推这个tag为这个tag,哎,然后把这个children我们给他放进去,那这个时候他就一定会有这个children准属性,那这块就不用写这个衣服了。
09:10
好,我们就先不用写这个if了,好,我们来看一下这回的情况啊,Push is not function,我们看一下这块的情况,哎,这个大概意思就对了。啊,那他这个children呢,还是没有对去推回来对吧,他这里这个children还是有问题的啊,因为我检测到这个文字结束标签了。对吧,哎,那咱们再看一下这块到底是怎么回事,STA2STA2的N减一,就是我们一定要保证STA2当中有的项呢,是一定要有车轮属性的。啊,我们看一下哦,因为你这时候是文字对吧,你这时候是这个文字,文字属性是没有,嗯。Children属性的,或者说这个时候他已经变成了这个。对吧,哎,他占顶元素,所以这个时候他这个占顶元素,他是收的是那个children,所以说咱们现在就给他的children去push啊,这加children。
10:05
好刷新刷新之后,我们接后再来看一下啊,我们随便展开,咱们来看一下它当前的一个,呃情况,这是STA2啊,但是他这个印出来的话,你看你看不见了,所以我可以给他用那个啊stringify jason.string给它印出来。啊,我们用这个jason.string可以给它印出来啊,把这个POP2。哎,用字符串的形式印出来。好,那用字符串的形式印出来的话,你就会发现啊,它就会很清楚,因为如果说你要直接打印的话,它它就相当于会干扰啊,你后续的操作会干扰,然后呢,他就没有把当前的一个状态真实的印出来,所以我就jason.string印一下啊。好,那这时候你能看出来,他就是派个div children准啊,他就归纳起来了,那我们现在把这个东西如果给它放到这个,比如说控制台啊当中,我们按下回车,那你会发现它会折叠起来,对吧,它的tag是div children是两项。
11:12
哎,然后一项H3,一项是U对吧,然后这个ul的话呢,它的children呢,是不是就是三个力,然后三个力的情况下,然后这个children的话,实际上都是T的a type是三发现了吗?这个就基本上就有那有那味了,对吧?哎,就基本上这个代码编写就有那种感觉了啊这为什么咱们现在这个案例变得特别快,原因就是因为咱们做了一个初始的这个呃储备算法。啊,是因为我们真的是做了这个储备算法题,你只要做了这个储备算法题的话呢,你就会发现其实这件事是很快的。对吧,哎。啊,你就会发现这件事其实是非常非常快,非常非常简单的。啊,他就能够把这个做做出来啊,他这样。
12:00
所以说那个储备算法题实际上是咱们这节课最值钱的东西啊,老师当时花了三四十分钟去给大家进行讲解,那现在看的话是非常非常有必要的啊,非常非常有必要的啊,这是啊,太有必要了,所以说你现在就会发现这个其实就已经站起来了,你看。没问题对吧,这个结构啊,没什么毛病。OK啊。好,那根据咱们之前的一个经验呢。对,只要这个pop tag没有用到。啊,这个pop tag其实就是用来检测,嗯,检测你的这个。就就就让他出战的对吧,哎,检测到结束标记啊,然后让他去谈战啊,那其实这块就可以看你谈的这个站是不是跟他一样。哎,这样来这样检测啊就行了,好,然后最后呢,他这个根据咱们的一个,嗯,之前咱们掌握的这么一个。就是经验,你就会发现,当循环语句结束之后,那他是不是此时战当中会遗留两个东西对吧?哎,咱们有这个经验,所以这个时候呢,咱们把这个输出输出语句我们都给它清空,然后我们在后边。
13:12
哎,给它输出循环结束之后,输出这个STA2啊,看一下STA2。那最后是空的啊。代二到最后是空的,其实他应该剩了一项,剩了一项为什么他没有印出来,这是因为到最后这一项又谈战了啊,就到最后这一项不是,呃,代和二代这里又结束标签的账。对吧,哎,遇见了结束标记之后呢,然后他这又谈战了。发现了吗?啊就是,哎,咱们看一下啊。然后这里结束标记。啊,那结束标记的话,这不是呃,检测到一个结束标记吗?检测到结束标记之后呢,呃,我们的子代二谈炸了。
14:00
所以这个STA2不能谈战,因为这坦克二一谈战的话就没有像了。对吧,哎,所以说它是实际上它循环到结束到大二是不是。呃,要到最后一个标签截止。对吧。啊,他最后一个标签截止,所以这个最后这个标签是很关键的,但是也有一种方法,就是咱们直接把这个单二,咱们先给它储存上一个children准啊用这种方法很巧妙对吧。哎,用这种方法啊,也储存上一个children准,然后这样的话刷新,你看这块就有一个children。然后这个children的话,实际上就是一个div,一个children。对吧,用这种方法也行,因为这样的话你就不用去写if语句判断它是不是最后一项了啊,我们可以在这补一个默认项children。哎,补一下默认项的children,然后他就有这个div,然后有这个children就行,但是呢,你这个时候一定记住了,他剩的这一项的children这里头啊。
15:00
Children,它是个数组,但是这数组由于它只有一个根。明白吗?所以它长度一定是零,它长度一定是零。是这样子的。所以在这种情况下呢,大家就会发现咱们这个东西就轻而易举的就把抽象语法数就给实现了啊,非常的简单啊,所以说你就会发现算法它是完全是在于之前的积累啊,只要你之前的积累快的话,那这个就很简单了,那我这个函数我就可以返回它的Q传中的第零项。哎,然后此时大二啊,就是我们之前默认放置的一项。对吧,A1项了,那么此时要返回,然后这一项的children。哎,即可,所以就返回STA2。的children的第零项。啊,STA2的第零项的children。哎,就OK了,那这样的话,我们之前就能看见这个抽象语法数了啊,他这个抽象语法数是一个,呃,但但它是一个数组,对吧?哎,这children,所以说这个children也有一个零项,因为它是一个根。
16:13
就是咱们抽象语法数要求是一个根嘛,对吧,不能是两个根啊,所以说这个时候可以加一个方括号零,那这个时候这个抽象语法数就组建出来了。啊,然后我们把所有的dialogue我们都给注释掉。我们都给注释啊。好,那这个抽象语法术呢,实际上就实现出来了。发现了吗?所以说现在大家坐到面试官面前,就可以骄傲的说说我曾经去啊,手写过抽象语法书的代码啊,那么面试官就会问,那你手写抽象语法术,你用到了什么样的算法呢?哎,你就可以骄傲的告诉他,我用到了啊,指针和站。啊,站的思路就是便利到。开始标记的时候啊,我需要怎么进站啊,然后遇见结束标记的时候需要怎么出站啊,然后怎么需要往这个数组中去进行一个秋准的维护啊,对吧?哎,然后这种思路都是非常非常关键的。
17:13
好吧,哎,这种思路都是啊,蛮关键的,好,所以说这个就是。给大家提了个醒啊,如果说你直接老师今天你想想咱们今天如果直接老师今天给你讲这个算法。啊,直接老师给你讲这个算法,那同学们是不是都听懵掉了啊,所以咱们今天就补了一个这个算法。哎,把这个算法给大家补上了,把这个算法一补上之后,大家有没有发现你瞬间就能理解这些东西了。对吧,哎,你瞬间就能理解这些知识了,好吧,哎,就很很好啊。
我来说两句