<b>手把手教你写脚本引擎(四)——简单的高级语言(2,处理语法)</b>[VC/C++编程]
本文“<b>手把手教你写脚本引擎(四)——简单的高级语言(2,处理语法)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
首先是词法解析器.我们仍旧可以利用《构造可配置语法解析器》前半部份的办法人脑画出一张符合的DFA,这个时刻我们可以手工来实现.用于词法解析器的DFA只有两种状况,一种是普通状况,另一种是终结状况.所以我们可以很机械地将DFA用C++写出来.
我们要为状况编号.编号要持续,并且要从0开始,这样的话C++的编译器普通城市为switch-case的代码生成一张表,用于快速跳转.然后用下面的办法.
1:将输入的指针Input复制出一个副本,叫Current;给出一个同范例的指针Last,将其赋值为NULL;利用一个变量Status来记录当前的状况.初始化状况,普通为了便利我们把初始状况编号成0.
2:做一个死循环不断的计算新Status.关于某个Status我们老是可以知道输入什么字符跳转到什么新的Status上去.差别的人写出来的DFA大概会有所辨别.我们首先判断当前的Status是不是终结状况,假如是的话将Current赋值给Last,然后持续往下走.我们从Current指针拿出一个字符,然后计算新Status.假如Current不满意要求那么完毕循环,假如Current满意要求那么改变Status并让Current指向新的位置.
3:因为字符串老是有限的,所以这个循环老是会完毕.完毕了之后,我们查抄Last.假如Last仍旧是NULL,那么代表输入的字符串是有问题的.假如不是,那么我们所需求的一个暗号就从Input开始到Last完毕了.假如暗号的范例有需求保存的话,那么我们只需求增添一个新的代表范例的变量,在每一次改正Last的时刻改正这个保存范例的变量就行了.因为一个终结状况只能代表一种范例的完毕(反过来不成立,一种范例大概有好几个终结状况).
然后是语法解析.普通来说,利用《若何手写语法解析器》中描写的办法实现一个语法解析器的话是很简单的,但是一个主要问题就是假如一门语言很复杂,分外是操作符分外多的话,这些函数写起来会很乱,因此每一个文法产生式的处理函数的命名和注释就变得相当重要了.为了简化这件事情,我们还有另一种专门用来处理操作符的办法,并且是高度可配置的.为了简化,我仅给出二元操作符和前缀操作符的处理办法.后缀操作符不常见,需求的话自己想办法吧,在上一篇文章中的语法定义中并没有呈现后缀操作符.
在这种办法中,我们把重点放在不包含改正优先级的括号的表达式中.碰到一个用于改正优先级的括号的时刻,只要递归一下就行了.目前,我们通过词法解析,已经得到了很多暗号,然后就利用以下的办法来生成一颗精确的语法树:
1:我们需求定义两个指针,第一个用于保存根节点,第二个用于保存当前节点.在解析的历程中,根节点会常常改变,当前节点也是.
2:取出一个单元.一个单元指的是一个用括号包含起来的完好的表达式、一个函数调用、一个常量或变量和仅由前缀操作符与单元构成的整体.举个例子,1是单元,a是单元,function(param1,param2+param3)是单元,(a*b+c*d)是单元,-(a+b)也是单元.但是-a+b就不是单元了.单元内部大概有表达式,我们可以递归下去.取出单元今后,就把根节点和当前节点指向这个单元.
3:一个精确的表达式老是由单元和二元操作构成的,假如在以下的步骤中出错的话,那么可以直接肯定输入的表达式的语法不精确.我们做一个死循环一向到碰到右括号、逗号等这些完毕表达式的暗号为止,关于每一个输入履行第4步.
4:取出一个二元操作符和一个单元.然后从当前节点往父节点找,一向到根节点大概父节点优先级比当前的二元操作符小的二元操作符为止.假如找到根节点,那么整个根节点将作为二元操作符的左操作数,单元作为右操作数,根节点更新,当前节点指向单元.假如不是的话,将找到的节点(这个节点的父节点的优先级比自己小)从父节点脱离,整个节点作为操作符的左操作数,单元作为右操作数,然后用这个二元操作符接上父节点.
5:当3与4举行不下去的时刻,我们就得到了一棵完好的表达式语法树了.当然,假如中间出错的话,我们该当输出错误信息.这个时刻要不要持续往下走就自己看着办吧,因为举行错误恢复的话,接下去的错误信息会很丢脸,就像VC++一样.
我给一个例子来阐明若何处理这些事情.目前我们要解析1+2*3+4.这个算法将会产生一个精确的语法树”1”,然后改正成精确的语法树”1+2”,然后改正成精确的语法树”1+2*3”,最后产生完好的精确的语法树.
第一步,产生一个单元的精确的语法树:
以上是“<b>手把手教你写脚本引擎(四)——简单的高级语言(2,处理语法)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |