基于PCM语音信号编译码分析的课程设计报告_课程设计

基于PCM语音信号编译码分析的课程设计报告_课程设计
基于PCM语音信号编译码分析的课程设计报告_课程设计

*****************

实践教学

*******************

兰州理工大学

计算机与通信学院

《通信系统仿真训练》课程设计题目:基于PCM的语音信号编码和译码性能分析

摘要

本设计是基于PCM的语音信号编码和译码性能分析,从计算机的麦克风录取一段语音信号,录制时间为12秒,并对录下的语音信号进行时域分析。其主要内容是将模拟的语音信号数字化,具体分三步抽样、量化、编码。以PCM编码和译码原理,在MATLAB下对该段语音进行PCM编码(以A 律编码规则进行编码)和译码,并比较了与未编码波形的差别。

关键词:脉冲编码调制; 编码; 译码; 语音信号

目录

前言 (3)

一基本原理 (4)

1.1脉冲编码原理 (4)

1.1.1 抽样原理 (5)

1.1.2 量化原理 (5)

1.1.3 编码原理 (6)

1.1.4 译码原理 (7)

1.2A律13折线原理 (8)

二程序设计 (10)

2.1程序流程图 (10)

2.1.1 PCM编码函数设计流程图 (10)

2.1.2 PCM译码函数设计流程图 (1)

2.2详细程序代码 (2)

2.2.1主程序 (2)

2.2.2 A律十三折线PCM编码函数 (3)

2.2.3将N行8列矩阵转换为1行8*N列的矩阵的函数 (4)

2.2.4 A律十三折线PCM译码函数 (4)

2.2.5将8*N行1列的矩阵转换为N行8列矩阵的函数 (5)

三仿真结果及分析 (6)

3.1原始语音信号波形图 (6)

3.2编码前的信号图 (7)

3.3PCM编码后信号图 (8)

3.4PCM译码后信号图 (9)

总结 (10)

参考文献 (11)

致谢 (12)

前言

实际中的信源通常是模拟的,如电视信号、麦克风拾取的语音信号等。为了能够使模拟信号在数字通信系统中传输,特别是能够和其他数字信号一起在宽带综合业务数字通信网中同时传输,需要将模拟信号进行数字化。数字化的过程一般由抽样、量化、编码组成。其中,抽样要保证不丢失原始信息,而量化要满足一定的质量,最后编码解决信号的表示。该设计则是在MATLAB 平台下,依据脉冲编码调制原理对实际的语音信号进行PCM编码和译码。

脉冲编码调制(PCM,Pulse Code Modulation)在通信系统中完成将语音信号数字化功能。是一种对模拟信号数字化的取样技术,将模拟信号变换为数字信号的编码方式,特别是对于音频信号。PCM 对信号每秒钟取样 8000 次;每次取样为8个位,总共64kbps。PCM的实现主要包括三个步骤完成:抽样、量化、编码。分别完成时间上离散、幅度上离散、及量化信号的二进制表示。根据CCITT的建议,为改善小信号量化性能,采用压扩非均匀量化,有两种建议方式,分别为A律和μ律方式。欧洲和我国大陆采用A律,北美、日本和其他一些国家和地区采用μ律。本设计采用了A律方式,由于A律压缩实现复杂,常使用13折线法编码,采用非均匀量化PCM编码。

基于PCM的语音信号编码与译码性能分析,就是将一段模拟信号进行数字化,并通过对实际语音信号进行PCM编码和译码来掌握PCM编码和译码原理及其实现方法,提高我们综合应运基础知识能力和计算机编程能力,为今后的学习和工作积累经验。

一基本原理

1.1脉冲编码原理

通常把从模拟信号抽样、量化,直到变换成为二进制符号的基本过程,成为脉冲编码调制(PCM,Pulse Code Modulation),简称脉冲调制。PCM是一种对模拟信号数字化的取样技术,是一种将模拟信号变换为数字信号的编码方式。根据CCITT的建议,为改善小信号量化性能,采用压扩非均匀量化,有两种建议方式,分别为A律和 律方式。本设计采用了A律方式,采用非均匀量化PCM编码示意图如下图1-1所示:

图1-1 PCM原理框图

1.1.1 抽样原理

所谓抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号。该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号。它的抽样速率的下限是由抽样定理确定的。

在一个频带限制在(0,)h f 内的时间连续信号()f t ,如果以1/2h f 的时间间隔对它进行抽样,那么根据这些抽样值就能完全恢复原信号。或者说,如果一个连续信号()f t 的频谱中最高频率不超过h f ,当抽样频率2s h f f ≥时,抽样后的信号就包含原连续的全部信息[1]

。抽样定理在实际应用中应注意在抽样前后模拟信号进行滤波,把高于二分之一抽样频率的频率滤掉。这是抽样中必不可少的步骤。 1.1.2 量化原理

从数学上来看,量化就是把一个连续幅度值的无限数集合映射成一个离散幅度值的有限数集合。如图2所示,量化器Q 输出L 个量化值k y ,L k ,,3,2,1 =。

k y 常称为重建电平或量化电平。当量化器输入信号幅度x 落在k x 与1+k x 之间时,量化器输出电平为k y 。这个量化过程可以表达为[1]:

,}{)(1k k k y x x x Q x Q y =<<==+ L k ,,3,2,1 = (1-1) 这里k x 称为分层电平。通常:

k k k x x -=?+1 (1-2) 其中k ?称为量化间隔。

模拟信号的量化分为均匀量化和非均匀量化。由于均匀量化存在的主要缺点是:无论抽样值大小如何,量化噪声的均方根值都固定不变。因此,当信号()m t 较小时,则信号量化噪声功率比也就很小,这样,对于弱信号时的量化信噪比就难以达到给定的要求[2]。通常,把满足信噪比要求的输入信号取值范围定义为动态范围,可见,均匀量化时的信号动态范围将受到较大的限制。为了克服这个缺点,实际中,往往采用非均匀量化。

非均匀量化是根据信号的不同区间来确定量化间隔的。对于信号取值小的区间,其量化间隔v ?也小;反之,量化间隔就大。它与均匀量化相比,有两个突出的优点。首先,当输入量化器的信号具有非均匀分布的概率密度(实际中常常

是这样)时,非均匀量化器的输出端可以得到较高的平均信号量化噪声功率比;其次,非均匀量化时,量化噪声功率的均方根值基本上与信号抽样值成比例。因此量化噪声对大、小信号的影响大致相同,即改善了小信号时的量化信噪比。

实际中,非均匀量化的实际方法通常是将抽样值通过压缩再进行均匀量化。通常使用的压缩器中,大多采用对数式压缩。广泛采用的两种对数压缩律是μ压缩律和A压缩律。美国采用μ压缩律,我国和欧洲各国均采用A压缩律,因此,PCM编码方式采用的也是A压缩律。模拟信号的量化过程如图1-2所示[3]:

图1-2 模拟信号的量化

1.1.3 编码原理

所谓编码就是把量化后的信号变换成代码,其相反的过程称为译码。当然,这里的编码和译码与差错控制编码和译码是完全不同的,前者是属于信源编码的范畴。

在现有的编码方法中,若按编码的速度来分,大致可分为两大类:低速编码和高速编码。通信中一般都采用第二类。编码器的种类大体上可以归结为三类:逐次比较型、折叠级联型、混合型。在逐次比较型编码方式中,无论采用几位码,一般均按极性码、段落码、段内码的顺序排列。下面结合13折线的量化来加以说明。

在13折线法中,无论输入信号是正是负,均按8段折线(8个段落)进行编码。若用8位折叠二进制码来表示输入信号的抽样量化值,其中用第一位表示量化值的极性,其余七位(第二位至第八位)则表示抽样量化值的绝对大小。具体的做法是:用第二至第四位表示段落码,它的8种可能状态来分别代表8个段落的起点电平。其它四位表示段内码,它的16种可能状态来分别代表每一段落的16个均匀划分的量化级。这样处理的结果,8个段落被划分成128个量化级。段落码和8个段落之间的关系如表1-1所示[1];段内码与16个量化级之间的关系见表1-2所示[1]:

表1-1段落码表1-2段内码

语音PCM抽样频率是8KHZ,每个量化样值对应一个8位二进制码,故语音数字编码信号的速率为8bits×8kHz=64kb/s[4].量化噪声随级数的增多和极差的缩小而缩小。量化级数增多即样值个数增多,就要求更长的二进制编码。因此,量化噪声随二进制编码的位数增多而减少,即随数字编码信号的速率提高而减少。自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。

1.1.4 译码原理

PCM译码器是实现PCM编码的逆系统。其中各模块功能如下[5]:

D/A转换器:用来实现与A/D转换相反的过程,实现数字量转化为模拟量,从而达到译码最基本的要求,也就是最起码的步骤。

瞬时扩张器:实现与瞬时压缩器相反的功能,由于采用 A 律压缩,扩张也必须采用A律瞬时扩张器。

低通滤波器:由于采样脉冲不可能是理想冲激函数会引入孔径失真,量化时也会带来量化噪声,及信号再生时引入的定时抖动失真,需要对再生信号进行幅度及相位的补偿,同时滤除高频分量,在这里使用与编码模块中相同的低通滤波器。

1.2 A 律13折线原理

实际中,非均匀量化的实际方法通常是将抽样值通过压缩再进行均匀量化。通常使用的压缩器中,大多采用对数式压缩。广泛采用的两种对数压缩律是μ压缩律和A 压缩律。美国采用μ压缩律,我国和欧洲各国均采用A 压缩律,因此,PCM 编码方式采用的也是A 压缩律。

所谓A 压缩律也就是压缩器具有如下特性的压缩律[1]: A X A Ax y 1

0,ln 1≤<+=

(1-3)

11

,ln 1ln 1<≤++=X A

A Ax y

(1-4) 其中87.6A =。

A 律压扩特性是连续曲线,A 值不同压扩特性亦不同,在电路上实现这样的函数规律是相当复杂的。实际中,往往都采用近似于A 律函数规律的13折线(A=87.6)的压扩特性。在这个设计之中所用着的PCM 编码正是采用这种压扩特性来编码的。图1-2示出了这种压扩特性,表1-3列出了13折线时的x 值与计算x 值的比较。

图1-2 13折线特征

表1-3 计算值x与A律13折线时x值的比较

表1-3中第二行的x值是根据87.6

A=时计算得到的,第三行的x值是13折线分段时的值。可见,13折线各段落的分界点与87.6

A=曲线十分逼近,同时x 按2的幂次分割有利于数字化[1]。

二程序设计

2.1程序流程图

在MATLAB平台下,对录入的语音信号现进行PCM编码,然后对已经编码了的语音信号进行PCM译码,其整个过程的程序流程图如下图2-1所示:

图2-1 主函数流程图

2.1.1 PCM编码函数设计流程图

在MATLAB平台下,对录入的语音信号现进行PCM编码,其中 PCM的实现主要包括三个步骤完成:抽样、量化、编码。具体编码函数设计的流程图如下图2-2所示:

图2-2 PCM编码函数流程图2.1.2 PCM译码函数设计流程图

图2-3 PCM译码函数流程图

2.2详细程序代码

2.2.1主程序

close all;

clear all;

y=wavred(‘cang.wav’)

figure(1)

plot(y)

title(‘原始语音信号波形图’)

N=1001;

[M]=wavread('cang.wav');

S=M(2000:3000); %语音信源

Figure(2)

plot(S,'r'); hold on;%画出编码前信号

xlabel('时间') % x坐标名

ylabel('幅值') % y坐标名

grid on %添加网格

axis square %将图形设置为正方形

t1=pcm1(S); %调用编码函数

figure(3)

plot(t1); % 画出译码后信号

title('PCM编码前信号'); %标题

xlabel('时间') % x坐标名

ylabel('幅值') % y坐标名

grid on %添加网格

axis square %将图形设置为正方形

t2=tqm(t1); %将N行8列矩阵转换为1行8*N列的矩阵的函数t3=tqn(t2); %将8*N行1列的矩阵转换为N行8列矩阵的函数t4=pcm2(t3); %调用译码函数

figure(4)

plot(t4); % 画出译码后信号

title('PCM译码后信号'); %标题

xlabel('时间') % x坐标名

ylabel('幅值') % y坐标名

grid on %添加网格

axis square %将图形设置为正方形

2.2.2 A律十三折线PCM编码函数

function Y=pcm1(S)

z=sign(S); %判断S的正负

Max=max(abs(S)); %求S的最大值

S=abs(S/Max); %归一化

Q=2048*S; %量化

Y=zeros(length(S),8); %存储矩阵(全零)

%%段落码判断%%

for m=1:length(S)

if Q(m)>128 && Q(m)<2048 %在第五段与第八段之间,段位码第一位都为“1”

Y(m,2)=1;

end

if (Q(m)>32 && Q(m)<128) || (Q(m)>512 && Q(m)<2048)

Y(m,3)=1; %在第三四七八段内,段位码第二位为“1” end

if

(Q(m)>16&&Q(m)<32)||(Q(m)>64&&Q(m)<128)||(Q(m)>256&&Q(m)<512)|| (Q(m)>1024&&Q(m)<2048)

Y(m,4)=1; %在二四六八段内,段位码第三位为“1”

end

%符号位的判断

if z(m)>0

Y(m,1)=1;

elseif z(m)<0

Y(m,1)=0;

end

end

%段内码判断程序

N=zeros(length(S));

for m=1:length(S)

N(m)=Y(m,2)*4+Y(m,3)*2+Y(m,4)+1; %找到Y位于第几段

end

a=[0,16,32,64,128,256,512,1024]; %量化间隔

b=[1,1,2,4,8,16,32,64]; %除以16,得到每段的最小量化间隔

for m=1:length(S)

q=ceil((Q(m)-a(N(m)))/b(N(m))); %求出在段内的位置

if q==0

Y(m,(5:8))=[0,0,0,0]; %如果输入为零则输出“0” else k=num2str(dec2bin(q-1,4)); %编码段内码为二进制

Y(m,5)=str2num(k(1));

Y(m,6)=str2num(k(2));

Y(m,7)=str2num(k(3));

Y(m,8)=str2num(k(4));

end

end

end

2.2.3将N行8列矩阵转换为1行8*N列的矩阵的函数

function t1=tqm(R)

t1=zeros(length(R)*8,1);

c=1;

for a=1:length(R)-1

for b=1:8

t1(c)=R(a,b);

c=c+1;

end

end

t1=t1';

end

2.2.4 A律十三折线PCM译码函数

%PCM译码程序

function S=pcm2(Y)

d=size(Y,1); %求出输入码组的个数

a=[0,16,32,64,128,256,512,1024]; %段落起点值

b=[1,1,2,4,8,16,32,64]; %每段的最小量化间隔c=[0,1.5:15.5]; %段内码平均值

for m=1:d

t1=Y(m,1); %取符号

t2=Y(m,2)*4+Y(m,3)*2+Y(m,4)+1; %判断段落位置

t3=Y(m,5)*8+Y(m,6)*4+Y(m,7)*2+Y(m,8); %判断段内位置

if t3==0 %段内码为零时

k(m)=a(t2)/2048;

else

k(m)=(a(t2)+b(t2)*c(t3))/2048; %还原出量化后的电平值 end

%判断符号位

if t1==0

S(m)=-k(m);

else

S(m)=k(m);

end

end

2.2.5将8*N行1列的矩阵转换为N行8列矩阵的函数

function t2=tqn(t1)

t2=zeros(length(t1)/8,8);

a=1;

b=1;

for m=1:length(t1)-1

if b>8

a=a+1;

b=1;

end

t2(a,b)=t1(m);

b=b+1;

m=m+1;

end

三仿真结果及分析

3.1原始语音信号波形图

在MATLAB下,调用函数wavrecord(6*fs,fs,’int16’)录制一段话音信号,其时间为6秒,同时完成对语音信号的采样,采样频率是8000Hz。然后对原始语音信号进行分析,画出它的时域波形图如下图3-1所示,对其进行时域分析,分析语音信号的特性。

图3-1 原始语音信号波形图

由原始语音信号的时域波形图3-1可知,语音信号是模拟信号,其在时间上和幅度上都连续的信号。

运行程序后,语音信号经抽样、量化后的信号图如下图3-2所示:

图3-2 PCM编码前的信号图

原始语音信号是模拟信号,在PCM编码前将其数字化的过程中,要先经过抽样和量化两步。模拟信号被抽样后,成为抽样信号,它在时间上是离散的,但是其取值仍然是连续的。

运行程序后,语音信号经PCM编码后的波形图如下图3-3所示:

图3-3PCM编码后信号图

由于,次设计PCM编码的方式采用的是A压缩律,将抽样、量化后的信号变换成二进制码元。语音信号为交流信号,即输入电压有正负极性,用以为二进制码元来表示极性。采用A律13折线法,将量化区间划分成非均匀的8段,用3位二进制码元表示抽样值所在段。又将每段均匀分为16小段,用4位二进制码元表示。经PCM编码后,每一抽样值被用8位二进制码元表示。

运行程序后,语音信号经PCM译码后的信号图如下图3-4所示:

图3-4PCM译码后信号图

译码是编码的逆过程,语音信号经PCM译码后的波形与编码前的信号波形相比较,可以无失真将原始语音信号恢复出来。

编译实验报告+源代码

课程设计报告 ( 2013-- 2014年度第1学期) 名称:编译技术课程设计B 题目:简单编译程序的设计与实现院系:计算机系 班级:XXX 学号:XXX 学生姓名:XXX 指导教师:XXX 设计周数:XXX 成绩: 日期:XX 年XX 月

实验一.词法分析器的设计与实现 一、课程设计(综合实验)的目的与要求 1.1 词法分析器设计的实验目的 本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。 1.2 词法分析器设计的实验要求 设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。 单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。 表1-1 单词符号及其内部表示

二、设计(实验)正文 1.词法分析器流程图 2.词法分析器设计程序代码 // first.cpp : 定义控制台应用程序的入口点。// #include"stdafx.h" #include #include using namespace std; int what(char a) { if((int(a)>=48)&&(int(a)<=57)) {

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告 一个简单文法的编译器的设计与实现专业班级:计算机1406班 组长姓名:宋世波 组长学号: 20143753 指导教师:肖桐 2016年12月

设计分工 组长学号及姓名:宋世波20143753 分工:文法及数据结构设计 词法分析 语法分析(LL1) 基于DAG的中间代码优化 部分目标代码生成 组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0) 部分目标代码生成 组员2学号及姓名:孙何奇20143754 分工:符号表组织 部分目标代码生成

摘要 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。 一.编译器的概述 1.编译器的概念 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。 2.编译器的种类 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语

编译原理课程设计

《编译原理》课程设计大纲 课程编号: 课程名称:编译原理/Compiler Principles 周数/学分:1周/1学分 先修课程:高级程序设计语言、汇编语言、离散数学、数据结构 适用专业:计算机科学与技术专业、软件工程专业 开课学院,系或教研室:计算机科学与技术学院 一、课程设计的目的 课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。 设计时间: 开发工具: (1) DOS环境下使用Turbo C; (2) Windows环境下使用Visual C++ 。 (3) 其它熟悉语言。 二、课程设计的内容和要求 设计题一:算术表达式的语法分析及语义分析程序设计。 1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词 法检查和分析。 2.设计内容及要求: 算术表达式的文法: 〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ (1) 分别选择递归下降法、算符优先分析法(或简单优 先法)完成以上任务,中间代码选用逆波兰式。 (2) 分别选择LL(1)、LR法完成以上任务,中间代码选 用四元式。 (3) 写出算术表达式的符合分析方法要求的文法,给出 分析方法的思想,完成分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通 过所设计的分析程序。 设计题二:简单计算器的设计 1.目的 通过设计、编制、调试一个简单计算器程序,加深对语法及语 义分析原理的理解,并实现词法分析程序对单词序列的词法检 查和分析。 2.设计内容及要求 算术表达式的文法:

Tiny语言的词法分析器-C++版-课程设计报告

实验报告学号:姓名:专业:计算机科学与技术班级:2班第9周

二、构造Tiny语言DFA # ID:letter(letter)* Number: digit(digit)*

三、根据DFA编写词法分析器 #include #include ! #include using namespace std; static int rowCounter = 1;//静态变量,用于存储行数 static bool bracketExist = false;//判断注释存在与否,false为不存在 class Lex { @ public: ofstream output; string line = ""; Lex(string inputLine) { line = inputLine; scan(Trim(line)); 、 rowCounter++; } string Trim(string &str)//函数用于去除每行前后空格 { int s = (" \t"); int e = (" \t"); str = (s, e - s + 1); str += "\0"; : return str; }

{ ofstream output; ("", ios::app); % string line = inputLine; int i = 0; string str = ""; int temp; string token = ""; output << rowCounter << ": " << line << endl;//输出每行 while (line[i] != '\0')//根据DFA扫描并判断 ' { if (line[i] == '{')//注释 { bracketExist = true; } if (bracketExist == true) { output << "\t" << rowCounter << ": "; , while (line[i] != '}') { output << line[i];//不处理,直接输出 if (line[i + 1] != NULL) { i++; } … else break; } if (line[i] == '}')//注释结束 { output << line[i]<

编译原理课程设计报告

2011-2012学年第二学期 《编译原理》课程设计报告 学院:计算机科学与工程学院 班级: 学生姓名:学号: 成绩: 指导教师: 时间:2012年5 月

目录 一、课程设计的目的 ---------------------------------------------------------------- - 1 - 二、课堂实验及课程设计的内容 -------------------------------------------------- - 1 - 2.1、课堂实验内容-------------------------------------------------------------- - 1 - 2.2、课程设计内容-------------------------------------------------------------- - 1 - 三、visual studio 2008 简介------------------------------------------------------- - 2 - 四、问题分析及相关原理介绍 ----------------------------------------------------- - 3 - 4.1、实验部分问题分析及相关原理介绍 ---------------------------------- - 3 - 4.1.1、词法分析功能介绍及分析------------------------------------- - 3 - 4.1.2、语法分析功能介绍及分析------------------------------------- - 3 - 4.1.3、语义分析功能介绍及分析------------------------------------- - 4 - 4.2、课程设计部分问题分析及相关原理介绍 ---------------------------- - 5 - 4.2.1、编译程序介绍 ----------------------------------------------------- - 5 - 4.2.2、对所写编译程序的源语言的描述(C语言) -------------- - 6 - 4.2.3、各部分的功能介绍及分析 -------------------------------------- - 7 - 4.3、关键算法:单词的识别-------------------------------------------------- - 8 - 4.3.1、算法思想介绍 ----------------------------------------------------- - 8 - 4.3.2、算法功能及分析 -------------------------------------------------- - 8 - 五、设计思路及关键问题的解决方法 ------------------------------------------ - 10 - 5.1、编译系统------------------------------------------------------------------ - 10 - 5.1.1、设计思路 --------------------------------------------------------- - 10 - 5.2、词法分析器总控算法--------------------------------------------------- - 12 - 5.2.1、设计思路 --------------------------------------------------------- - 12 - 5.2.2、关键问题及其解决方法 --------------------------------------- - 13 - 六、结果及测试分析-------------------------------------------------------------- - 14 - 6.1、软件运行环境及限制--------------------------------------------------- - 14 - 6.2、测试数据说明------------------------------------------------------------ - 14 - 6.3、运行结果及功能说明--------------------------------------------------- - 16 - 6.4、测试及分析说明--------------------------------------------------------- - 16 - 七、总结及心得体会 --------------------------------------------------------------- - 17 - 7.1、设计过程------------------------------------------------------------------ - 17 - 7.2、困难与收获 ------------------------------------------------------------- - 17 - 八、参考文献 ------------------------------------------------------------------------ - 18 -

编译原理课程设计报告_LL(1)分析过程模拟

课程设计(论文)任务书 软件学院学院软件工程专业07-1班 一、课程设计(论文)题目LL(1)分析过程模拟 二、课程设计(论文)工作自 2010 年 6 月 22日起至 2010 年 6月 28 日止。 三、课程设计(论文) 地点: 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)使学生掌握LL(1)模块的基本工作原理; (2)培养学生基本掌握LL(1)分析的基本思路和方法; (3)使学生掌握LL(1)的调试; (4)培养学生分析、解决问题的能力; (5)提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)分析LL(1)模块的工作原理; (2)提出程序的设计方案; (3)对所设计程序进行调试。 2)创新要求: 在基本要求达到后,可进行创新设计,如改算法效率。 3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括目录、绪论、正文、小结、参考文献、附录等 (3)课程设计论文装订按学校的统一要求完成 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程(含翻译):40分; (3)完成调试:20分;

(4)回答问题:20分。 5)参考文献: (1)张素琴,吕映芝,蒋维杜,戴桂兰.编译原理(第2版).清华大学出版社 (2)丁振凡.《Java语言实用教程》北京邮电大学出版社 6)课程设计进度安排 内容天数地点 构思及收集资料2图书馆 编程与调试4实验室 撰写论文1图书馆、实验室 学生签名: 2009 年6 月22 日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)完成调试(20分):优()、良()、中()、一般()、差();(4)翻译能力(20分):优()、良()、中()、一般()、差();(5)回答问题(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

CMinus词法分析和语法分析设计编译器编译原理课程设计报告书

编译原理课程设计报告 课题名称:C- Minus词法分析和语法分析设计 提交文档学生姓名:X X X 提交文档学生学号:XXXXXXXXXX 同组成员名单:X X X 指导教师姓名:X X 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2015年6月10日

1.课程设计目标 实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。 2.分析与设计 C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。 2.1 、扫描程序scanner部分 2.1.1系统设计思想 设计思想:根据DFA图用switch-case结构实现状态转换。 惯用词法:

①语言的关键字:else if int return void while ②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 大写和小写字母是有区别的 ④空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM 关键字。 ⑤注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 scanner的DFA

说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。 2.1.2程序流程图

编译原理 C++编译器课程设计报告

编译器的设计与分析 学号: 1233050143 姓名:李博 专业:计算机科学与技术 __ 课程:编译原理 指导教师:闫红

实验目的 本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码 ((四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序 列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序 分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分 实验要求: 本程序仅考虑由下面产生式所定义的程序语句: S →if B then S else S | while B do S | begin L end | A L →S;L | S A →i:= E B →B∧B|B∨B|~B|(B)|I rop i|i

其中,各个非终结符的含义是: S---语句 L—语句串 A—赋值句 B---布尔表达式 E---算术表达式 各个终结符的含义: i---整型变量或常数,布尔变量或常数; rop---为六种关系运算符的代表; ;---起语句分隔作用; :=---赋值符号 ~--逻辑非运算符; ∧----逻辑与运算符; ∨---逻辑或运算符; 规定程序是由一条语句或由begin和end嵌套起来的复合语句组成的,并且规定的语句末加上#@表示程序结束。下面是符合规定的程序示例:begin A:=A+B*C; C:=A+2; while AB do

if M=N THEN C:=D else while A<=D do A:=D end#@ 实验内容: 第一部分:词法分析 一.词法分析的功能: 输入:所给文法的源程序字符串 输出:1.二元组(单词种别,单词符号的属性值)构成的序列 2.关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于 Pascal语言中的end ) 所有的关键字都是小写字母. 3.运算符: + , - , * , / , = , < , <= , == , > , >= ,<> , && ,|| , ! 4.界符: 逗号,分号,左圆括号, 右圆括号, # 5.常数: 在这里只涉及到int型常量 6.其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义: ID = letter(letter|digit)* NUM = digit digit * 7.空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。 二.词法分析程序设计

(重庆理工大学计算机学院)编译原理课程设计报告

编译原理课程设计报告 实验名称编译原理课程设计 班级 学号 姓名 指导教师 实验成绩 2013 年06月

一、实验目的 通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。 通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。 二、实验内容 正规式——>NFA——>DFA——>MFA 1.正规式转化为不确定的有穷自动机 (1)目的与要求 通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。 (2)问题描述 任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。 (3)算法描述 对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。 步骤1:首先构造基本符号的有穷自动机。 步骤2:其次构造连接、或和闭包运算的有穷自动机。

(4)基本要求 算法实现的基本要求是: (1) 输入一个正规式r; (2) 输出与正规式r等价的NFA。(5)测试数据 输入正规式:(a|b)*(aa|bb)(a|b)* 得到与之等价的NFA N

(6)输出结果 2.不确定的有穷自动机的确定化 (1)目的与要求 通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。DFA的表现形式可以是表格或图形。(2)问题描述 任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。 (3)算法描述 用子集法将NFA转换成接受同样语言的DFA。 步骤一:对状态图进行改造 (1) 增加状态X,Y,使之成为新的唯一的初态和终态。从X引ε弧到原初态结点, 从原终态结 点引ε弧到Y结点。 (2) 对状态图进一步进行如下形式的改变

编译原理课程设计报告

编译原理课程设计报告 实验1:用Lex设计词法分析器1 实验目的:学会用lex设计一个词法分析器。 实验内容:使用lex为下述文法语言写一个词法分析器。 实验要求: 输入为用该语言所写的源程序文件;输出为记号序列,每个记号显示为二元组(记号名,记号属性值)的形式。输出可以在屏幕上,也可以输出到文件中。不要求建立符号表。 在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases目录下的测试例的测试。 实验参考:和。 语言文法: <程序>? PROGRAM <标识符> ; <分程序> <分程序>? <变量说明> BEGIN <语句表> END. <变量说明> ? VAR <变量说明表>;

<变量说明表>?<变量表>: <类型> | <变量表>: <类型>; <变量说明表> <类型>? INTEGER | REAL <变量表>? <变量> | <变量>, <变量表> <语句表>? <语句> | <语句>; <语句表> <语句>? <赋值语句> | <条件语句> | | <复合语句> <赋值语句>?<变量> := <算术表达式> <条件语句>? IF <关系表达式> THEN <语句> ELSE <语句> ? WHILE <关系表达式> DO <语句> <复合语句> ? BEGIN <语句表> END <算术表达式> ? <项> | <算术表达式> + <项> | <算术表达式> - <项> <项> ? <因式> | <项> * <因式> | <项> / <因式> <因式>? <变量> | <常数> | (<算术表达式>) <关系表达式>? <算术表达式> <关系符> <算术表达式>

吉林大学《编译原理课程设计》满分实验报告

2016级《编译原理课程设计》总结报告(组) _2019_年_5_月_25_日

报告正文(请用小四号宋体填写,自行组织章节和段落) 目录 第一部分实验成果统计表 (1) 第二部分实验简介 (2) 第三部分词法分析 (3) 第四部分语法分析 (6) LL(1)语法分析 (7) LR语法分析 (10) 第五部分程序测试 (22) 第一部分实验成果统计表 见首页 第二部分实验简介 实验目的 分组(每组最多3人)完成对SNL语言的以下两个程序:词法分析程序,语法分析程序(方法不限)。察并锻炼学生的团队协作能力,代码编写能力,加深同学对编译原理中SNL编译系统的理解,帮助同学理解整个编译原理的机制 实验内容 本实验中实现了SNL编译系统中的词法分析、语法分析。其中语法分析包括LL(1)分析方法和LR分析方法 词法分析,以源程序为输入,生成单词的内部表示TOKEN序列。 语法分析,以TOKEN序列为输入进行语法分析,并生成整个源程序的语法分析树。在SNL编译程序中,采用了两种语法分析方法实现:LL(1)和LR,前者为自顶向下的,后者为自底向上的。两种语法分析的结果是一样的。 实验步骤 编译系统的总体分析(算法分析,数据结构设计,优化)→代码实现,分工进行词法分析,语法分析部分→代码测试→结果反馈,修正→系统界面优化设计

作符栈和操作数栈。 LL(1)语法分析的主要函数有:doGrammar()、Grammar()、findRuleIndex()、getVariables()、getStartVariable()、computeFirstSets()、computeFollowSet()、getRuledByLeftVariable()、getTerminals()、getFirstSets()、getFallowSets()等等doGrammar()函数是最主要的函数。它利用LL(1)分析表和符号栈进行语法分析,并处理终极符不匹配和文件提前结束错误。函数处理完成后,得到整个语法树。 Grammar()函数主要进行Rule格式转换。 自底向上语法分析 LR(0)分析方法实现过程 结构如下 LR(0)

编译课程设计

课程设计报告 课程设计名称:编译技术 系别:三系 学生姓名: 班级:软件班 学号: 成绩: 指导教师: 开课时间:学年学期

一.设计题目 (1) 二.主要内容 (1) 三.具体要求 (1) 四.进度安排 (1) 五.成绩评定 (2) 六.设计思路 (2) 6.1 单词符号及种别表 (2) 6.2 SLR的分析表 (3) 6.21 算术表达式的SLR(1)分析表 (3) 6.22 布尔表达式的LR分析表 (4) 6.23 程序语句的LR分析表 (5) 七.程序运行结果截图 (6) 八.设计体会 (10)

一.设计题目 设计和实现一个简单的小型高级程序设计语言的编译器 二.主要内容 自定义一种简单的小型高级程序设计语言,采用任意一种编程语言和编程工具设计并实现其编译器,展示编译系统中词法分析和语法分析(LR分析方法)的全过程。 三.具体要求 3.1对单词的构词规则有明确的定义; 3.2编写的词法分析程序能够正确识别源程序中的单词符号; 3.3识别出的单词以<种别码,值>的二元式形式保存并输出; 3.4构造出程序设计语言各语法单位的SLR(1)分析表 (其他分析表亦可); 3.5能够对输入的源程序做出正确的语法分析并输出清晰的结果; 3.6高级语言的规模不易过大,注重编译器内核的设计,对于界面无要求; 3.7课程设计报告中应对所自定义高级语言进行简单描述,对编译器的设计进行简单的需求分析,给出设计说明和程序结构框架,阐明设计思路、用到的原理和方法。 3.8不可更改课程设计报告中已有的字体和格式,课程设计报告中新加入内容,汉字采用宋体五号字,英文字符和数字采用Times New Roman五号字,行距全部采用单倍行距。 3.9课程设计报告中的运行结果应以程序运行截图形式出现。 3.10程序源代码以附件形式发送至指定邮箱:sqckcsj2011@https://www.360docs.net/doc/00947726.html,。附件名称为:“完整学号+姓名” 四.进度安排

编译技术课程设计报告模板静

编译技术课程设计 班级网络1102 学号3110610035 姓名徐静 指导老师年轶 2014年6 月

目录 一、目的 (2) 二、题目 (2) 三、要求 (2) 四、实验环境 (2) 五、系统实现 (2) 六、程序运行结果 (8) 七、总结 (9)

一、目的 通过《编译原理》课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,掌握词法分析、语法分析、语义分析、代码生成和报错处理等理论与实践的结合,提高自己的编程能力,培养好的程序设计风格。同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。 二、题目 输入文法,自动生成分析表,并完成语法分析工作 三、要求 题目3 文法编译器的自动生成器 输入文法,自动生成分析表,并完成语法分析工作。 语法分析方法可以是:LL(1)分析法或LR分析法。 为文法构造分析表,并对输入串进行语法分析,判别是否符合语法规则,如果不符合,则输出错误信息。 输入:文法,文法符号串 输出:分析表、分析栈、分析结果 四、实验环境 开发环境Visual Studio6.0 语言C++ 五、系统实现 1.分析方法说明 所谓LL(1)分析法,就是指从左到右扫描输入串(源程序),同时采用最左推导,且每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现LL(1)分析的程序又称为LL(1)分析程序或LL(1)分析器。 我们知道一个文法要能进行LL(1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL(1)分析表,最后利用分析表,根据LL(1)语法分析构造一个分析器。LL(1)的语法分析程序包含了三个部分,总控制程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该程序是采用了C++语言来编写。 2.分析表的构造算法 在构造LL(1)预测分析表之前,首先要构造该文法的每个非终结符的FIRST和FOLLOW 集合,按照下面描述的算法来构造这两个集合。 ①FIRST集合的构造算法: (1)若X∈VT,则FIRST(X)={X}。 (2)若X∈VN,且有产生式X→a……,则把a加入到FIRST(X)中;若X→ε也是一条产生式,则把ε也加到FIRST(X)中。 (3)若X→Y……是一个产生式且Y∈VN,则把FIRST(Y)中的所有非ε-元素都加到FIRST(X)中;若X→Y1Y2…Yk是一个产生式,Y1,…,Yi-1都是非终结符,而且,对于任何j,1≤j

编译原理课程设计报告.doc

编译原理课程设计报告 Part A: 源文件: *.plo 目标文件: *.COD 实现平台:C++ Builder6.0 运行平台:xindows xp sp2 1.设计说明 PL/0语言是Pascal语言的一个子集,这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。 PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。词法分析和代码生成作为独立的子程序供语法分析程序调用。语法分析的同时,提供了出错报告和出错恢复的功能。在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。 2.各功能模块描述 词法分析子程序分析: 词法分析子程序名为GETSYM,功能是从源程序中读出一个单词符号(TOTAKEN),把它的信息放入全局变量SYM、ID和NUM中,字符变量放入CH中,语法分析器需要单词时,直接从这三个变量中获得。Getch过程通过反复调用Getch 子过程从源程序过获取字符,并把它们拼成单词。GETCH过程中使用了行缓冲区技术以提高程序运行效率。 词法分析器的分析过程:调用GETSYM时,它通过GETCH过程从源程序中获得一个字符。如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把SYM变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把SYM 置为IDENT,把这个单词存入ID变量。查保留字表时使用了二分法查找以提高效率。如果Getch获得的字符是数字,则继续用Getch获取数字,并把它们拼成一个整数或实数,然后把SYM置为INTEGER或REAL,并把拼成的数值放入NUM变量。如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把SYM则成相应的类型。如果遇到不合法的字符,把SYM置成NUL。 语法分析子程序分析: 语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语义生成相应三元代码,并提供了出错处理的机制。语法分析主要由分程序分析过程(BLOCK)、参数变量分析过程(ParaDeclaration)、参数变量处理过程(ParaGetSub)、数组处理过程(ParaGetSub)、常量定义分析过程(ConstDeclaration)、变量定义分析过程(Vardeclaration)、语句分析过程(Statement)、表达式处理过程(Expression)、项处理过程(Term)、因子处理过程(Factor)和条件处理过程(Condition)构成。这些过程在结构上构成一个嵌套的层次结构。除此之外,还有出错报告过程(Error)、代码生成过程(Gen)、测试单词合法性及出错恢复过程(Test)、登录名字表过程(Enter)、查询名字表函数(Position)以及列出类PCODE代码过程(Listcode)作过语法分析的辅助过程。 由PL/0的语法图可知:一个完整的PL/0程序是由分程序和句号构成的。因此,本编译程序在运行的时候,通过主程序中调用分程序处理过程block来分析分程序部分(分程序分析过程中还可能会递归调用block过程),然后,判断最后读入的符号是否为句号。如果是句号且分程序分析中未出错,则是一个合法的PL/0程序,可以运行生成的代码,否则就说明源PL/0程序是不合法的,输出出错提示即可。 下面按各语法单元分析PL/0编译程序的运行机制。 分程序处理过程: 语法分析开始后,首先调用分程序处理过程(Block)处理分程序。过程入口参数置为:0层、符号表位置0、出错恢复单词集合为句号、声明符或语句开始符。进入Block过程后,首先把局部数据段分配指针设为3,准备分配3个单元供运行期存放静态链SL、动态链DL 和返回地址RA。然后用Tx0记录下当前符号表位置并产生一条Jmp指令,准备跳转到主程序的开始位置,由于当前还没有知到主程序究竟在何处开始,所以Jmp的目标暂时填为0,稍后再改。同时在符号表的当前位置记录下这个Jmp指令在代码段中的位置。在判断了嵌套层数没有超过规定的层数后,开始分析源程序。首先判断是否遇到了常量声明,如果遇到则开始常量定义,把常量存入符号表。接下去用同样的方法分析变量声明,变量定义过程中会用Dx变量记录下局部数据段分配的空间个数。然后如果遇到Procedure保留字则进行过程声明和定义,声明的方法是把过程的名字和所在的层次记入符号表,过程定义的方法就是通过递归调用Block过程,因为每个过程都是一个分程序。由于这是分程序中的分程序,因此调用Block时需把当前的层次号Lev加一传递给Block 过程。分程序声明部分完成后,即将进入语句的处理,这时的代码分配指针CX的值正好指向语句的开始位置,这个位置正是前面的Jmp指令需要跳转到的位置。于是通过前面记录下来的地址值,把这个Jmp指令的跳转位置改成当前cx 的位置。并在符号表中记录下当前的代码段分配地址和局部数据段要分配的大小(DX 的值)。生成一条INT指令,分配DX个空间,作为这个分程序段的第一条指令。下面就调用语句处理过程Statement分析语句。分析完成后,生成操作数为0的OPR指令,用于从分程序返回(对于0层的主程序来说,就是程序运行完成,退出)。 常量定义过程: 通过循环,反复获得标识符和对应的值,存入符号表。符号表中记录下标识符的名字和它对应的值。 变量定义过程: 与常量定义类似,通过循环,反复获得标识符,存入符号表。符号表中记录下标识符的名字、它所在的层及它在所在层中的偏移地址。

编译技术课程设计报告书

课程设计报告 ( 2013 – 2014 年度第1学期) 名称:编译技术课程设计A 题目:L语言编译器的设计与实现院系:计算机系 班级:软件1101 学号: 学生姓名: 指导教师:鲁斌王新颖 设计周数: 2 周 成绩: 日期:2013 年12 月27 日

《编译技术》课程设计 任务书 一、目的与要求 1.任务:实现一个简单的编译程序,能够对指定程序设计语言进行编译。 2.目的:加深对课堂讲授知识的理解,熟练掌握编译程序设计原理及常用的技术,建立编译程序的整体概念,使得学生初步具有研究、设计、编制和调试编译程序的能力。 3.要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,进行静态检查,设计出输入数据、显示输出数据;基本功能完善,方便易用,操作无误;通过课程设计学会编译程序设计与实现的常用技术,具备初步分析、设计和开发编译程序的能力,具备分析与检查软件错误、解决和处理实验结果的能力。 4.学生要求人数:2人,1人负责扫描器和目标代码生成器的设计和实现,另1人负责语法分析器和语法制导翻译程序的设计和实现。 二、主要内容 下面是课程设计主要内容的简介,详细内容请见《编译技术课程设计指导书》。 1.扫描器设计 该扫描器是一个子程序,其输入是源程序字符串,每调用一次输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设程序设计语言中,基本字不能用作一般标识符,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。 2.语法分析器设计 以算法优先分析方法为例,设计一个算符优先语法分析程序。算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。当然,也可采用预测分析等方法设计语法分析器,具体方法自定。 3.语法制导翻译程序设计 采用语法制导翻译方法,实现算术表达式、赋值语句和基本控制语句等的翻译。本语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。 4.目标代码生成器设计 将程序设计语言的中间代码程序翻译为目标代码程序,其输入是四元式序列,输出是一个汇编代码文件。

编译原理课设报告2

编译原理课程设计题目:pl/0编译程序的改进与完善 学生所在学院:信息科学与工程学院 学生所在班级:06级计算机软件1班 学生姓名: 学生学号: 指导教师:张世辉

一、课设目的: 1.阅读、研究、改进、设计和调试一个简单的编译程序; 2.加深对编译程序理论和编译过程的理解。 二、课设内容: 1扩充语句for(<语句>;<条件>;<语句>)<语句>; 2扩充语句if <条件> then <语句> else <语句>; 3扩充语句repeat <语句>;until <条件>; 4增加自增自减运算++和—和+=,-=运算; 5修改不等号#,为!=; 6增加一维数组 声明格式:[/:/]; 赋值格式:[]:=<表达式>; 调用格式:[] 三、程序结构: PL/0源程序 图1 编译程序结构图2功能模块调用

1.各功能模块的作用: Pl0.c:主程序 Error:出错处理,打印出错位置和错误编码 Getsym:词法分析,读取一个单词 Getch:漏掉空格,读取一个字符 Gen:生成目标代码,并送入目标程序区 Test:测试当前当前符号是否合法 Block:分程序分析处理过程,词法语法分析 Enter:登陆名字表 Position:查找标识符在名字表中的位置 Constdeclaration:常量定义处理 Vardeclaraction:变量说明处理 Listcode:列出目标代码清单 Statement:语句处理 Expression:表达式处理 Term:项处理 Factor:因子处理 Condition:条件处理 Interpret:对目标代码的解释执行程序 Base:通过静态链求出数据取得基地址 增加两个功能: Arraydeclaration:数组声明处理 Arraycoef:数组索引计算和“虚拟机”动作生成 2.保留字: enum symbol {nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym, thensym,elsesym, forsym, inc, dec, whilesym, writesym, readsym, dosym, callsym, constsym,varsym, procsym, repeatsym, untilsym, plusbk, minusbk, lbrack, rbrack, colon,} 共43个,其中补充保留字为:else, for, repeat, until, plusbk, minusbk,

相关文档
最新文档