DO-WHILE语句的翻译分析程序设计
———递归下降法、输出四元式
1问题描述
1.1问题描述
设计一个DO-WHILE循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。
1.2主要任务
通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。
首先写出一个能识别DO-WHILE循环语句的文法,通过消除左递归使它符合LL(1)即递归下降法的要求,然后按照这个文法编写一个集词法分析,语法分析和语义分析为一体的程序,该程序首先可以检查输入语句是否符合词法要求,若符合则继续识别输入的语句是否符合DO-WHILE语句的文法,若符合则进行语义分析,输出用四地址代码表示的中间代码。
1.3测试数据
编写好源代码后,进行调试,根据程序要求进输入一小段程序,进行词法、语法的分析,给出分析结果。
2文法及属性文法的描述
2.1文法的描述
用扩充巴科斯-瑙尔范式(EBNF)给出的while循环语句的文法描述,如下:
<条件语句> ::=<表达式><条件运算符> <表达式>
<条件运算符>::= > | < | = | >= | <=
<表达式> ::= <表达式> + <表达式2> | <表达式> - <表达式2> | <表达式2>
<表达式2>::=<表达式2> * <表达式3> |<表达式2> / <表达式3> | <表达式3>
<表达式3>::=(<表达式>) | <标识符>|<数字>
<赋值语句>::=<标识符>=<表达式>;
2.2 DO-while循环语句文法的描述
产生式为S-> do E while A,为便于语法制导翻译将其改写如下:文法G(s)如下:
S-->DGWE (意思是do G while E)
G-->c=R
R-->dTe|d
T-->+|-|*|/
E-->aFb
F--> >|==|<
2.3 DO-WHILE循环语句的属性文法
产生式语义规则
S→do E while A S.begin:=newlabel;
E.true:=newlabel;
E.false:=S.next;
S1.next:=S.begin;
S.code:=gen(S.begin’:’‖E。code‖
gen(E.true’:’)‖S1.code‖
gen(‘goto’ S.begin)
3.语法分析方法及中间代码形式的描述
3.1语法分析方法
递归下降程序是由一组子程序组成,每个子程序对应于一个非终结(S,A,B,C,D,E,F,G ,H)。每个子程序处理相应句型中相对于此非终结符号的产生式。在定义文法时,是递归定义的,所以这些子程序也是递归的。当一个子程序调用另一个子程序时,原子程序顺序执行语句,即总是先执行被调用的子程序,然后再执行后继的程序。程序中9个子程序,其中S 是开始符号,也是递归下降分析的入口,通过调用词法分析器进行单词分析,并通过word=l.Yufa_Queue.front()来得到当前所分析到的单词,然后在递归语法分析中根据这个单词分析下一步要执行的子程序。其中要注意的是,当子程序G()和H()中出现匹配的是空字符串时,不做单词处理,该所取得的单词,应该为下一个匹配产生做准备。
它的优点是简单直观,易于构造,很多编译系统所实现。缺点是对文法要求很高,由于 递归调用多,影响分析器的效率。
其文法可以表示为:
E →T │E+T
T →F │T*F
F →i │(E )
可以用语法图来表示语言的文法,如图:
E
T
F
3.2中间代码形式描述
中间代码采用四元式输出,一个四元式是一个带有四个域的记录结构,这四个域分别称为op ﹑arg1﹑arg2及result 。域op 包含一个代表运算符的内部码。语句do c=a+b while a
E
的四元式输出形式如下:
100 ( + , a , b , T )
101 ( = , T , - , c )
102 ( j<, a , b , 100 )
4.简要的分析与概要设计
4.1全局程序概要设计
递归下降分析技术就是通过对每个非终结符编写一个子程序来实现它的操作,然后通过递归的调用来实现对输入字符串的分析,这其中还包括对输入字符串的词法分析。在词法分析的时,得到的字符单词要和关键字比较,看是否是关键字,根据比较结果进行返回相应的单词类型。单词类型主要包括界限符,关键字,常量,标识符,运算符等,每种符号都是一种类型。在语法分析程序中,根据词法得到的结果,进行判断是否是当前需要的单词类型,如果不是就说明输入字符串不能由该文法推导出来;如果是当前需要的类型,就相应得做该单词类型分支程序。
根据文法可以得到这个递归下降程序可以分析while语句,在文法的开始符号S开始进行递归调用,因此这个文法的递归中就要考虑到调用以及递归。在递归子程序中,在嵌套调用其他子程序时都是有一定条件的,当满足这个条件的时候该程序可以按照满足的条件执行下去,当没有满足程序中的条件时就会显示语法错误。
4.2词法分析
词法分析程序的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号的中间程序。词法分析检查的错误主要是挑出源程序中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中的错字。
4.3递归下降翻译器的设计
1.对每个非终结符A构造一个函数过程,对A的每个继承属性设置一个形式参数,函数
的返回值为A的综合属性,A对应的函数过程中,为出现在A的产生式中的每一个文
法符号的每一个属性都设置一个局部变量。
2.非终结符A对应的函数过程中,根据当前的输入符号决定使用哪个产生式候选。
3.每个产生式对应的程序代码中,按照从左到右的次序,对于单词符号,非终结符和语
义动作分别做以下工作。
(1)对于带有综合属性x的终结符X,把x的值存入为X,x设置的变量中。然后产
生一个匹配X的调用,并继续读入一个输入符号。
(2)对于每个非终结符号B,产生一个右边带有函数调用的赋值语句c=B(b1,b2,…,bk)
(3)对于语义动作,把动作的代码抄进分析器中,用代表属性的变量来代替对应属性
的每一次引用。
4.4语法制导翻译
在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或
语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,
必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。
5测试方法和测试结果
5.1测试方法
编写好源程序,连接运行无误后,用几个简单的while语句检测其正确性,如:输入do-while语句:Wa 则需对源程序进行检查修正,我们可以用逐步调试的方法来对源程序进行跟踪分析,找出出错的地方和原因,在对其进行修改,重新调试运行,直到输出正确的结果为止。若输出结果正确,还要多用几个while语句对其进行检测,直到所有输出结果正确。 5.2测试结果 测试结果如下: 6经验与体会 在做本次实验之前我对LL(1)文法的构成,递归下降原理不是很了解,在查阅了相关资料后,对此有了深入了解.在整个设计过程中,将词法分析做为一个单独的模块,它可以被任何语法分析调用,提高独立性.并且在编程之前就已经将程序的概要设计都做出来了,所以在编写程序的时候相对比较容易。词法分析,语法分析都是很容易的,只要理解了分析方法的实现原理, 编写程序判断输入字符串是否满足给定的文法是比较简单的。 本次的设计的不足主要体现在以下几个方面,首先,因为前几次的实验都没有把词法分析器编出来,因此程序中我没有采用词法分析器,只能够对唯一的Da=a+bWa 在这次课程设计的过程中,我也遇到了很多难题。在种种的困难中,我明白了在编写程序时要有耐心。如果你没有耐心,即使再好的思路也不会得到很好的表达,特别是在调试的过程中,对于各种各样的错误,要特别的有耐心去自习分析原因,特别是一些基本的语法错误,不能一看到错误很多就乱了阵脚,更不能轻易的放弃,半途而废。 通过此次课程设计,再次对编译原理的基础知识和一些实际操作只是有了一定的了解,对高级语言在计算机上进行编译分析的过程有了一定的了解。 7附录 源代码: /*文法G(s) s-->DGWE G-->c=R R-->dTe|d T-->+|-|*|/ E-->aFb F--> >|==|< */ #include #include #include #include char a[50],g[50][50]; char ch; int n1,i1=0,i2=0; int total=0; void S(); void D(); void G(); void W(); void E(); void R(); void T(); void F(); void main() { int p,j=0; printf("请输入do-while语句(D代表do,W代表while),并以#结束:\n"); do{ scanf("%c",&ch); a[j]=ch; j++; }while(ch!='#'); n1=j; ch=a[0]; S(); printf("\n"); if (ch=='#') { printf("输出四元式为:\n"); p=0; for(;p { printf("10%d %s\n",p,g[p]); /*输出推导式*/ } } else { printf("error\n"); printf("press any key to continue..\n"); getchar(); getchar(); return; } printf("\n"); printf("press any key to continue..\n"); getchar(); getchar(); } /*出错情况分析*/ void S() { printf("%d\tS-->DGWE\n",total);total++; D(); G(); } void D() { if(ch!='D') { printf("有非法字符%c请按回车返回!!",ch); getchar(); getchar(); exit(1);} ch=a[++i1]; } void G() { int i=i1+1; if(ch!='c'&&a[i]!='=') { printf("有非法字符%c %c请按回车返回!!",ch,a[i]); getchar(); getchar(); exit(1); } printf("%d\tG-->c=R\n",total);total++; R(); } void R() { int i; i=i1+1; i1=i1+2; ch=a[i1]; if(a[i]!='='&&ch!='d') { printf("有非法字符%c %c请按回车返回!!",a[i],ch); getchar(); getchar(); exit(1); } else { if((a[i1+1]=='+')||(a[i1+1]=='-')||(a[i1+1]=='*')||(a[i1+1]=='/')) { printf("%d\tR-->dTe\n",total);total++; i2=3; T(); } else { printf("%d\tR-->d\n",total);total++; i2=2; strcpy(g[0],"(=,c,d,_)"); W(); E(); } } } void T() { ch=a[++i1]; switch(ch) { case '+': printf("%d\tT-->+\n",total);total++; strcpy(g[0],"(+,d,e,T)"); strcpy(g[1],"(=,c,T,_)"); break; case '-': printf("%d\tT-->-\n",total);total++; strcpy(g[0],"(-,d,e,T)"); strcpy(g[1],"(=,c,T,_)"); break; case '*': printf("%d\tT-->*\n",total);total++; strcpy(g[0],"(*,d,e,T)"); strcpy(g[1],"(=,c,T,_)"); break; default: printf("%d\tT-->/\n",total);total++; strcpy(g[0],"(/,d,e,T)"); strcpy(g[1],"(=,c,T,_)"); break; } W(); E(); } void W() { ++i1; ch=a[++i1]; if(ch!='W') { printf("有非法字符%c请按回车返回!!",ch); getchar(); getchar(); exit(1); } } void E() { ch=a[++i1]; if(ch!='a') { printf("有非法字符%c %c请按回车返回!!",ch); getchar(); getchar(); exit(1); } printf("%d\tE-->aFb\n",total);total++; F(); } void F() { int i; ch=a[++i1]; i=i1+1; if(a[i]!='b') { printf("有非法字符%c请按回车返回!!",a[i]); getchar(); getchar(); exit(1); } if(i2==2) switch(ch) { case '>': printf("%d\tF-->>\n",total);total++; strcpy(g[1],"(j>,_,_,100)"); break; case '==': printf("%d\tF-->==\n",total);total++; strcpy(g[1],"(j==,_,_,100)"); break; default: printf("%d\tF-->> strcpy(g[1],"(j<,_,_,100)"); break; } else if(i2==3) switch(ch) { case '>': printf("%d\tF-->>\n",total);total++; strcpy(g[2],"(j>,_,_,100)"); break; case '==': printf("%d\tF-->==\n",total);total++; strcpy(g[2],"(j==,_,_,100)"); break; default: printf("%d\tF-->> strcpy(g[2],"(j<,_,_,100)"); break; } ch='#'; } 第一节层次分析 1.1句法结构的层次性和层次分析 1、句法结构的层次性: 一个句子或是句法格式表面上看是线性排列,内部有一种层次的透景。(松紧程度不一样) 如:他刚来。(这三个词内部的松紧程度不一样。“刚”和“来”关系紧密,“他”和“刚”关系疏远,“刚”和“来”先组合,再和“他”组合) 2、结构的三个特点: *整体性(作为一个结构,一定具有整体性。) *可分割性(作为一个结构,一定可以被分割成多个部分。) *有规则性(一个结构作为一个整体,一定是由好几部分组成的,这好几个部分组合的时候,它是按照一定规则组成的。) 如:形声字:形+声,再+字(“形声字”这个词,不是一些语素随便凑成,而是按一定规则组成的。)【有两个以上语素组合时,其内部一定有层次结构。】 *音节也是有层次的,如:天[tian55] 这个音节也是有层次的: 声调——超音段成分 声母+韵母——音段成分 韵母——韵头+韵部(韵基) 韵基——韵腹(主要元音)+韵尾 【由此,我们可以说的宽泛一点,这叫语言的层次构造,这种构造,是语言的基本特性。不论是语音、词汇、句子都有这样的层析构造问题。】 3、层次分析:在分析一个句子,或是句法结构的时候,将句法构造的层次性考虑进来,并按其构造层次,逐层进行分析,在分析时,指出每一层面的直接组成成分,并说明直接组成成分之间的关系。这种分析手段就是层次分析。 如:他刚来 “他刚来”的直接组成成分:他+刚来主谓 谓语“刚来”的直接组成成分:刚+来状中 4、层次分析包含两个内容: 二他所写的文章怎么切分? 切分:怎样断句 定性: 层次分析的三种主要表示方法:从小到大、框式、树型图: 5、怎么切分? 同一结构如何切分 例句:他所参观的工厂。 名词性偏正结构定中 他所参观? 他所参观的工厂 他所参观的工厂会导致他和工厂有领属关系 所以他所参观的工厂 他所参观怎么分析? 他参观 课程设计任务书 学生姓名:赵旭林专业班级:计算机0801班 指导教师:陈天煌工作单位:计算机科学与技术学院 题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 11月 13日 系主任(或责任教师)签名: 2010年 11月 13日 《项羽之死》 项王军壁垓下,兵少食尽,汉军及诸侯兵围之数重。 项王的部队在垓下扎营驻守,兵少粮尽,汉军及诸侯兵把他重重包围。 夜闻汉军四面皆楚歌,项王乃大惊曰:“汉皆已得楚乎?是何楚人之多也!”深夜,(项羽)听到汉军在四面唱着楚地的歌,项羽于是大为吃惊,说:“难道汉军把楚人都征服了吗?他们那边楚人为什么这么多呀!” 项王则夜起,饮帐中。有美人名虞,常幸从;骏马名骓,常骑之。 项王于是在夜里起来,在帐中饮酒。有美人名虞,一直受宠跟在项王身边;有骏马名骓(项羽)一直骑着。 於是项王乃悲歌慨,自为诗曰:“力拔山兮气盖世,时不利兮骓不逝。 这时候,项羽不禁慷慨悲歌,自己作诗(吟唱)道:“力量能拔山啊,英雄气概举世无双,时运不济时骓马不再奔跑! 骓不逝兮可柰何,虞兮虞兮柰若何!” 骓马不奔跑可将怎么办,虞姬呀虞姬,(我)将怎么安排你才妥善?” 歌数阕,美人和之。项王泣数行下,左右皆泣,莫能仰视。 项王唱了几遍,美人虞姬在一旁应和。项王眼泪一道道流下来,左右侍者也都跟着落泪,没有一个人忍心抬起头来看他。 於是项王乃上马骑,麾下壮士骑从者八百馀人,直夜溃围南出,驰走。 在这种情况下,项羽竟骑上马,部下壮士八百多人骑马跟在后面,当夜突破重围,向南冲出,(项羽)鞭策着马逃跑。 平明,汉军乃觉之,令骑将灌婴以五千骑追之。项王渡淮,骑能属者百馀人耳。天刚亮的时候,汉军才发觉,命令骑将灌婴带领五千骑兵去追赶。项王渡过淮河,部下壮士能跟上的只剩下一百多人了。 项王至阴陵,迷失道,问一田父,田父绐曰:“左”。 项王到达阴陵,迷了路,去问一个农夫,农夫骗他说:“向左边走。” 左,乃陷大泽中。以故汉追及之。项王乃复引兵而东,至东城,乃有二十八骑。项王带人向左,陷进了大沼泽地中。因此,汉兵追上了他们。项王于是又带着骑兵向东跑,到达东城,这时就只剩下二十八人。 汉骑追者数千人。项王自度不得脱。 汉军骑兵追赶上来的有几千人。项王自己估计不能逃脱了。 谓其骑曰:“吾起兵至今八岁矣,身七十馀战,所当者破,所击者服,未尝败北,遂霸有天下。 对他的骑兵说:“我带兵起义至今已经八年,亲自打了七十多仗,我所抵挡的敌人都被打垮,我所攻击的敌人无不降服,从来没有失败过,因而能够称霸,据有天下。 然今卒困於此,此天之亡我,非战之罪也。今日固决死,愿为诸君快战,必三胜之,为诸君溃围,斩将,刈旗,令诸君知天亡我,非战之罪也。” 可是如今终于被困在这里,这是上天要灭亡我,决不是作战的过错。今天必死无疑,我愿意给诸位打个痛痛快快的仗,一定胜它三回,给诸位冲破重围,斩杀汉将,砍倒军旗,让诸位知道的确是上天要灭亡我,决不是作战的过错。 课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2011年月日 系主任(或责任教师)签名: 2011年月日 DO-WHILE循环语句的翻译程序设计 (LL(1)法、输出三地址表示) 1. 系统描述 1.1 设计目的 通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 1.2 设计内容及步骤 对循环语句: DO〈赋值语句〉WHILE 〈表达式〉 (1)按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。 (2)按给定的题目给出语法分析方法的思想及分析表设计。 (3)按给定的题目给出中间代码序列的结构设计。 (4)完成相应的词法分析、语法分析和语义分析程序设计。 (5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 2. 文法及属性文法的描述 2.1 文法描述 K -> do L while S L -> SP P -> ;SP | ε S -> iQE E -> TG G -> +TG | -TG | εT -> FR R -> *FR | /FR | εF -> (E) | i Q -> = | < | > 2.2 属性文法的描述 第5章流程控制语句 JavaScript程序是由若干个语句组成的,每一个语句以分号作为结束符。语句可以很简单,也可以很复杂。其中,改变程序正常流程的语句称为控制语句。流程控制语句是用来控制程序中各语句执行顺序的语句,是程序中基本却又非常关键的部分。流程控制语句可以把单个语句组合成有意义的、能完成一定功能的小逻辑模块。本章内容包括: ?顺序控制语句; ?选择控制语句; ?循环控制语句; ?其他流程控制语句。 通过本章学习,读者应该对几种流程控制语句有很深的理解,并可以利用这几种流程控制语句编写简单的程序。 5.1 顺序控制语句 JavaScript语言中,顺序控制语句是最简单的语句。其有如下特点:所有语句按照一定的顺序执行,每一条语句只执行一遍,不重复执行,也没有语句不执行。JavaScript语言中的顺序控制语句包括表达式语句,函数调用语句,空语句和复合语句等。 5.1.1 表达式语句 表达式后面跟一个分号就构成了一个表达式语句。最常见的表达式语句为赋值语句。赋值语句是在一个赋值表达式后跟一个分号形成的,程序中很多计算都由赋值语句完成。 【示例5-1】演示几个表达式语句。其代码如下所示。 var m=4; //把4赋给变量m var n=”hello world”; //把字符串hello world赋值给n i=m+n; //把变量m和n的和赋值给变量i 实际上,任何表达式都可以加上分号而成为语句。 【示例5-2】变量i自增1。 i++; //变量i的值加1 注意:有些语句写法虽然是合法的,但是由于其没有保留计算结果,因而并没有实际意义。如以下代码: a-b; i++-1; 现代汉语语法的五种分析方法 现代汉语语法的五种分析方法 很有用,请好好学习之。 北语之声论坛专业精华转贴 现代汉语语法的五种分析方法是语法学基础里 很重要的一个内容,老师上课也会讲到,我在这 里把最简略的内容写在下面,希望能对本科生的专业课学习有所帮助 详细阐释中心词分析法、层次分析、变换分析法、语义特征分析法和语义指向分析的具体内涵:一. 中心词分析法: 分析要点: 1.分析的对象是单句; 2.认为句子又六大成分组成——主语、谓语(或述语)、宾语、补足语、形容词附加语(即定语)和副词性附加语(即状语和补语)。 这六种成分分为三个级别:主语、谓语(或述语)是主要成分,宾语、补足语是连 带成分,形容词附加语和副词性附加语是附加成分; 3.作为句子成分的只能是词; 4.分析时,先找出全句的中心词作为主语和谓 语,让其他成分分别依附于它们; 5.分析步骤是,先分清句子的主要成分,再决定有无连带成分,最后指出附加成分。 标记: 一般用║来分隔主语部分和谓语部分,用══标注主语,用——标注谓语,用~~~~~~标注宾语,用()标注定语,用[ ]标注状语,用< >标注补语。 作用: 因其清晰明了得显示了句子的主干,可以一下子把握住一个句子的脉络,适合于中小学语文教学,对于推动汉语教学语法的发展作出了很大贡献。 还可以分化一些歧义句式。比如:我们五个人一组。 (1)我们║五个人一组。(2)我们五个人║一组。 总结:中心词分析法可以分化一些由于某些词或词组在句子中可以做不同的句子成分而造成的歧义关系。 局限性: 1.在一个层面上分析句子, 层次性不强; 2.对于一些否定句和带有修饰成分的句子,往往难以划分; 如:我们不走。≠我们走。 封建思想必须清除。≠思想清除。 3. 一些由于句子的层次关系 不同而造成的歧义句子无法分析; 如:照片放大了一点儿。咬死了猎人的狗。 二. 层次分析: 含义: 在分析一个句子或句法结构时,将句法构造的层次性考虑进来,并按其构造层次逐层进行分析,在分析时,指出每一层面的直接组成成分,这种分析就叫层次分析。 朱德熙先生认为,层次分析不能简单地将其看作是一种分析方法,而是应当看做一种分析原则,是必须遵守的。(可以说说为什么) 层次分析实际包含两部分内容:一是切分,一是定性。切分,是解决一个结构的直接组成成分到底是哪些;而定性,是解决切分所得的直接组成成分之间在句法上是什么关系。 程序流程控制语句:选择语句 https://www.wendangku.net/doc/6915195774.html,网站制作 2011年9月1日 Java语言中的程序流程控制语句有三种:顺序结构、选择结构和循环结构。其中顺序结构最简单,程序依次执行各条语句。Java的每条语句一般以分号(“;”)作为结束标志。所以本章重点讲解选择结构和循环结构。 1、选择语句 在程序设计时,经常需要使用选择结构在程序中完成逻辑判断和选择功能,这就需要使用到选择语句。Java中的选择语句包括if语句、if-else语句和switch语句。选择语句用来控制选择结构,对选择条件进行判断,并根据判断结果选择要执行的程序语句,改变程序执行流程。 2、if选择语句 在实际生活中,经常会需要做一些逻辑判断,并根据逻辑判断结果做出选择。例如,当一个男孩子向一个非常理智的女孩子求婚时,这个女孩子思考的逻辑可能是这样的: 如果你有100万 那么,我就嫁给你! 在这里,女孩子嫁给男孩子这个过程的实施,必须以“你有一百万”为前提。只有逻辑判断“你有一百万”这一前提条件为真时,“那么,我就嫁给你!”这个行为才能得到执行。在生活当中,类似这样的情形是很常见的。 相应地,在Java程序设计语言中,也有相应的条件语句来完成类似的逻辑判断和有选择地执行这样的功能,这就是if语句。if语句的语法格式如下: if(条件表达式) 语句 或者 if(条件表达式){ 一条或多条语句 } if语句执行的过程如下: 1.对if后面括号里的条件表达式进行判断。 2.如果条件表达式的值为true,就执行表达式后面的语 句或后面大括号里的多条语句。 3.如果条件表达式的值为false,则跳过if语句,执行 下一条语句。 流程控制结构 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】 (单元教案首页) 单元标题第3章流程控制结构 教学时数:()学时,其中理论()学时、实验()学时、上机()其它()学时,其它是指: 教学目的与要求: 1.理解程序的的三大控制结构。 2.掌握选择结构实现语句的用法编程应用 3.掌握循环结构实现语句的用法及其编程应用。 4.理解并掌握各种跳转语句的使用方法。 主要教学内容: 1.程序的控制结构:顺序、选择、循环。 2.选择结构语句:if语句(两种格式)和switch语句、程序举例。 3.循环结构语句:for语句、while、语句、do-while语句、三种循环语句的互相转化、程序举例。 4.控制结构跳转语句:break语句、continue语句、return语句 教学重点与难点: 重点:if语句、switch语句、for语句、while语句、do-while语句 难点: switch语句、选择结构编程应用、循环结构编程应用、跳转语句的编程应用课后作业: 1.课本P66 综合练习三:第一题~第四题 2.上机实习:实习3:Java流程控制 课后体会: 兰州资源环境职业技术学院教师授课教案 —————————————————————— 第3章流程控制结构 一、本章主要内容: 本章主要讲述Java程序的基本控制结构和控制语句,使得学生能利用这三种结构来解决一些比较复杂的问题。 Java程序的基本控制结构有三种:顺序结构、选择结构、循环结构。 二、具体授课内容: 概述 选择结构 循环结构 跳转语句 三、本章授课思路: 1. 回顾C语言中结构化程序设计方法所所用的程序三大控制结构(顺序结构、选择结构、循环结构)语法知识,以复习回顾的方式引入讲解Java语言的程序控制结构知识(和 C语言用法一致),学生易于理解记忆。 2.具体讲解选择结构(if、switch)和循环结构语法(while、for、do-while)及其编程用法的典型程序编写举例,使学生理解掌握Java语言中控制结构的使用特点及编程技巧。 将两种输入数据的编程方法融入到控制结构用法的编程举例的程序中,使学生对输入数据方法的能够有一定的理解掌握和编程使用,结合在后续第4章面向对象的程序设计的方法的具体学习中再加强理解和掌握。 4.课堂上通过练习和讲解第3章课后习题,加强和巩固学生对所学知识的理解和掌握使用。 兼语句 ●林秀琴 你发现没有,在生活里一个人可以身兼不同的角色,比如你的妈妈,她既是你的妈妈,也是你爸爸的妻子,又是你外婆的女儿,还是你姨的姐妹。再比如你自己,你是你妈妈的孩子,又是你老师的学生,还是你弟弟的哥哥。有意思吧?汉语的句子也有这样的能力。有时候,一个句子中有一个部分,既是主语,又是宾语,它身兼两种角色,具有两个能力,这种句子就叫“兼语句”。比如“朋友请我看电影”这个句子,“朋友”“请”的是“我”,谁“看电影”呢?也是“我”,——“我”是前边主语的宾语,又是后边谓语的主语,就好像你是你妈妈的孩子、你弟弟的哥哥一样。 有点复杂,是不是?没关系,聪明的你,学习以后就明白了。 1、表示使令意义(英文翻译)的兼语句 汉语里有一类词表示让别人做什么,我们说这类词具有使令意义,如“请、让、叫、要求、同意、派、邀请、约”。 (1)肯定式(请加英文) 主语+动词1+兼语+动词2+宾语 朋友请我去看电影。 妈妈让我快写作业。 老师叫我去他的办公室。 老板要求他三点到公司。 (2)否定式(英文) 主语+不/没+动词1+兼语+动词2+宾语 妈妈不同意我去中国。 他没邀请汤姆参加生日晚会。 老板没派他去纽约。 2、第一个动词是“有”的兼语句 (1)肯定式(请加英文) 主语+ 有+ 兼语+ 谓语(动词/形容词) 我有一个朋友去中国留学了。 我有一个同学很幽默。 (2)否定式(英文) 主语+ 没有+ 兼语+ 谓语(动词/形容词) 那个学校没有人会说中文。 我们班没有人去打球。 3、第一个动词是表示喜好意义的兼语句 主语+(不)动词1+兼语+动词/形容词 老师夸我很聪明。 我喜欢他很幽默。 我讨厌他总开玩笑。 我不喜欢他总迟到。 第二讲层次分析法 2.1 句子成分分析及其局限 句子成分分析法又叫中心词分析发。要点大致如下: (一)以单句为分析对象。 (二)句子有六大成分——主语、述语(谓语)(主要成分);宾语、补足语(黎锦熙,如“他成了班长 ..”“他 们请我做报告 ...”)(连带成分);形容词性附加语(今天的定语)、副词性附加语(状语和补语)(附加成分)。 (三)句子成分原则上只能是词。 (四)分析手续:先找出全句主要成分主语和述语,再决定述语后有无连带成分宾语或补语,最后指出句中所有的附加成分。 句子成分分析发的优点:可以让人一下子把握住句子的脉络。在分析长句时,更能显示其优越性:(1)我国首升空的“神州-3号”模拟载人飞船经过264个小时在太空运行之后按照原先预定的时间安全、准确地返回原先计算好的我国西北某地区的地面。 句子成分分析法的局限性: 第一:离了枝叶,主干不成立或站不住,或不是原句子的意思。 (2)他贪图安逸。 (3)于福的老婆是小晴的娘.。 第二:离了枝叶,主干虽能成立,但意思发生了变化。 (4)我们都不懂。(我们懂) (5)祥林嫂死了当家人。(祥林嫂死了) (6)不合格的党员清除了。(党员清除了) 第三:不能有效分化歧义。 (7)照片放大了一点。(“放得不是很大”,“放得过于大了”) (8)我也去上海。 第四:不利于发现某些词语的用法特点。 (9)a.我们白白浪费了几个小时。*b.我们白浪费了几个小时。 2.2 句法构成的层次性 一个句子或句法结构总是按一定的句法规则一层一层地进行组合的。例如: (10)他刚到。 “刚”跟“他”不发生直接的关系,“刚”先跟“到”构成修饰关系,然后“刚到”一起再跟“他”构成主谓关系。这种构造特性一般称为“句法构造的层次性”。 2.3 关于层次分析法 WHILE循环语句的翻译程序设计(简单优先法、输出四元式) 1 需求说明或问题描述 1.1 问题描述 对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。 1.2 需求说明 1 写出符合给定的语法分析方法的文法及属性文法 2 完成题目要求的中间代码四元式的描述 3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计 4 设计若干用例,上机通过测试 2 文法及语法设计 2.1文法及属性文法: 文法G=(V N ,V T ,P ,S) 其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;} P={ S -> w(B){E} E -> C C -> CA C -> A A -> iPA A -> i; P -> +|-|*|/ B -> iTi B-> i T -> >|<|>=|<=|== } 2.2 语法分析方法描述及语法分析表设计 2.2.1 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将现代汉语语法分析:第一节 层次分析
WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)
《项羽之死》逐只逐句的翻译
DO-WHILE循环语句的翻译程序设计
JavaScript流程控制语句
现代汉语语法的五种分析方法
程序流程控制语句
流程控制结构
兼语句
__现代汉语语法研究层次分析法
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)