发表日期: 2021-04-20 14:25:38 浏览次数:112
沧县400电话办理【沧县网站公司】沧县百度优化、沧县域名注册、沧县网店美工、沧县微信公众号托管
沧县,隶属于河北省沧州市,位于位于河北省东南部、冀中平原东部。全县总面积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来说,我们声明所陈述的策略是行得通的,但并未对此加以证明。不过,如果拥有自己相信行得通的决策,那么就可以按照如下方式为各语法分类<S>设计函数S。
1. 检查前瞻符号,并决定要尝试哪个产生式。假设被选中的产生式右部为X1X2…Xn。
2. 对i=1、2、…、n,为Xi 进行以下操作。
(a) 如果Xi 是终结符,检查前瞻符号是否为Xi 。如果是,则前移输入游标。如果不是,那么这次对S 的调用就失败了。
(b) 如果Xi 是语法分类,比方说是<T>,就调用对应该语法分类的函数T。如果T 以失败状态返回,就说明对S 的调用失败了。如果T 成功返回,就把返回的树存储起来以待随后使用。
如果在考虑完所有的Xi 之后都没有失败,就创建各孩子按次序分别对应X1、X2、…Xn 的新节点,以组成一棵要返回的分析树。如果Xi 是终结符,那么Xi 的孩子就是新创建的以Xi 为标号的叶子节点。如果Xi 是语法分类,那么Xi 的子节点就是在与Xi 对应的函数完成调用时返回的树的根节点。图11-29就是这种树构建过程的示例。
如果语法分类<S>表示所含字符串有待识别和分析的语言,就要在第一个输入的终结符处放置输入游标,开始分析过程。如果输入在语言L(<S>)中,对函数S 的调用就会使得对应该输入的分析树被构建起来,而如果不在的话,对S 的调用就会返回失败。
1. 给出针对以下输入,图11-27所示的程序所执行的调用序列,其中每种情况下最后都跟着端记号ENDM
符号。
(a) (())
(b) (()())
(c) ())(
2. 考虑以下表示数字的文法。
<数字>→<数码><数字> | ε
<数码>→0 | 1 | … | 9
设计对应该文法的递归下降分析器,也就是说,编写两个函数,其中一个对应<数字>,另一个对应<数码>。大家可以遵照图11-27中的格式,并假设存在makeNode1
这种根节点具有指定数目子节点的树。
3. ** 假设把习题2中对应<数字>的生成式写为
<数字>→<数码><数字> | <数码>
或
<数字>→<数字><数码> | ε
是否还能够设计递归下降分析器?为什么?
(1) <L> → ( <E> <T>
(2) <T> → , <E> <T>
(3) <T> → )
(4) <E> → <L>
(5) <E> → 原子
图 11-30 对应表结构的文法
4. * 图11-30所示的文法定义了非空表,表的元素是由逗号分隔并由括号包围的。元素可以是原子或表结构体。在这里,<E>代表元素,<L>表示表,而<T>则对应“尾部”,也就是,要么是闭合的)
,要么是由逗号和以)
结尾的元素构成的配对。为图11-30中的文法编写递归下降分析器。
正如我们在6.7节中看到过的,递归函数调用通常是用活动记录栈实现的。因为递归下降分析器中的函数完成的工作非常具体,所以可以用一个检查表并操作栈的函数来代替这些函数。
要记得,对应语法分类<S>的函数S 首先要决定使用哪个产生式,然后经过一系列步骤,每个步骤都对应着所选产生式右部中的一个符号。因此,可以维持一个大致与活动记录栈对应的文法符号栈,而符号和语法分类都被放置在该栈中。当语法分类<S>位于栈顶时,首先要确定正确的产生式。然后用所选产生式的右部替换<S>,其中右部的左端位于栈顶。如果是终结符位于栈顶,就要确定它是否与当前输入符号匹配。如果是,我们就将其弹出栈并前移输入游标。
要从直觉上了解这种安排为何起作用,先假设递归下降分析器刚调用过对应语法分类<S>的函数S,而且选定的产生式右部为a<B><C>。那么对应S的这一活动记录会在以下4个时候处于活动状态。
1. 在检验a
是否在输入中时;
2. 在进行对B 的调用时;
3. 在该调用返回而且C 被调用时;
4. 在对C 的调用返回而且S 完成调用时。
如果我们在表驱动分析器中直接用右部的符号(本例中是a<B><C>)替换<S>,那么该活动记录栈会在控制权返回对应递归下降分析器中S 的活动时的输入位置曝光这些符号。
1. 第一次曝光的是a
,而且我们会检测a
是否在输入中,就像函数S 所做的那样。
2. 第二次,紧接第一次之后发生,S 会调用B,而<B>会位于栈顶,这会造成相同的行为。
3. 第三次,S 调用C,不过这里是<C>在栈顶,而且完成的是相同的工作。
4. 第四次,S 返回,而且我们不会发现更多替代<S>的符号。因此,活动记录栈中此点以下的符号之前存放在<S>中,但现在被暴露在外了。类似地,在S 的活动记录以下的活动记录在递归下降分析器中会得到控制权。
如果不想写一系列的递归函数,也可以构建分析表(parsing table),它的每一行都对应着语法分类,每一列对应着可能的前瞻符号。在表示语法分类<S>的那一行中,对应前瞻符号X 的项是前瞻符号为X 时展开<S>必须用到的以<S>为左部的产生式的编号。
分析表中的某些项可能为空。假设需要展开的语法分类<S>,而且前瞻符号为X,但我们发现表示<S>的那行中对应X 的那一项为空,就说明分析已经失败了。这种情况下,可以确定该输入不在此语言中。
图11-31表示了对应图11-25所示平衡括号串无二义文法的分析表。该分析表相当简单,因为其中只有一个语法分类。该表所表示的策略与11.6节中的示例所采用的策略是相同的。如果前瞻符号是(
,那么展开时用到的是产生式(2),也就是<B>→(<B>)<B>,否则展开时就要借助产生式(1),或者说<B>→ε 。我们很快就会看到这样的分析表是如何使用的。
| ( ) |
|
---|---|---|
<B> | 2 1 | 1 |
图 11-31 对应平衡括号串文法的分析表
图11-32所示的是另一个分析表,它对应着图11-33所示的文法,该文法是图11-6所示语句文法的一个变种。
| w | c | { | } | s | ; |
|
---|---|---|---|---|---|---|---|
<S> | 1 | 2 | 3 | ||||
<T> | 4 | 4 | 5 | 4 |
图 11-32 对应图11-33所示文法的分析表
图11-33中的文法之所以具有这种形式,是为了可以用递归下降(或者等价地,用这里描述的表驱动分析算法)进行分析。要知道为什么这种形式是必要的,首先考虑一下图11-6所示文法中对应<L>的产生式。
<L>→<L><S>|ε
如果当前的输入是开始语句的s
这样的终结符,那么可知<L>一定至少由右部为<L><S>第一个生成式展开一次。不过,如果不检查接下来的输入并弄清语句列中共有多少条语句,就没法确定要进行多少次展开。
(1) <S> → w c<S>
(2) <S> → { <T>
(3) <S> → s ;
(4) <T> → <S><T>
(5) <T> → }
图 11-33 可进行递归下降分析的、表示简单语句的文法
我们在图11-33中用到的方法是,记住程序块是由左花括号后面跟上0条或更多语句以及右花括号组成的。我们把这0条或更多语句以及右花括号称为“尾部”(tail),并用语法分类<T>表示它。图11-33中的产生式(2)说明,语句可以由左花括号后面加上尾部构成。产生式(4)和产生式(5)则表示尾部要么是语句后面跟上尾部,要么直接就是个右花括号。
备案号: 苏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