导航:首页 > 源码编译 > 编译的实验有哪些

编译的实验有哪些

发布时间:2023-12-05 17:41:42

A. 编译原理实验求助

1)定义
所有token或者叫单词的有限自动机。
2)将有限自动机用代码实现。
3)写分析程序,利用你定义的有限自动机来识别所有的“单词”。并将识别出来的单词的相关信息,如名称,位置,类别等记录在相关的数据结构中。

B. 编译程序都有哪些

编译程序有哪些主要构成成分?它们各自的主要功能是什么?
数据结构

分析和综合时所用的主要数据结构,包括符号表、

常数表和中间语言程序。

符号表由源程序中所用的标识符连同它

们的属性组成,

其中属性包括种类

(如变量、

数组、

结构、

函数、

过程等)、类型(如整型、实型、字符串、复型、标号等),以

及目标程序所需的其他信息。常数表由源程序中用的常数组成,

其中包括常数的机内表示,

以及分配给它们的目标程序地址。



间语言程序是将源程序翻译为目标程序前引入的一种中间形式

的程序,

其表示形式的选择取决于编译程序以后如何使用和加工

它。

常用的中间语言形式有波兰表示、

三元组、

四元组以及间接

三元组等。

分析部分

源程序的分析是经过词法分析、语法分析和语

义分析三个步骤实现的。

词法分析由词法分析程序

(又称为扫描

程序)完成,其任务是识别单词(即标识符、常数、保留字,以

及各种运算符、标点符号等)、造符号表和常数表,以及将源程

序换码为编译程序易于分析和加工的内部形式。

语法分析程序是

编译程序的核心部分,

其主要任务是根据语言的语法规则,

检查源程序是否合乎语法。

如不合乎语法,

则输出语法出错信息;



合乎语法,

则分解源程序的语法结构,

构造中间语言形式的内部

程序。

语法分析的目的是掌握单词是怎样组成语句的,

以及语句

又是如何组成程序的。

语义分析程序是进一步检查合法程序结构

的语义正确性,

其目的是保证标识符和常数的正确使用,

把必要

的信息收集和保存到符号表或中间语言程序中,

并进行相应的语

义处理。

综合部分

综合阶段必须根据符号表和中间语言程序产生

出目标程序,其主要工作包括代码优化、存储分配和代码生成。

代码优化是通过重排和改变程序中的某些操作,

以产生更加有效

的目标程序。

存储分配的任务是为程序和数据分配运行时的存储

单元。

代码生成的主要任务是产生与中间语言程序符等价的目标

程序,

顺序加工中间语言程序,

并利用符号表和常数表中的信息

生成一系列的汇编语言或机器语言指令。

结构

编译过程分为分析和综合两个部分,

并进一步划分为

词法分析、语法分析、

语义分析、

代码优化、存储分配和代码

生成等六个相继的逻辑步骤。

这六个步骤只表示编译程序各部分

之间的逻辑联系,

而不是时间关系。

编译过程既可以按配伏激照这六个

逻辑步骤顺序地执行,

也可以按照平行互锁方式去执行。

在确定

编译程序的具体结构时,

常常分若干遍实现。

对于源程序或中间

语言程序,

从头到尾扫视一次并实现所规定的工作称作一遍。



一遍可以完成一个或相连几个逻辑步骤的工作。

例如,

可以把词

法分析作为第一遍;

语法分析和语义分析作为第二遍;

代码优化

和存储分配作为第三遍;

代码生成作为第四遍。

反之,

为了适应

较小的存储空间或提高厅颤目标程序质量,

也可以把一个逻辑步骤的

工作分为几遍去执行。

例如,

代码优化可划分为代码优化准备工

作和实际代码优化两遍进行。

一个编译程序是否分遍

,

以及如何分遍

,

根据具体情况而定。

其判别标准可以是存储容量的大小、

源语言的繁简、

解题范围的

宽窄,

以及设计、

编制人员的多少等。

分遍的好处是各遍功能独

立单纯、相互联系简单、逻辑结构清晰、优化准备工作充分。缺

点是各遍之中不可避免地要有些重复的部分,

而且遍和遍之间要培袜

有交接工作,因之增加了编译程序的长度和编译时间。

一遍编译程序是一种极端情况,

整个编译程序同时驻留在内



,

彼此之间采用调用转接方式连接在一起

(



2)

。当语法分析

程序......
c编译程序是什么?
D

编译程序

这是一类很重要的语言处理程序,它把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,鸡行翻译转换,产生出机器语言的目标程序,然后再让计算机去执行这个目标程序,得到计算结果。

实在不明白用排除法
编译程序是什么意思啊
你是想知道这个概念的意思么,有点笼统不好给你讲的。你说的编译程序是编程么,编程就是驾驭机器
编译程序是什么意思?编译是什么意思?
把用高级程序设计语言书写的源程序,翻译成等价的计算机汇编语言或机器语言书写的目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计算结果。编译程序的实现算法较为复杂。这是因为它所翻译的语句与目标语言的指令不是一一对应关系,而是一多对应关系;同时也因为它要处理递归调用、动态存储分配、多种数据类型,以及语句间的紧密依赖关系。但是,由于高级程序设计语言书写的程序具有易读、易移植和表达能力强等特点,编译程序广泛地用于翻译规模较大、复杂性较高、且需要高效运行的高级语言书写的源程序。
目前最常用的作C语言编译程序的软件是什么?
如果你用Turbo C的话,不需要太高配置,基本的DOS能跑的系统他就能跑。

如果你用VC++6.0跑的话,那么最低也得赛扬II一级别,256M内存,然后WIN98系统,硬盘至少2G空间

如果你用Visual Studio200X跑的话,建议奔腾四的机器,而且内存要大,至少512M,XP环境,如果要加载SQL SERVER的话,内存还要更大,至少1G,否则服务挂不动,而且硬盘最好留5G空间,可以安装一些MSDN。方便查阅。

其次,还有个GCC编译器,可以下载一个环境,配置一下,这是LINUX下的C编译器,效率很高,而且出来的OBJ没有垃圾数据,推荐,这个跟TC环境差不多
目前主流的C语言编译软件是什么
vc++ 6.0比较老 但是适合初学者学习 初学者足够了

vs 2010 、vs 2012不错, 软件稍大,

eclipse 也可以 不过不太常用

如果是初学者建议 vc++6.0 或者 vs 2012
编译程序的优点是什么啊?解释程序的优点又是什么?
5、编译程序和解释程序

高级语言程序同样要翻译成二进制程序才能执行。

耿级语言的两种执行方式:

(1)解释方式:翻译一条,执行一条 特点:慢,但占空间小

(2)编译方式:翻译成目标程序,然后运行目标程序 特点:快,但占用空间大 (考点)
编译软件具体是什么啊?为属于系统软件啊
以上回答是什么乱七八糟的水平!

计算机常识,操作系统,数据库管理系统,编译软件都属于系统软件。

没有为什么,这就是个定义。规定就是这样。原因我想可能是因为这些软件都没有特定的应用吧。。都是为了辅助其它应用软件而存在。所以定义为系统软件。
编译原理---程序执行的两种方式是什么
解释执行和编译执行,前者过程简单,后者执行速度快

C. pcm编译器系统实验过程中发现的问题

1. 点到点PCM多路电话通信原理
脉冲编码调制(PCM)技术与增量调制(ΔM)技术已经在数字通信系统中得到广泛应用。当信道噪声比较小时一般用PCM,否则一般用ΔM。目前速率在155MB以下的准同步数字系列(PDH)中,国际上存在A解和μ律两种PCM编译码标准系列,在155MB以上的同步数字系列(SDH)中,将这两个系列统一起来,在同一个等级上两个系列的码速率相同。而ΔM在国际上无统一标准,但它在通信环境比较恶劣时显示了巨大的优越性。
点到点PCM多路电话通信原理可用图9-1表示。对于基带通信系统,广义信道包括传输媒质、收滤波器、发滤波器等。对于频带系统,广义信道包括传输媒质、调制器、解调器、发滤波器、收滤波器等。
本实验模块可以传输两路话音信号。采用TP3057编译器,它包括了图9-1中的收、发低通滤波器及PCM编译码器。编码器输入信号可以是本实验模块内部产生的正弦信号,也可以是外部信号源的正弦信号或电话信号。本实验模块中不含电话机和混合电路,广义信道是理想的,即将复接器输出的PCM信号直接送给分接器。
2. PCM编译码模块原理
本模块的原理方框图图9-2所示,电原理图如图9-3所示(见附录),模块内部使用+5V和-5V电压,其中-5V电压由-12V电源经7905变换得到。
图9-2 PCM编译码原理方框图
该模块上有以下测试点和输入点:
• BS PCM基群时钟信号(位同步信号)测试点
• SL0 PCM基群第0个时隙同步信号
• SLA 信号A的抽样信号及时隙同步信号测试点
• SLB 信号B的抽样信号及时隙同步信号测试点
• SRB 信号B译码输出信号测试点
• STA 输入到编码器A的信号测试点
• SRA 信号A译码输出信号测试点
• STB 输入到编码器B的信号测试点
• PCM PCM基群信号测试点
• PCM-A 信号A编码结果测试点
• PCM-B 信号B编码结果测试点
• STA-IN 外部音频信号A输入点
• STB-IN 外部音频信号B输入点
本模块上有三个开关K5、K6和K8,K5、K6用来选择两个编码器的输入信号,开关手柄处于左边(STA-IN、STB-IN)时选择外部信号、处于右边(STA-S、STB-S)时选择模块内部音频正弦信号。K8用来选择SLB信号为时隙同步信号SL1、SL2、SL5、SL7中的某一个。
图9-2各单元与电路板上元器件之间的对应关系如下:
•晶振 U75:非门74LS04;CRY1:4096KHz晶体
•分频器1 U78:A:U78:D:触发器74LS74;U79:计数器74LS193
•分频器2 U80:计数器74LS193;U78:B:U78:D:触发器74LS74
•抽样信号产生器 U81:单稳74LS123;U76:移位寄存器74LS164
•PCM编译码器A U82:PCM编译码集成电路TP3057(CD22357)
•PCM编译码器B U83:PCM编译码集成电路TP3057(CD22357)
•帧同步信号产生器 U77:8位数据产生器74HC151;U86:A:与门7408
•正弦信号源A U87:运放UA741
•正弦信号源B U88:运放UA741
•复接器 U85:或门74LS32
晶振、分频器1、分频器2及抽样信号(时隙同步信号)产生器构成一个定时器,为两个PCM编译码器提供2.048MHz的时钟信号和8KHz的时隙同步信号。在实际通信系统中,译码器的时钟信号(即位同步信号)及时隙同步信号(即帧同步信号)应从接收到的数据流中提取,方法如实验五及实验六所述。此处将同步器产生的时钟信号及时隙同步信号直接送给译码器。
由于时钟频率为2.048MHz,抽样信号频率为8KHz,故PCM-A及PCM-B的码速率都是2.048MB,一帧中有32个时隙,其中1个时隙为PCM编码数据,另外31个时隙都是空时隙。
PCM信号码速率也是2.048MB,一帧中的32个时隙中有29个是空时隙,第0时隙为帧同步码(×1110010)时隙,第2时隙为信号A的时隙,第1(或第5、或第7 —由开关K8控制)时隙为信号B的时隙。
本实验产生的PCM信号类似于PCM基群信号,但第16个时隙没有信令信号,第0时隙中的信号与PCM基群的第0时隙的信号也不完全相同。
由于两个PCM编译码器用同一个时钟信号,因而可以对它们进行同步复接(即不需要进行码速调整)。又由于两个编码器输出数据处于不同时隙,故可对PCM-A和PCM-B进行线或。本模块中用或门74LS32对PCM-A、PCM-B及帧同步信号进行复接。在译码之前,不需要对PCM进行分接处理,译码器的时隙同步信号实际上起到了对信号分路的作用。
3. TP3057简介
本模块的核心器件是A律PCM编译码集成电路TP3057,它是CMOS工艺制造的专用大规模集成电路,片内带有输出输入话路滤波器,其引脚及内部框图如图9-4、图9-5所示。引脚功能如下:
图9-4 TP3057引脚图
(1) V一 接-5V电源。
(2) GND 接地。
(3) VFRO 接收部分滤波器模拟信号输出端。
(4) V+ 接+5V电源。
(5) FSR 接收部分帧同信号输入端,此信号为8KHz脉冲序列。
(6) DR 接收部分PCM码流输入端。
(7) BCLKR/CLKSEL 接收部分位时钟(同步)信号输入端,此信号将PCM码流在FSR上升沿后逐位移入DR端。位时钟可以为64KHz到2.048MHz的任意频率,或者输入逻辑“1”或“0”电平器以选择1.536MHz、1.544MHz或2.048MHz用作同步模式的主时钟,此时发时钟信号BCLKX同时作为发时钟和收时钟。
(8) MCLKR/PDN 接收部分主时钟信号输入端,此信号频率必须为1.536MHz、1.544MHz或2.048MHz。可以和MCLKX异步,但是同步工作时可达到最佳状态。当此端接低电平时,所有的内部定时信号都选择MCLKX信号,当此端接高电平时,器件处于省电状态。
(9) MCLKX 发送部分主时钟信号输入端,此信号频率必须为1.536MHz、1.544MHz或2.048MHz。可以和MCLKR异步,但是同步工作时可达到最佳状态。
(10) BCLKX 发送部分位时钟输入端,此信号将PCM码流在FSX信号上升沿后逐位移出DX端,频率可以为64KHz到2.04MHz的任意频率,但必须与MCLKX同步。
图9-5 TP3057内部方框图
(11) DX 发送部分PCM码流三态门输出端。
(12) FSX 发送部分帧同步信号输入端,此信号为8KHz脉冲序列。
(13) TSX 漏极开路输出端,在编码时隙输出低电平。
(14) GSX 发送部分增益调整信号输入端。
(15) VFXi- 发送部分放大器反向输入端。
(16) VFXi+ 发送部分放大器正向输入端。
TP3057由发送和接收两部分组成,其功能简述如下。
发送部分:
包括可调增益放大器、抗混淆滤波器、低通滤波器、高通滤波器、压缩A/D转换器。抗混淆滤波器对采样频率提供30dB以上的衰减从而避免了任何片外滤波器的加入。低通滤波器是5阶的、时钟频率为128MHz。高通滤波器是3阶的、时钟频率为32KHz。高通滤波器的输出信号送给阶梯波产生器(采样频率为8KHz)。阶梯波产生器、逐次逼近寄存器(S•A•R)、比较器以及符号比特提取单元等4个部分共同组成一个压缩式A/D转换器。S•A•R输出的并行码经并/串转换后成PCM信号。参考信号源提供各种精确的基准电压,允许编码输入电压最大幅度为5VP-P。
发帧同步信号FSX为采样信号。每个采样脉冲都使编码器进行两项工作:在8比特位同步信号BCLKX的作用下,将采样值进行8位编码并存入逐次逼近寄存器;将前一采样值的编码结果通过输出端DX输出。在8比特位同步信号以后,DX端处于高阻状态。
接收部分:
包括扩张D/A转换器和低通滤波器。低通滤波器符合AT&T D3/D4标准和CCITT建议。D/A转换器由串/并变换、D/A寄存器组成、D/A阶梯波形成等部分构成。在收帧同步脉冲FSR上升沿及其之后的8个位同步脉冲BCLKR作用下,8比特PCM数据进入接收数据寄存器(即D/A寄存器),D/A阶梯波单元对8比特PCM数据进行D/A变换并保持变换后的信号形成阶梯波信号。此信号被送到时钟频率为128KHz的开关电容低通滤波器,此低通滤波器对阶梯波进行平滑滤波并对孔径失真(sinx)/x进行补尝。
在通信工程中,主要用动态范围和频率特性来说明PCM编译码器的性能。
动态范围的定义是译码器输出信噪比大于25dB时允许编码器输入信号幅度的变化范围。PCM编译码器的动态范围应大于图9-6所示的CCITT建议框架(样板值)。
当编码器输入信号幅度超过其动态范围时,出现过载噪声,故编码输入信号幅度过大时量化信噪比急剧下降。TP3057编译码系统不过载输入信号的最大幅度为5VP-P。
由于采用对数压扩技术,PCM编译码系统可以改善小信号的量化信噪比,TP3057采用A律13折线对信号进行压扩。当信号处于某一段落时,量化噪声不变(因在此段落内对信号进行均匀量化),因此在同一段落内量化信噪比随信号幅度减小而下降。13折线压扩特性曲线将正负信号各分为8段,第1段信号最小,第8段信号最大。当信号处于第一、二段时,量化噪声不随信号幅度变化,因此当信号太小时,量化信噪比会小于25dB,这就是动态范围的下限。TP3057编译码系统动态范围内的输入信号最小幅度约为0.025Vp-p。
常用1KHz的正弦信号作为输入信号来测量PCM编译码器的动态范围。
图9-6 PCM编译码系统动态范围样板值
语音信号的抽样信号频率为8KHz,为了不发生频谱混叠,常将语音信号经截止频率为3.4KHz的低通滤波器处理后再进行A/D处理。语音信号的最低频率一般为300Hz。TP3057编码器的低通滤波器和高通滤波器决定了编译码系统的频率特性,当输入信号频率超过这两个滤波器的频率范围时,译码输出信号幅度迅速下降。这就是PCM编译码系统频率特性的含义。
四、实验步骤
1. 熟悉PCM编译码单元工作原理,开关K9接通8KHz(置为1000状态),开关K8置为SL1(或SL5、SL7),开关K5、K6分别置于STA-S、STB-S端,接通实验箱电源。
2. 用示波器观察STA、STB,调节电位器R19(对应STA)、R20(对应STB),使正弦信号STA、STB波形不失真(峰峰值小于5V)。
3. 用示波器观察PCM编码输出信号。
示波器CH1接SL0,(调整示波器扫描周期以显示至少两个SL0脉冲,从而可以观察完整的一帧信号)CH2分别接SLA、PCM-A、SLB、PCM-B以及PCM,观察编码后的数据所处时隙位置与时隙同步信号的关系以及PCM信号的帧结构(注意:本实验的帧结构中有29个时隙是空时隙,SL0、SLA及SLB的脉冲宽度等于一个时隙宽度)。
开关K8分别接通SL1、SL2、SL5、SL7,观察PCM基群帧结构的变化情况。
4. 用示波器观察PCM译码输出信号
示波器的CH1接STA,CH2接SRA,观察这两个信号波形是否相同(有相位差)。
5. 用示波器定性观察PCM编译码器的动态范围。
开关K5置于STA-IN端,将低失真低频信号发生器输出的1KHz正弦信号从STA-IN输入到TP3057(U82)编码器。示波器的CH1接STA(编码输入),CH2接SRA(译码输出)。将信号幅度分别调至大于5VP-P、等于5VP-P,观察过载和满载时的译码输出波形。再将信号幅度分别衰减10dB、20dB、30dB、40dB、45dB、50dB,观察译码输出波形(当衰减45dB以上时,译码输出信号波形上叠加有较明显的噪声)。
也可以用本模块上的正弦信号源来观察PCM编译码系统的过载噪声(只要将STA-S或STB-S信号幅度调至5VP-P以上即可),但必须用专门的信号源才能较方便地观察到动态范围。

D. 编译原理实验报告

#include<stdio.h>
void main()
{

int m=0,n=0,n1=0,n2=0,n3=0,zg,fzg,flag;
int bz[7]=;/*状态改变控制,1 表示可以改变状态zt值,0 表示不可以*/
int zt[7]=;/*状态值,2表示未定状态,1表示 是,0表示 否*/

char temp[100]="\0";/*用于求first集*/
char z[7];/*非总结符*/
char z1[7];/*总结符*/
char z2[7]="\0";/*gs[]文法中出现的标记个数的辅助字符 01234*/
char gs[100]="\0";/*文法,按顺序排成字符串*/

printf("请依次输入非终结符(不超过7个):");
gets(z);
while(z[m]!='\0')

fzg=m;//zg是非终结符个数

while(n<m)
//生成01234辅助字符
printf("您输入了:");
puts(z);
fflush(stdin);

printf("请依次输入终结符(不超过7个):");
gets(z1);
while(z1[n1]!='\0')

zg=n1;
printf("您输入了:");
puts(z1);
fflush(stdin);

printf("按照正确格式输入所有文法(总长度不超过100格式如下):");
printf("如果文法为(字符'k'表示空):\n");
printf("S-->AB S-->bC A-->k A-->b\n");
printf("输入:0SAB0SbC1Ak1Ab\n");
printf(" (注:数字01234表示第一二三四个非终结符)\n");

gets(gs);
fflush(stdin);
printf("您输入了:");
puts(gs);
m=0;
//对于输入文法字符串的转换,将每个文法式左部去除
while(gs[m]!='\0')
{
n=m;
if(gs[m]>='0'&&gs[m]<='9')
{
m++;
while(gs[m]!='\0')
{
gs[m]=gs[m+1];
m++;
}
//gs[m-1]='\0';
}
m=++n;
}

m=0;

//puts(gs);

/*情况一,直接判定是 形如: (A-->k) */
while(gs[m]!='\0')
{
if(gs[m]=='k')
{
zt[gs[m-1]-48]=1;
bz[gs[m-1]-48]=0;
}
m++;
}

/*情况二,直接判定--否 形如: (D-->aS ,D-->c) */
for(n=0;n<fzg;n++)
{
if(bz[n]==1)
{
m=0;
n2=0;
while(gs[m]!='\0')
{
if(z2[n]==gs[m])
{
if(gs[m+1]>=z1[0]&&gs[m+1]<=z1[n1-1])
zt[n]=0;
else //gs[m+1] 是非终结符n2做标记
}
//跳出循环,无法解决该情况,推到下面情况三
m++;
}
if(n2!=99) //完成所有扫描,未出现非终结符,得出结论zt[n]=0.bz[n]=0不允许再改变zt[n]
}
}

/*情况三,最终判定*/
do
{
flag=0;
for(n=0;n<fzg;n++)
{
if(bz[n]==1) //未得到判定
{ m=0;
while(gs[m]!='\0')
{
if(gs[m]==z2[n]) //判定gs[m]是辅助字符0123
{
m++;
while(gs[m]>='A'&&gs[m]<='Z')
{

n1=0;
for(n2=0;n2<fzg;n2++) //循环查找是gs[m]哪个非终结符
{
if(gs[m]==z[n2])
{
if(zt[n2]==1) //这个非终结符能推出空
zt[n]=1;
else if(bz[n2]==1) //这个非终结符 现在 不能推出空,但它的状态可改即它最终结果还未判定

else
//设 m1 做标记供下一if参考
break; //找到gs[m]是哪个非终结符,for循环完成任务,可以结束
}

}
if(n1==99) break;
m++;
}
}
m++;
}
if(zt[n]==1) bz[n]=0;
if(bz[n]==0) flag=1;//对应for下的第一个if(zt[n]==2)
}

}
}while(flag);

printf("结果是:\n");

for(m=0;m<5;m++)
{
switch(zt[m])
{
case 0:printf("%c---否\n",z[m]);break;
case 1:printf("%c---是\n",z[m]);break;
case 2:printf("%c---未定\n",z[m]);break;
}

}
/*
puts(gs);
puts(zt);
puts(z);
puts(z1);
puts(z2);
printf("%d,,,%d",fzg,zg);
*/

//下面求first集
//下面求first集

for(n=0;n<fzg;n++)

m=0;n=0;n1=0;n2=0;
while(gs[n]>='0'&&gs[n]<='9')
{
for(;m<fzg;m++)
{
if(n2!=m)
n1=0; //m=n2用于第二次以后的for循环中还原上次m的值

if(gs[n]==z2[m])
{
while(gs[n+1]>'9')
{
if(n1==0)
//如果是第一个直接保存

//不是第一个,先与字符数组中其它字符比较,没相同的才保存
else if(gs[n]>='a'&&gs[n]<='z'&&gs[n+1]>='A'&&gs[n+1]<='Z') //gs[n]是终结符 且 gs[n+1]是非终结符
;//什么也不做,程序继续n++,扫描下一个gs[n]

else
{
for(n3=0;n3<=n1;n3++)
{
if(temp[m*13+n3]==gs[n+1])
break;
}

if(n3>n1) //for循环结束是因为n3而不是break

}
n++;
}
break; //break位于if(gs[n]==z2[m]),对于gs[n]已找到z2[m]完成任务跳出for循环
}
}
n2=m; //存放该for循环中m的值
n++;
}
//进一步处理集除去非终结符
m=0;n=0;n1=0;n2=0;
for(m=0;m<fzg;m++)
{
if(flag!=m)
n1=0; //m=flag用于第二次以后的for循环中还原上次m的值

while(temp[m*13+n1]!='\0')
{
while(temp[m*13+n1]>='A'&&temp[m*13+n1]<='Z') //搜索非终结符
{
for(n=0;n<fzg;n++) //确定是哪个非终结符
{if(temp[m*13+n1]==z[n])
break;
}
while(temp[m*13+n1]!='\0') //从temp[n*13+n1]开始每个字符依次往前移动一

n1--;
while(temp[n*13+n2]!='\0') //把z[n]对应的first加入temp[m*13+n1]这个first中,每个字符依次加在最后
{
for(n3=0;n3<n1;n3++) //循环判定是否有相同的字符
{
if(temp[m*13+n3]==temp[n*13+n2])
break;
}
if(temp[n*13+n2]=='k'&&zt[m]==0) //那些不能推出 空,但是因为要加入 其他非终结符的first集 而可能含有 空
n2++;
else if(n3>=n1) //for循环结束是因为n3而不是break ,即无相同字符

else n2++;
}

n1=0;
n2=0;
}

n1++;
}
flag=m; //存放该for循环中m的值
}

//非终结符的first集输出
m=0;n1=0;
for(m=0;m<fzg;m++)
{
n1=0;
printf("非终结符 %c 的first集是: ",z[m]);
while(temp[m*13+n1]!='\0')
{
printf("%c",temp[m*13+n1]);
n1++;
}
printf("\n");
}

}

E. 编译程序有哪些主要构成成分它们各自的主要功能是什么

编译过程分为分析和综合两个部分,并进一步划分为词法分析、语法分析、语义分析、代码优化、存储分配和代码生成等六个相继的逻辑步骤。这六个步骤只表示编译程序各部分之间的逻辑联系,而不是时间关系。

编译过程既可以按照这六个逻辑步骤顺序地执行,也可以按照平行互锁方式去执行。在确定编译程序的具体结构时,常常分若干遍实现。对于源程序或中间语言程序,从头到尾扫视一次并实现所规定的工作称作一遍。每一遍可以完成一个或相连几个逻辑步骤的工作。

例如,可以把词法分析作为第一遍;语法分析和语义分析作为第二遍;代码优化和存储分配作为第三遍;代码生成作为第四遍。

反之,为了适应较小的存储空间或提高目标程序质量,也可以把一个逻辑步骤的工作分为几遍去执行。例如,代码优化可划分为代码优化准备工作和实际代码优化两遍进行。

(5)编译的实验有哪些扩展阅读

从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。执行词法分析的程序称为词法分析程序或扫描器。

源程序中的单词符号经扫描器分析,一般产生二元式:单词种别;单词自身的值。单词种别通常用整数编码,如果一个种别只含一个单词符号,那么对这个单词符号,种别编码就完全代表它自身的值了。若一个种别含有许多个单词符号,那么,对于它的每个单词符号,除了给出种别编码以外,还应给出自身的值。

词法分析器一般来说有两种方法构造:手工构造和自动生成。手工构造可使用状态图进行工作,自动生成使用确定的有限自动机来实现。

编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。编译程序的语法规则可用上下文无关文法来刻画。

阅读全文

与编译的实验有哪些相关的资料

热点内容
udp命令字 浏览:659
app服务端java源码 浏览:798
电脑用文件夹玩大型游戏 浏览:254
安卓耳塞失灵怎么办 浏览:765
华三交换机保存命令 浏览:605
命令方块怎么调键盘 浏览:841
不把密码存在服务器上怎么办 浏览:398
怎么让指令方块的命令消失 浏览:543
用单片机做plc 浏览:404
云服务器进入子目录命令 浏览:795
服务器机柜如何配电 浏览:578
怎么删除iphone资源库里的app 浏览:940
pdf鱼 浏览:648
单片机pcf8591什么作用 浏览:805
sql命令学院 浏览:283
加密软件在电脑那个盘 浏览:988
android获取外部存储 浏览:573
怎么查自己家的服务器地址 浏览:858
编程c语言工作好不好 浏览:569
单片机焊接地怎么连接 浏览:694