发表日期: 2021-04-20 14:24:47 浏览次数:111
沧县网站推广【沧县办理400电话】沧县SEO优化、沧县微信公众号APP客户端小程序开发、沧县网站托管、沧县APP开发
沧县,隶属于河北省沧州市,位于位于河北省东南部、冀中平原东部。全县总面积15.33万公顷。 [1] 沧县属暖温带半湿润大陆性季风气候, [2] 县辖4个镇、15个乡, [3] 县政府驻沧州市新华区。 [4] 截至2018年末,沧县总人口740889人。 [2]
北魏熙平二年(517年),分冀瀛二州之地置沧州。民国二年(1913年)沧州改名沧县,属直隶省渤海道。1983年11月,沧县属沧州市辖。 [2] 沧县境内京沪铁路、京福公路纵贯南北,朔黄铁路由沧县腹地东西穿过。 [5] 2011年11月,沧县被文化部命名为“中国民间文化艺术之乡”。 [6] 县境内有铁狮子、杜林登瀛桥、纪晓岚墓等旅游景点。 [7-8]
2018年,沧县地区生产总值完成207.4亿元,增长8%。其中:第一产业22.4亿元,增长11.3%;第二产业78.9亿元,增长6%;第三产业106.1亿元,增长9.2%。 [9] 2020年9月,入选河北省食品产业强县(市、区)(培育型)名单。
图11-27(b) 为平衡括号串构建分析树的函数
现在可以一行行考虑图11-27b所示的程序了。第(1)行是两个局部变量firstB
和secondB
的声明,这两个局部变量的作用是存放在尝试产生式(2)的情况下对B 的两次调用所返回的分析树。第(2)行会测试输入的下一个终结符是否为(
。如果是,我们就将在产生式(2)的右部中查找实例,如果不是,就要假设使用的是产生式(1),而且ε 就是该平衡串。
在第(3)行,我们要递增nextTerminal
,因为当前输入(
已经匹配上了产生式(2)右部中的(
。我们现在已经让输入游标处在恰当的位置,它对应的对B 的调用将为产生式(2)右部中的第一个<B>找到平衡串。对B的这次调用是在第(4)行发生的,而该调用返回的树被存储在变量firstB
中,它随后会被装配成与当前对B 的调用对应的分析树。
第(5)行要检查是否仍然有能力找到平衡串。也就是说,首先要确定第(4)行对B 的调用没有失败。然后测试nextTerminal
当前的值是否为)
。回想一下,当B返回时,nextTerminal
指向要用来形成平衡串的下一个输入终结符。如果要匹配产生式(2)的右部,而且已经匹配了(
与第一个<B>,那么就必须匹配)
,这就解释了该测试的第二部分。只要该测试的任何一部分失败,当前对B 的调用就会在第(11)行失败。
若通过了第(5)行的测试,则在第(6)和第(7)行要把输入游标移过刚发现的右括号,并再次调用B,以匹配产生式(2)中的最后一个<B>。返回的树被临时存储在secondB
中。
如果第(7)行对B 的调用失败,secondB
的值就会是FAILED
。第(8)行会检测这种情况,而且当前对B 的调用也会失败。
第(10)行代表的是成功找到平衡括号串的情况。我们要返回由makeNode4
构建的树。该树具有标号为‘B
’的根节点以及4个孩子。第一个是标号为(
的叶子节点,它是由makeNode0
构造的。第二个是存储在firstB
中的树,它是通过第(4)行对B 的调用产生的分析树。第三个是标号为)
的叶子节点,第四个则是由第(7)行对B 的第二次调用返回的分析树,它存储在secondB
中。
只有在第(5)行的测试失败时,才会使用第(11)行。第(12)行处理的是第(1)行的初始测试没能在第一个字符的位置找到(
的情况。在这种情况下,假设产生式(1)是正确的。该产生式的右部为ε,因此我们没有销毁任何输入,但返回了一个由makeNode1
创建的节点,其标号为B 而且有一个标号为ε 的子节点。
假设在输入中有终结符串()()ENDM
。这里的ENDM
代表字符'\0'
,它是在C语言中用来标记字符串结尾的。图11-27a中main
函数对B的调用确定了(
是当前的输入,而且第(2)行的测试会成功。因此,nextTerminal
在第(3)行会前移,而且第(4)行会进行对B的第二次调用,表示为图11-28中的“调用2”。
图 11-28 在处理输入()()ENDM
时进行的调用
在调用2中,第(2)行的测试失败,因此在第(12)行会返回图11-29a所示的树。现在回到调用1,其中在第(5)行时,nextTerminal
指向的是)
,而且图11-29a的树在firstB
中。因此,第(5)行的测试会成功。我们在第(6)行前移nextTerminal
,并在第(7)行调用B。这是图11-28中所示的“调用3”。
在调用3中,我们在第(2)行成功,在第(3)行前移nextTerminal
,并在第(4)行调用B,该调用就是图11-28中的“调用4”。就和调用2一样,调用4也会在第(2)行的测试失败,并在第(12)行返回一棵类似图11-29a的树但有所不同。
我们现在回到了调用3,其中nextTerminal
仍然指向)
,firstB
(是此次对B的调用的局部变量)存放着一棵类似图11-29a这样的树,而且有着第(5)行的控制。这次测试会成功,而且我们会在第(6)行前移nextTerminal
,所以它现在指向的是ENDM
。我们在第(7)行进行对B的第五次调用。该调用在第(2)行的测试会失败,并在第(12)行返回图11-29a的另一个副本。这棵树称为对应调用3的secondB
的值,并且第(8)行的测试也失败了。因此,在调用3的第(10)行,我们要构建如图11-29b所示的树。
至此,调用3在第(8)行成功地返回到调用1,这时调用1的secondB
存放着图11-29b中的树。就像在调用3中那样,第(8)行的测试会失败,而且我们在第(10)行要构建一棵有着新根节点的树,其第二个孩子是图11-29a所示树的一个副本(这棵树被存放在调用1的firstB
中),而且它的第四个孩子是图11-29b中的树。得到的树被main
函数放置在parseTree
中,它的样子如图11-29c所示。
图 11-29 由对B 的递归调用构建的树
虽然不能针对所有文法,但可以将图11-27中用到的技术扩展到适用于很多文法。关键要求是,对各语法分类<S>,如果存在不止一个以<S>为左部的产生式,那么通过查看当前唯一的终结符(通常被称为前瞻符号),就可以确定那个需要得到尝试的以<S>为左部的产生式。例如,在图11-27中,我们的决策就是,只要前瞻符号是(
,就选取右部为(<B>)<B>第二个产生式,而要是前瞻符号为)
或ENDM
,就选定右部为ε 的第一个表达式。
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: https://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878