北京理工大学软件学院编译原理第一次实验作业

合集下载

【参考借鉴】编译原理-作业答案.docx

【参考借鉴】编译原理-作业答案.docx

《编译原理》第一次作业参考答案一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)?1.bR(abRabR)R所有含有偶数个a的由a和b组成的字符串.2.cRa(a|c)Rb(a|b|c)R|cRb(b|c)Ra(a|b|c)R答案一:所有至少含有1个a和1个b的由a,b和c组成的字符串.答案二:所有含有子序列ab或子序列ba的由a,b和c组成的字符串.说明:答案一要比答案二更好,因为用自然语言描述是为了便于和非专业的人员交流,而非专业人员很可能不知道什么是“子序列”,所以相比较而言,答案一要更“自然”.二、设字母表∑={a,b},用正则表达式(只使用a,b, ,|,R,+,?)描述下列语言:1.不包含子串ab的所有字符串.bRaR2.不包含子串abb的所有字符串.bR(ab?)R3.不包含子序列abb的所有字符串.bRaRb?aR注意:关于子串(substring)和子序列(subsequence)的区别可以参考课本第119页方框中的内容.~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~《编译原理》第二次作业参考答案一、考虑以下NFA:1.这一NFA接受什么语言(用自然语言描述)?所有只含有字母a和b,并且a出现偶数次或b出现偶数次的字符串.2.构造接受同一语言的DFA.答案一(直接构造通常得到这一答案):答案二(由NFA构造DFA得到这一答案):二、正则语言补运算3.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串.1.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串.规律:构造语言L的补语言L’的DFA,可以先构造出接受L的DFA,再把这一DFA的接受状态改为非接受状态,非接受状态改为接受状态,就可以得到识别L’的DFA.说明:在上述两题中的D状态,无论输入什么符号,都不可能再到达接受状态,这样的状态称为“死状态”.在画DFA时,有时为了简明起见,“死状态”及其相应的弧(上图中的绿色部分)也可不画出.2.再证明:对任一正则表达式R,一定存在另一正则表达式R',使得L(R')是L(R)的补集.证明:根据正则表达式与DFA的等价性,一定存在识别语言L(R)的DFA.设这一DFA为M,则将M的所有接受状态改为非接受状态,所有非接受状态改为接受状态,得到新的DFAM’.易知M’识别语言L(R)的补集.再由正则表达式与DFA的等价性知必存在正则表达式R’,使得L(R’)是L(R)的补集.三、设有一门小小语言仅含z、o、/(斜杠)3个符号,该语言中的一个注释由/o开始、以o/结束,并且注释1.请给出单个正则表达式,它仅与一个完整的注释匹配,除此之外不匹配任何其他串.书写正则表达式时,要求仅使用最基本的正则表达式算子( ,|,R,+,?).参考答案一:/o(oRz|/)Ro+/思路:基本思路是除了最后一个o/,在注释中不能出现o后面紧跟着/的情况;还有需要考虑的是最后一个o/之前也可以出现若干个o.参考答案二(梁晓聪、梁劲、梁伟斌等人提供):/o/R(z/R|o)Ro/2.给出识别上述正则表达式所定义语言的确定有限自动机(DFA).你可根据问题直接构造DFA,不必运用机械的算法从上一小题的正则表达式转换得到DFA.~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~《编译原理》第三次作业参考答案一、考虑以下DFA的状态迁移表,其中0,1为输入符号,A~H代表状态:其中A为初始状态,D为接受状态,请画出与此DFA等价的最小DFA,并在新的DFA状态中标明它对应的原DFA状态的子集.说明:有些同学没有画出状态H,因为无法从初始状态到达状态H.从实用上讲,这是没有问题的.不过,如果根据算法的步骤执行,最后是应该有状态H的.二、考虑所有含有3个状态(设为p,q,r)的DFA.设只有r是接受状态.至于哪一个状态是初始状态与本问题无关.输入符号只有0和1.这样的DFA总共有729种不同的状态迁移函数,因为对于每一状态和每一输入符号,可能迁移到3个状态中的一个,所以总共有3^6=729种可能.在这729个DFA中,有多少个p和q是不可区分的(indistinguishable)?解释你的答案.解:考虑对于p和q,在输入符号为0时的情况,在这种情况下有5种可能使p和q无法区分:p和q在输入0时同时迁移到r(1种可能),或者p和q在输入0时,都迁移到p或q(4种可能).类似地,在输入符号为1时,也有5种可能使p和q无法区分.如果再考虑r的迁移,r的任何迁移对问题没有影响.于是r在输入0和输入1时各有3种可能的迁移,总共有因此,总共有5R5R9=225个DFA,其中p和q是不可区分的.三、证明:所有仅含有字符a,且长度为素数的字符串组成的集合不是正则语言.证明:用反证法.假设含有素数个a的字符串组成的集合是正则语言,则必存在一个DFA接受这一语言,设此DFA为D.由于D 的状态数有限,而素数有无限多个,所以必存在两个不同的素数p和q(设p<q),使得从D的初始状态出发,经过p个a和q个a后到达同一状态s,且s为接受状态.由于DFA每一步的迁移都是确定的,所以从状态s 出发,经过(q-p)个a,只能到达状态s.考虑仅含有字母a,长度为p+p(q-p)的字符串T.T从初始状态出发,经过p个a到达状态s,再经过(q-p)个a 仍然到达s;同样,经过p(q-p)个a后仍然到达s.因此,从初始状态出发,经过p+p(q-p)个a后必然到达状态s.由于p+p(q-p)=p(q-p+1)是合数,而s为接受状态,因而得出矛盾.原命题得证.~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~一、用上下文无关文法描述下列语言:1.定义在字母表∑={a,b}上,所有首字符和尾字符相同的非空字符串.S→aTa|bTb|a|bT→aT|bT|є说明:1.用T来产生定义在字母表∑={a,b}上的任意字符串;2.注意不要漏了单个a和单个b的情况.2.L={0i1j|i≤j≤2i且i≥0}.S→0S1|0S11|є3.定义在字母表∑={0,1}上,所有含有相同个数的0和1的字符串(包括空串).S→0S1|1S0|SS|є思路:分两种情况考虑.1)如果首尾字母不同,那么这一字符串去掉首尾字母仍应该属于我们要定义的语言,因此有S→0S1|1S0;2)如果首尾字母相同,那么这一字符串必定可以分成两部分,每一部分都属于我们要定义的语言,因此有S→SS.二、考虑以下文法:S→aABeA→Abc|bB→d1.用最左推导(leftmostderivation)推导出句子abbcde.S==>aABe==>aAbcBe==>abbcBe==>abbcde2.用最右推导(rightmostderivation)推导出句子abbcde.S==>aABe==>aAde==>aAbcde==>abbcde3.画出句子abbcde对应的分析树(parsetree).三、考虑以下文法:S→aSbS→aSS→1.这一文法产生什么语言(用自然语言描述)?所有n个a后紧接m个b,且n>=m的字符串.2.证明这一文法是二义的.对于输入串aab,有如下两棵不同的分析树3.写出一个新的文法,要求新文法无二义且和上述文法产生相同的语言.答案一:S→aSb|TT→aT|ε答案二:S→TS’T→aT|εS’→aS’b|ε~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~一、考虑以下文法:S→aTUV|bVT→U|UUU→ε|bVV→ε|cV写出每个非终端符号的FIRST集和FOLLOW集.FIRST(S)={a,b}FIRST(T)={є,b}FIRST(U)={є,b}FIRST(V)={є,c}FOLLOW(S)={$}FOLLOW(T)={b,c,$}FOLLOW(U)={b,c,$}FOLLOW(V)={b,c,$}二、考虑以下文法:S→(L)|aL→L,S|S1.消除文法的左递归.S→(L)|aL→SL’L’→,SL’|ε2.构造文法的LL(1)分析表.FIRST(S)={‘(‘,‘a’}FIRST(L)={‘(‘,‘a’}FIRST(L’)={‘,’,ε}FOLLOW(S)={‘$’,‘,’,‘)’}FOLLOW(L)={‘)’}FOLLOW(L’)={‘)’}3.三、考虑以下文法:S→aSbS|bSaS|ε这一文法是否是LL(1)文法?给出理由.这一文法不是LL(1)文法,因为S有产生式S→ε,但FIRST(S)={a,b,ε},FOLLOW(S)={a,b},因而FIRST(S)∩FOLLOW(S)≠∅.根据LL(1)文法的定义知这一文法不是LL(1)文法.~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~一、考虑以下文法:(0)E’→E(1)E→E+T(2)E→T(3)T→TF(4)T→F(5)F→FR(6)F→a(7)F→b1. 写出每个非终端符号的FIRST集和FOLLOW集.FIRST(E’)=FIRST(E)=FIRST(T)=FIRST(F)={a,b}FOLLOW(E’)={$}FOLLOW(E)={+,$}FOLLOW(T)={+,$,a,b}FOLLOW(F)={+,R,$,a,b}2. 构造识别这一文法所有活前缀(viableprefiRes)的LR(0) 自动机(参照课本4.6.2节图4.31).~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~《编译原理》第八次作业参考答案最终答案:34二、以下文法定义了二进制浮点数常量的语法规则:S→L.L|LL→LB|BB→0|1试给出一个S属性的语法制导定义,其作用是求出该二进制浮点数的十进制值,并存放在开始符号S相关联的一个综合属性value中。

北京理工大学汇编语言实验报告一

北京理工大学汇编语言实验报告一

汇编语言实验报告实验一 DOS环境下的汇编语言编程环境使用(基础与验证型)班级:05211002姓名:张宁学号:1120102310实验日期:2012.9.7晚6:00~9:00汇编语言实验报告实验一 DOS 环境下的汇编语言编程环境使用(基础与验证型)一、实验要求和目的1、掌握汇编语言程序设计的基本流程和学会上机开发简单程序;2、熟练掌握宏汇编程序MASM 的使用;3、熟练掌握连接程序LINK 的使用;4、熟练掌握DEBUG 的使用;二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识汇编语言程序设计上机开发过程如图1.1 所示。

四、实验内容与步骤1、汇编、链接并调试给出的简单程序,找出程序中的错误。

(一)录入并建立汇编语言源程序文件(ASM 文件)(二)用汇编程序MASM 将ASM 文件汇编成目标程序文件(OBJ 文件)(三)用连接程序LINK 生成可执行程序文件(EXE 文件)(四)程序的调试2、完成程序设计:分类统计字数组data 中正数、负数和零的个数,并分别存入内存字变量Positive、Negative 和Zero 中,数组元素个数保存在其第一个字中。

使用Debug 查看Positive、Negative 和Zero 三个变量的数据。

五、实验过程及结果:实验一:1.输入给出的程序2.运行输入的程序,发现了三处错误:根据错误提示,发现错误为ADDITION后未打冒号,CMP错打为COM。

修改原代码:改为:3.代码编译成功,生成OBJ文件,再生成EXE文件,可成功运行。

4.在原程序代码后添加两行代码,以验证ADDITION的逻辑正确性,改动如下:现实在DA TA1中添加字节型sum ,再将ADDITION的运行结果,从AX送到sum中去。

5.调试发现ADDITION并没用正确运行。

检查语句逻辑性发现,应将JAE改成JB,才能实现累加并终结。

北京理工大学数据结构与算法设计实验一

北京理工大学数据结构与算法设计实验一

《数据结构与算法设计》实验报告——实验一学院:自动化学院班级:06111001学号:1120100001姓名:宝竞宇一、实验目的实现链表的基本操作,如:建立,插入,删除等。

应用链表解决实际问题。

二、实验内容采用单向环表实现约瑟夫环。

①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。

环表中的结点编号依次为1,2,……,m。

②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。

例如,m=10,s=3,n=4。

则输出序列为:6,10,4,9,5,2,1,3,8,7。

三、程序设计1、概要设计本程序要用到一个抽象的数据类型:链表节点。

其中包括一个数值项,和指针项。

宏定义“错误”,与程序成功后返回的“成功。

”建立一个“生成函数”来生成,环表。

在建立一个“查找输出函数”,来实现约瑟夫的输出。

在主程序中先定义一个链表节点定义,然后在调用“生成函数”来生成约瑟夫表。

接下来调用“查找输出函数”,输出题目要求的数字编号序列。

2、详细设计抽象数据类型定义:typedef struct NODE{int num;struct NODE *next;}linklist;宏定义:#define ERROR 0#define OK 1生成函数:该函数的输入值为n值,返回为linklist型的指针变量指向生成的环表的头结点。

其中先定义一个头结点,给其分配储存空间head=p=(linklist*)malloc(sizeof(linklist));然后再用一个for循环连续的生成,插入节点到该函数中for(i=2;i<=n;i++){q=(linklist *)malloc(sizeof(linklist));if(q==0)return(ERROR);q->num=i;p->next=q;p=q;}程序错误返回ERROR。

龙书第三章作业

龙书第三章作业

编译原理第一次作业第一章1.6.1(a)X=9 Y=13 Z=9 w=13(b)X=7 Y=13 Z=7 W=91.6.3答案:1.6.4答:打印结果是:32第三章3.3.2(1)a( a|b )*a答: 穷举法{ aa, aaa, aba, aaaa, aaba, abaa, abba, ... }(2)((ε|a)b*))*答: 由 a 和 b 组成的任意符号串(3)(a|b)* a(a|b)(a|b)答: 倒数第 3 个符号为 a 的长度大于等于 3 的a,b串(4)a*ba*ba*ba*答: 有且仅有三个 b 的由 a 和 b 构成的所3.3.5(1)包含 5 个元音的所有小写字母串,这些串中的元音按顺序出现答:e.g. :{ aeiou, xaxeiou, xaxabcxeeiioouu... }consonant->[b-df-hj-np-tv-z]ctnvowels->(consonant*)(((a+)(consonant*))+)(((e+)(consonan t*))+)(((i+)(consonant*))+)(((o+)(consonant*))+)(((u+)(consonant*))+) 注:consonant 为除五元音外的小写字母,记号ctnvowels 对应的定义即为题目要求的正则定义。

(2) 所有由按字典顺序递增序排列的小写字组成的串。

答:答:a*b*……z*(3)注释,即/*和*/之间的串,且串中没有不在双引号(“)中的*/。

答:head——>/*tail ——>*/incomment->(~(*/)|“. *”) *comment->head incomment tail(9)所有由 a 和 b 组成且不含有子串abb的串。

答:A->b *(a︱ab)* 33.4.1(1)a( a|b )*a 的状态转换图如下:(2)(3)(4)3.7.3(1)○1将正则表达式转化为NFA○2根据子集构造法由NFA构造DFA。

北京理工大学汇编语言实验报告实验五子程序设计实验

北京理工大学汇编语言实验报告实验五子程序设计实验

北京理工大学汇编语言实验报告实验五子程序设计实验实验五子程序设计实验(设计性实验)一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言子程序设计方法;3.熟悉利用汇编语言子程序参数传递方法;4.熟悉汇编语言字符串处理基本指令的使用方法;5.掌握利用汇编语言实现字符串的输入输出程序设计方法;6.掌握数制转换程序实现方法。

二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识A)子程序知识要点:1、掌握子程序的定义语句;过程名 PROC [near/far]过程体RET过程名 ENDP2.子程序结构形式一个完整的子程序一般应包含下列内容:1. )子程序的说明部分在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法. 说明时,应含如下内容:.子程序名:命名时要名中见意..子程序的功能:说明子程序完成的任务;.子程序入口参数:说明子程序运行所需参数及存放位置;.子程序出口参数:说明子程序运行结果的参数及存放位置;.子程序所占用的寄存器和工作单元;.子程序调用示例;2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET 指令来完成。

.段内调用与返回:调用子程序指令与子程序同在一个段内。

因此只修改IP;.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。

3.)子程序的现场保护与恢复保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复。

一般利用堆栈实现现场保护和恢复的格式:过程名PROC [NEAR/FAR]PUSH BXPUSH DXPOP DXPOP AXRET过程名 ENDP4.子程序的参数传递方法1.寄存器传递参数这种方式是最基本的参数传递方式。

2.存储器单元传(变量)递参数这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。

071编译原理习题(全)@北工大

071编译原理习题(全)@北工大
G[S]: S→Ab |Sb A→aAb |ab
检验:语言所有的句子均可由文法 G[S]推导出来, 文法 G[S]推导出来的所有终结符号串均 为语言 L(G[S])的句子.
例 6 设有文法 G[S]:
S→S*S|S+S|(S)|i
该文法是否为二义文法?
【解】该文法是二义文法,因为该文法存在句子 i*i+i,该句子有两棵不同的语法树如图 2
a.E→T|Eθ1T|Eθ2T T→F|Tθ3F F→(E)|I
b. E→T|Tθ1E|Tθ2E T→F|Fθ3T F→(E)|I
c. E→T|Eθ3T T→F|Tθ1F|Tθ2F
4
F→(E)|I
d. E→T|Tθ3 E
T→F|Fθ1T|Fθ2T
F→(E)|I
【解】对于一个包含运算符的语言,运算符的结合顺序、运算符的优先级在文法中反映为递
由于只关心0的个数的奇偶数我们可以把二进制串分成多段来考虑第1段为二进制串的开始到第1个0为止这一段包含1个0并且0的前面有0个或多个1对于剩下的二进制串按照每段包含两个0的方式去划分即以0开始以0结尾中间可以有0个或多个1如果一个二进制串被这样划分完后剩下的部分如果全部是全1串这些1串在前面划分的串之间或最后则该二进制串就具有奇数个0所以该二进制可以这0组成所以包含奇数个0的正规表达式为
语言和文法
重点与难点
重点:文法、推导与归约、短语与句柄。 难点:文法、推导、归约、短语、句柄、文法的二义性、用文法表示语言。
基本要求
掌握语言的描述、形式定义、文法、文法分类的概念以及形式文法的应用,了解二义性 文法,熟练掌握推导与规约、短语与句柄及用文法描述语言、正则语言、上下文无关文法、 语法分析树。
此文法所表示的语言是什么? 【解】

编译原理第一次上机实验报告软工_李_U2014172xx

编译原理第一次上机实验报告软工_李_U2014172xx

编译原理第一次上机实验报告姓名:李x班级:软工140x班学号:U2014172xx实验一设计实现简单语言的词法分析器1、实验目的通过该实验,熟练应用编译原理关于词法分析的基本理论和方法;学会用C/C++高级程序设计语言设计一个词法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。

2、实验条件计算机上安装C/C++编译处理软件。

3、实验内容及要求对下述单词表定义的语言设计编制一个词法分析器。

单词符号及种别表和词法分析器功能及基本要求如下:(1)单词符号及种别表(2)词法分析器功能及基本要求处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。

(1)总体设计思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字种类,拼出相应的单一符号;(2)详细算法设计当ch!=’$’时,while循环扫描输入的每一个字符;跳过空格、换行、注释;如果是字符,则拼字符串;判断是否为关键字,是则输出对应关键字的单词种别码,否则表明是l(l|d)*即内部字符串;如果是数字,则拼数,整型、浮点型、指数;如果是运算符、界符,输出相应种别码;算符中应该注意+号和-号,做出相应判断是运算符还是表示数字的正负号;如果是表示正负号则调到判断数字的地方;其他则报错;(3) 流程框图(4) 函数相关说明void main()主函数void scanner()扫描判断函数char input[300];//存放输入的字符串char token[20];//存放符合C语言词法规则的单词char ch;//单个字符char previous;//ch的前一个字符char latter;//ch的后一个字符char ch1, ch2;//当处理注释的时候使用int typenum;//表示单词的种别码int p, m, n, cx;double decimal;//记录小数double sum;//存放数字int index;//存放指数int isNum;//是否是数字int isDecimal;//记录是否为小数int isExp;//记录是否为指数int isNegative;//是否带负号(对于指数)int isNegative1;//是否为负数(5)输入与输出(包括出错处理)输入以$结束回车即可运行程序输出以(xxx,typenumber)的形式;出错则会报error!例如:输入:a+b=5$输出:(10, a)(22, +)(10, b)(21, =) (20, 5)(0, $)(6) 程序运行结果(屏幕截图)1.+++-123.456e-127*+45.99e+200++abc+-cnt++49(7) 词法分析器使用说明打开编译器VS或者VC++;文件→新建→项目;将代码复制粘贴,编译运行,按照提示输入即可使用;(8) 心得与体会提高了自己的编程能力,在上机实验中,特别是后期细节的处理很繁琐,需要很多的判断,判断+、-号是否为数字正负号时需要判断前面和后面的字符;又分为好几种情况,每一种情况的判断语句很长容易出错;同时还有指数的处理,e/E后面需要判断正负号以及把字符转换成数字以及识别数字的DFA和运算符加减等融合在一起;(9) 源程序清单// 词法编译器01.cpp : 定义控制台应用程序的入口点。

北京理工大学数据结构编程练习答案

北京理工大学数据结构编程练习答案

1.一元多项式相加(10分)成绩: 10 / 折扣: 0.8题目说明:编写一元多项式加法运算程序。

要求用线性链表存储一元多项式(参照课本)。

该程序有以下几个功能:1. 多项式求和输入:输入三个多项式,建立三个多项式链表Pa、Pb、Pc(提示:调用CreatePolyn(polynomial &P,int m)。

输出:显示三个输入多项式Pa、Pb、Pc、和多项式Pa+Pb、多项式Pa+Pb+Pc (提示:调用AddPolyn(polynomial &Pa, polynomial Pb), 调用PrintPolyn(polynomial P))。

0. 退出输入:根据所选功能的不同,输入格式要求如下所示(第一个数据是功能选择编号,参见测试用例):∙ 1多项式A包含的项数,以指数递增的顺序输入多项式A各项的系数(整数)、指数(整数)多项式B包含的项数,以指数递增的顺序输入多项式B各项的系数(整数)、指数(整数)多项式C包含的项数,以指数递增的顺序输入多项式C各项的系数(整数)、指数(整数)∙0 ---操作终止,退出。

输出:对应一组输入,输出一次操作的结果(参见测试用例)。

∙ 1 多项式输出格式:以指数递增的顺序输出: <系数,指数>,<系数,指数>,<系数,指数>,参见测试用例。

零多项式的输出格式为<0,0>∙0 无输出1.#include<iostream>#include<stdlib.h>using std::cin;using std::cout;using std::endl;struct date{int a;int b;struct date* pnext;};typedef struct date DATE;typedef struct date* PDATE;void output(PDATE p){int f=0;p=p->pnext;while(p!=NULL){if(p->a!=0){f=1;cout<<"<"<<p->a<<","<<p->b<<">";if(p->pnext==NULL)cout<<endl;elsecout<<",";}p=p->pnext;}if(f==0)cout<<"<0,0>"<<endl;}void add(PDATE a,PDATE b,PDATE c){PDATE p1,p2,p3;p1=a;p2=b;p3=c;if(p1!=NULL) p1=p1->pnext; //skip head if(p2!=NULL) p2=p2->pnext;while((p1!=NULL)&&(p2!=NULL)){if(p1->b>p2->b){p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p2->a;p3->b=p2->b;p3->pnext=NULL;p2=p2->pnext;}else if(p1->b<p2->b){p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p1->a;p3->b=p1->b;p3->pnext=NULL;p1=p1->pnext;}else{p3->pnext=(PDATE)malloc(sizeof(DATE));p3=p3->pnext;p3->a=p1->a+p2->a;p3->b=p1->b;p3->pnext=NULL;p1=p1->pnext;p2=p2->pnext;}}//end whileif(p1==NULL)p3->pnext=p2;if(p2==NULL)p3->pnext=p1;}int main(){int flag;int n;PDATE P[6]={NULL};PDATE p=NULL;for(int i=0;i<6;i++){P[i]=(PDATE)malloc(sizeof(DATE));P[i]->a=0;P[i]->b=0;P[i]->pnext=NULL;}cin>>flag;if(flag==1){for(int i=1;i<4;i++){p=P[i];cin>>n;while(n--!=0){p->pnext=(PDATE)malloc(sizeof(DATE));p=p->pnext;cin>>p->a>>p->b;p->pnext=NULL;}output(P[i]);}}add(P[1],P[2],P[4]);output(P[4]);add(P[4],P[3],P[5]);output(P[5]);}0 约瑟夫问题(10分)成绩: 10 / 折扣: 0.80 约瑟夫问题成绩10分折扣0.8(本题要求用循环链表实现)0 ,1, 2, 3题,只能选做三题.约瑟夫问题是一个经典的问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

试验1:PL/0编译程序跟踪与分析阅读第10章PL/0编译程序并完成:
P304 —10.1 ,10.2,10.3 ,10.4。

(PL/0源程序放在在网络教室)
试验2:词法分析试验二选一
(一)Java语言词法分析器的设计与实现
一.实验目的
1.强化对系统软件综合工程实现能力、规划能力的训练;2.加强对词法分析原理、方法和基本实现技术的理解;二.实验内容
用C语言(或C++ )作为宿主语言完成:
Java语言词法分析器的设计和实现
其中具体要求:
1.使用DFA实现词法分析器的设计;
2.实现对Java源程序中注释的过滤;
3.利用两对半缓冲区从文件中逐一读取单词;
4.词法分析结果属性字流存放在独立文件(文件名:
scanner_output)中;
5.具有报告词法错误和出错位置(源程序行号和该行字符)的
功能;
注:附Java语言词法规则(附件一);
附Java语言词法分析器的属性字设计(附件二)
三.实验验收与评分要求
1.编写Java语言词法分析器的源程序并调试通过;
2.通过测试程序的验收 (测试程序名称:Test-Lexcial);
3. 提交简明扼要的书面实验报告。

内容包括:FA设计;
源程序主要函数功能;主要数据结构设计。

附件一
JA V A语言词法规则
关键字:
abstract boolean break byte case catch char class
const continue default do double else extends false
final finally float for goto if implements import
instanceof int interface long native new null package
private protected public return short static super switch
synchronized this throw throws transient true try void
volatile while
标识符:
字母或美元符号“$”或下划线开头,连接字母或美元符号“$”或下划线或数字字符的串。

常量:
整型常量:123, 0, -456, 0123 , 0x123, -0X12,123L
实型常量: 1.23, 0.123, .123, 123., 123.0, 123e3, 123E3, 12.3F
布尔常量:true、false
字符串常量:"This is a constant string."。

字符常量:‘ a’ ,
转义字符描述
\ddd 1到3位8进制数据所表示的字符(ddd)
\uxxxx 1到4位16进制数所表示的字符(xxxx)
\' 单引号字符
\\ 反斜杠字符
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格
界限符:
运算符:
附件二
JA V A词法分析器的属性字设计单词属性用整数表示:
关键字 1
标识符 2
布尔型 3
字符型 4
整型 5
浮点型 6
字符串7
= += -= *= /= %= &=
^= |= >>= <<= >>>= 8 ?: 9 || 10 && 11 | 12 ^ 13 & 14 == != 15 < > <= >= 16 << >> >>> 17 + - 18 * / % 19 ++ -- +(正) –(负) ! ~ 20 [] () . 21 , 22 {} 23 ; 24
(二)程序设计语言的词法分析器
一.实验目的
1.强化对系统软件综合工程实现能力、规划能力的训练;2.加强对词法分析原理、方法和基本实现技术的理解;二.实验内容
用C语言(或C++ )作为宿主语言完成:
程序设计语言词法分析器的设计和实现其中具体要求:
1.语言的单词描述、单词类别分类、属性字设计;
1.使用DFA实现词法分析器的设计;
2.实现对源程序中注释的过滤;
3.利用两对半缓冲区从文件中逐一读取单词;
4.词法分析结果属性字流存放在独立文件(文件名:
scanner_output)中;
5.具有报告词法错误和出错位置(源程序行号和该行字符)的
功能;
三.实验验收与评分要求
1.编写词法分析器的源程序并调试通过;
2. 提交简明扼要的书面实验报告。

内容包括:FA设计;
源程序主要函数功能;主要数据结构设计。

相关文档
最新文档