当前位置:文档之家› 计算机编译原理实验报告

计算机编译原理实验报告

编译原理实验报告

实验一词法分析设计

一、实验功能:

1、对输入的IXt文件内的内容进行词法分析:

2、由文件流输入IesiJxi中的内容,对文件中的各类字符进行词法分析

3、打印出分析后的结果;

二、程序结构描述:(源代码见附录)

1、分别利用k[],siu,s2[],s3[]构造关键字表,分界符表,算术运算符表和关系运算符表。

2、bool isletter(){}用来判断其是否为字母,是则返回IrUe,否则返回false;

bool isdigit(){)用来判断其是否为数字,是则返回IrUe,否则返回false;

bool iscalcu(){)用来判断是否为算术运算符,是则返回IrUe,否则返回false;

bool reserve(string a∣∣){)用来判断某字符是否在上述四个表中,是则返向InIe,否则返回false;

void concat(){)用来连接字符串;

void getn(){)用来读取字符;

void getb(){)用来对空格进行处理;

void retract(){}某些必要的退格处理;

int analysis(){}对一个单词的单词种别进行具体判断;

在主函数中用switch决定输出。

3| file.txt -记事本

文件(F)编辑⑹格式(O)查看(V) W(H)

if i = O then i ++; a <= 3b%); 富F:\cpp\词法分析器.exe

Process exited after 2.503 seconds with return

信按任意键继续∙.∙

四、实验总结

词法分析器一眼看上去很复杂,但深入的去做就会发现并没有一开始想象的那么困难。 对于一个字符的种别和类型可以用b∞l 函数来判断,对于关键字和标示符的识别(尤其是 3b)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好 时候退格,否则将会导致字符漏读甚至造成字符重复读取。

我认为,这个实验在程序实现上大体不算困难,但在细节的处理上则需要好好地下功夫 去想,否则最后的程序很可能会出现看上去没有问题,但实际上漏洞百出的状况。

将学过的知识应用到实际中并不简单,只有自己不断尝试将知识转化成程序才能避免眼 高手低,对于知识的理解也必将更加深刻。

单词

*******分析结果如下美 二元序列 类型

then

+ +

3b

<6,i> <4,=> 〈5.0) <6,i> <3,++> <6,a> <4,<=> Error Error <2,>> <2,;>

关标天常关OW ⅛:

天ErEr 八芬

键识系匿识术识系rorr 字

符运字符运符

运r O B-Tnvp

1%E,E--? 符符

算算

位置

<1,1> <1,2> <1,3〉 <1,4〉 <1,5> <1,6〉 <1,7〉 <2,1> <2,2〉

《2,3》

<2,4) <2,5〉 value 0

实验二LL(I)分析法

一、实验原理:

1、写出LL(I)分析法的思想:当一个文法满足LL(I)条件时,我们就可以为它构造一个不带回溯的自上而下的分析程序,这个分析程序是有一组递归过程组成的,每个过程对应文法的一个非终结符。实现LL(I)分析的一种有效的方法是使用一张分析表和一个站进行联合控制。预测分析表是一个M[A,a]形式的矩阵,存储着分析规则;栈STACK用于存放文法符号。从栈顶取符号,按照分析表给出的规则进行有步骤的分析。

2.实验要求实现的文法:

(1)E->TG

(2)G->+TG∣-TG

(3)G->ε

(4)T->FS

(5)S->*FS∣∕FS

(6)S->ε

(7)F->(E)

(8)F->i

二、程序结构:

SlringM⑸⑻用来定义分析表:

CharinPUl[50]用来存放输入的句子;

vector analysis用来存放分析栈;

bool flag = true用来判断是否成功的标志;

reference(char a,char i){)查询分析表,其中a为分析栈顶符号,i为输入串符号;pro(char a,char in){)用以做出具体的分析;

LL(I)依测分析程序流程

三、实验结果:

运行程序,输入需要分析的语句,结果如下:

四、实验总结:

本次试验用代码实现了LL(I)文法,在过程中对于非终结符向终结符转换的过程中出现了一些问题,之后通过向同学请教得已解决。

本代码中的分析表写在了主函数中,可以说本程序只对这一个文法有效,这也是这个程序的局限性。

实验三LR(I)分析法

一、实验原理

LR (1)分析法实验设计思想及算法

(1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。

(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTlON)和状态转换(GoTo) 表两个部分,它们都可用二维数组表示。

(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。

分析器的动作就是由栈顶状态和当前输入符号所决定。

二、程序结构

action[12][6]定义动作表;

go[12][3]定义转换表:

input[50]存放输入串;

referaction(int s,char i){)查询action表,a为分析栈顶的状态,i为输入串的符号;

refergo(int s,char i){}查询go 表;

reduce(int n){ J 就近规约:

analysis(int st,char in)( J 具体分析:

LR分析器结构:

♦其中:SP为栈指针,S[i]为状态栈,X[i]为文法符号栈。状态转换表用GOTO[i, X]=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应转向状态j, X为终结符或非终结符。

♦ ACTION[i, a]规定了栈顶状态为i时遇到输入符号a应执行。动作有四种可能:(1)移进:

action[i, a]= Sj:状态j移入到状态栈,把a移入到文法符号栈,其中i,j表示状态号。(2)归约:

action[i, a]=rk:当在栈顶形成句柄时,则归约为相应的非终结符A,即文

法中有A- B 的产生式,若B 的长度为R(即IBI=R),则从状态栈和文法符号栈中

自顶向下去掉R 个符号,即栈指针SP 减去R,并把A 移入文法符号栈内, j=GOTO[i,A]移进状态栈,其中i 为修改指针后的栈顶状态。

(3)接受 acc:

当归约到文法符号栈中只剩文法的开始符号S 时,并且输入符号串已结束即 当前输入符是'#',则为分析成功。

(4)报错:

当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输 入端不是该文法能接受的符号串。

用IP 指向W#的第一个得号

a 是ip 所搐向的桁号

分别从桂BW 出W 个 符号,令s'是当前桂Bi 状轰 JRa 和

先讯T 入桂中.S 出产 生或A>0.

出幡处”

三、实验结果:

输入需要规约的字符串,结果如下:

“的心止Ss'

圮Nfs'分别■人 箝号枝和状态枝: 使桢蔺济TrF 一个

Process exited after 8.325 seconds with return ualue 0 请按任意键继续...

四、实验总结

1、与算符优先分析方法比较,用LR 分析时,设计特定出错处理子程序比较容易,因为不 会发生不正确的归约。在分析表的每一个空项内,可以填入一个指示器,指向特定的出错处 理子程序,第一类错误的处理一般采用插入、删除或修改的办法,但要注意,不能从栈内移 去任何那种状态,它代表已成功地分析了程序中的某一部分。

2、LR 分析法的归约过程是规范推导的逆过程,所以LR 分析过程是一种规范归约过程。LR 分析法正是给出一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入 串的K 个(KeO)符号就可唯一地确定分析器的动作是移进还是归约和用哪个产生式归约, 因而也就能唯一地确定句柄。其中LR(O)分析器是在分析过程中不需向右查看输入符号,因 而它对文法的限制较大,然而,它是构造其它LR 类分析器的基础。因此,首先应学好LR(O) 项目集规范族构造的基本原理和方法。当K=I 时,已能满足当前绝大多数高级语言编译程 序实现的需要。SLR(I)分析是为学习LR(I)分析做准备,LR(I)项目集族的构造是LALR(I) 分析器的构造原理和基础。LALR(I)分析器是当前大多数高级程序设计语言编译程序所采 用的语法分析技术,也是编译程序语法分析器自动构造工具YACC 的实现基本原理。由此, LR(0)、SLR(1 )> LALR(I). LR(I)四种分析器的构造方法都必须深入理解和掌握。

3、经过以上三个实验的锤炼,不得不说自己编译原理这门课的认识又提高了一个阶层,对 编译原理的知识运用更加深入,编写过程中遇到不少的问题,结合课本及强大的网络资源, 在完成的过程中得到很多收获,不仅来自于对知识点的了解更加深入,更是对自己编程能力 的一次很好的锻炼,希望有更多这样实验的机会。

4、本人很希望在完成实验后,老师可以根据自己讲的课本,将自己所写的程序花一段时间 来讲解,我想这样会对不会编写的是一种教学,对会了的同学是一种榜样效应,可以让我们 有个目标追求,这样我们收获了的也会更加准确与丰富。

辄i 入哈句,

L)

述箔束:i+i*it ∣ 符

号栈

0 05 n Hi 03 #F 02 #T 01 ItE 016 #E+ 0165 ttE*i 0163 «E*F 0169 #E+T 01697 ttE*T* 016975 ttE*T*i 0169710 ttE+T*F 0169 #E*T 01 ttE

剩余输入串

i÷i*itt +i∙∙itt +i*i# +i*i» ÷i*itt i*i# *itt *itt

*itt itt tt tt It tt

5 642656475 ⅛s PrrSSrrSS

r6r3rlAC

M 约约

约归卷 5Λ归归

归6Λ5Λ归归7Λ5Λ归

*F 蒜

>i>F>τ态态

X>F

态态>ix>E 丽 P-T-

』奈F-T-菜F-T-E-汤

¾ F:\cpp\LR(l).exe

G0T0<6,F>=3 GOTO<6,T>=9

GOTO<7,F>=10 ,

GOTO<6,T>=9 ,G OTO<0,E>-1

GOTO<0,F>-3 GOTO<0,T>=2 GOTO<0,E>=1

附录:

实验一源代码:

#include

#include

#include

using namespace std;

string k∣] = {“do",“end","for","if n,"fTscanfTthen∖”While”};//关键字

string sl[]= ")",T,T};〃分界符

string s2∣]= “*”「7",”++”,”」};〃算术运算符

string s3[]= {y丁J!=");〃关系运算符

string id[IOO];

string ci[100];

ifstream in;

char ch;

int row =l,col = 0;〃行数与列数

int idcount = 0,cicount = 0;

string strtoken;

bool isletter(){∕/用来判断其是否为字母

if(ch >= 'A, && ch <= 'z,)

return true;

else

return false;

)

bool isdigil(){∕/用来判断其是否为数字

if(ch >= '0' && ch <= '9')

return true;

else

return false;

)

bo。IiSCalCUo{〃用来判断是否为算术运算符if(ch=='+'∣∣ch=='-'IlCh=='*'∣∣ch==7t) return true;

else

return false;

void insertid(){

id[idcount] = strtoken;

idcount++;

)

void insertci(){

ci [cicount] = strtoken;

cicount++;

)

bool reserve(string a[]){〃用来判断某字符是否在表中int count;

if(a[0] == "do") count = 8;

else if(a[0] == ',,")count = 6;

else if(a[0] == "+")count = 6;

else if(a[0] == "<")count = 6;

fυr(int i = 0; i < count; i++){

if(a[i] == strtoken)

return true;

)

return false;

)

void ConCato (〃用来连接字符串strtoken += ch;

)

void gein(){ 〃读取字符

in.read(&ch, 1);

if(ch == '∖n,){

in.read(&ch,l);

row++;

col = 1;

void getb(){ 〃空格处理

while(ch ==,,) in.read(&ch,l);

)

void relracl(){〃某些必要的退格处理int size=sizeof(ch);

in.seekg(-size*2,ios::cur);

)

int analysis(){ 〃对一个单词的单词种别进行具体判断col++;

getn();getb();

if(in.eof())

return 7;

if(isletter()){

while(isletter()∣∣isdigit()){ concat();getn();

)

retract();

if(reserve(k)){

return 1;

)

else{

insertid();

return 6;

)

)

else if(isdigit()){

bool multipoint = false;

bool insertpoint = false;

while(isdigit()∣∣ch == '.,){

if(ch =='.,){

if(insertpoint == false) { concat();getn(); insertpoint = true;

)

else{

concat();getn(); multipoint = true;

)

)

if(isdigit()){ concat();getn();

)

)

bool haveletter = false;

while(isletter()){

haveletter = true;

concat();getn();

retract();

if(haveletter) return O;

if(multipoint)

return 0;

insertci(); return 5;

)

else if(iscalcu())(

while(iscalcu()){ concat();getn();

)

if(reserve(s2))

return 3;

else

return 0;

)

concat();

if(reserve(sl)) return 2;

else if(reserve(s3)){

getn();

if(ch == -,){ concat(); if(reserve(s3))

return 4;

)

else{

retract();

return 4;

)

)

return 0;

)

int main(){

in.open("file.txt");

if(!i∏)l

cerr<<"文件不存在"<

return 1;

CoUt<<"文件成功读取"<

int code;

COUtVV"*********************** 分析结果如下***********************"<

while(!in.eof()){

strtoken = "\0";

code = analysis();

switch(code) {

case

Oxout<

case kif(strtoken.size() < 4)

COUl<

else

cout<

break;

case 2:cout«strtoken«,,\t\t',«,('«code«\'«strtoken«,),«M\t\t,,«M分界符,'<<<,∖t∖t"<<,(,<

break;

case 3xout<

break;

case 4xout<

break;

case 5:COUt<

break;

case 6xout<

break;

)

)

return O;

实验二源代码:

#include

#include

#include

#include

#include using namespace std;

string M[5]⑻,定义分析表

char inpul[50];//用来存放输入的句子

vector analysis;〃用来存放分析栈

bool flag = InIe;〃用来判断是否成功的标志,false为成功

inti = O;〃输入串的指针

string reference(char a,char i){〃查询分析表,其中a为分析栈顶符号,i为输入串符号int x,y;

switch(a){

case 'E':x = 0;

break;

case T:x = 1;

break;

case 'F':x = 2;

break;

case 'G':X = 3;

break;

case 'S':x = 4;

break;

)

switch(i){

case Cy = 0;

break;

case ')':y = 1;

break;

case '+':y = 2;

break;

case '-':y = 3;

break;

case '*':y = 4;

break;

case V':y = 5;

break;

case T:y = 6;

break;

case '#':y = 7;

break;

return M[x][y];

void (char i){ cout<

1

void Prin(){〃用来打印输入串

int j = i;

for(;input(j] != λθ,y++) cout<

)

void pro(char a,char in){ 〃分析程序

if(a == in)

if(a == ,#,){ flag = false; COUtVV"分析已全部完成"v

return;

)

else{

i++;

analysis.pop-back();

fbr_each( analysis.begin(), analysis.end(),);

cout<<"∖t∖t";

P∏n();

cout<<"∖t∖t',<<"∖t∖t',<<,,GETNEXT(I)"<

)

else(

string expre = reference(a,in);

analysis.pop_back();// 出栈

int j = expre.size() - 1;

while(expre[j] != ,>'){

analysis.push-back(expre[j]);

j-;

)

fbr_each( analysis.begin(), analysis.end(),);

cout<<"∖t∖t";

prin():

if(expre.length()>3)

cout<<"∖t∖t,,<

)

int main(){

M[0][0] = "E->TG'∖M[0][6] = ,,E->TG";

M[I][O] = "T->FS";M[I][6] = ,,T->FS,r;

M ⑵[0] = "F->(E)”;M ⑵⑹=,,F->iπ;

M[3][l] = M G->";M[3][2] = "G->+TG";M[3][3] = "G->-TG"jM[3][7] = ',G->,∙;

M[4][l] = ,,S->'∖M[4][2] = "S->,,iM[4][3] = "S->"jM[4][4] = "S->*FS,∖M[4][5]=

"S->∕FS,,iM[4][7] = "S->π;

analysis.push_back('#');

analysis.push-back('E');

CoUt<<”输入语句,以#结束:";

cin>>input;

CoUt分析栈”《"\1\1”<<"剩余输入串”《"\1"<<"所用产生式“〈<“\1"<<“动作”<《前1;

fbr_each( analysis.begin(), analysis.end(),);

cout<<,'∖t∖t,∙;

prin();

cout<<,'∖t∖t,,<<,'∖t∖t,'<<"¾J½jt"<

while(flag){

pro(analysis.back(),input[i]);

)

return O;

)

实验三源代码:

#include

#include

#include

#include using namespace std;

j","S4","' Hll

∣∙ ,,t,,√"7,acc

",,,r2'V,S7 ,,"'7'r2,∖

",,,r4",1,r4 ,",,,,,r4'V

S5'' ,,h””S4",'M∖"'

",,,r6",,,r6 UH

∣∣√<

S5'' ,ih 9tvr S4",HH,"∙

S4",H'7"

S5” tin RM

∣∙ "''VS11'7

",,'rΓ,,,(S7 7"V'rΓ∖

string action[12][6] = {,,S5,7, '",,,,Γ5,∖"S5,√"V ,Γ5,∖,,Γ5H ,

};//定义动作表

string grammer[6] = {"E->E+T","E->T",T>T*F',T>F ∖"F->(E)”JF ->i”); 〃文法 int go[12][3];//定义转换表

char input[50];//存放输入串

int i = 0;

bool flag = true;〃判断是否成功

vector SymbO1;//定义分析表

vector StatUs;〃定义符号栈 string referaction(int s,char i){〃查询action 表,a 为分析栈顶的状态,i 为输入串的符号 int y;

switch(i){

case T:y = 0;

break;

case '+':y = 1;

break;

case '*':y = 2;

break;

case '(':y = 3;

break;

case '),ry = 4;

break;

case '#':y = 5;

break;

)

return action[s][y];

)

int refergo(int s,char i){ 〃查询 go 表

int y;

switch(i)(

case 'E':y = 0;

break;

case T:y = 1;

break;

case 'F':y = 2;

break;

)

return go[s][y];

)

void int(int n)(

cout<

,,,,,r3,,,,,r3 ,""7,r3,7

优 Tl ”, r3,∖

,r2π, r4",

)

void char(char

c){ cout<

)

void Prino{〃用来打印输入串

int j = i;

for(;input[j] != λθ,y÷+) cout<

)

void reduce(int n){〃就近规约

int j = grammer[n].size() - 3;

while(j-){

status.pop_back();

symbol.pop_back();

)

symbol.push-back(grammer[n][O]);

int stu = refergo(status.back(),symbol.back());

cout<

status.push_back(stu);

)

void analysis(int st,char in){

string ac = referaction(st,in);

if(ac[0] == ,S,){

for_each(status.begin(),status.end(),int); cout<<"∖t∖tπ;

for_each(symbol.begin(),symbol.end(),char); cout«"\t\t M;

prin()ζcout<<',∖t∖tπ;

symbol.push-back(input[i]);

int stat = ac[l] - 48;

status.push_back(stat);

i++;

CoUl<

return;

)

if(ac[O] == 'r,){

for_each(status.begin(),status.end(),int); cout<<,'∖t∖t";

for_each(symbol.begin(),symbol.end(),char); cout<<,'∖t∖tπ;

prin();cout«"\t\t";

cout<

int g = ac[l] - 48 -1;

reduce(g);

return;

)

if(ac == ,'acc")(

fbr_each(status.begin(),status.end(),int); cout<<"∖t∖tπ;

for_each(symbol.begin(),symbol.end(),char); cout«"\t\t M;

prin()ζcout<<',∖t∖t,';

CoUl<<"Acc:分析成功”;

flag = false;

int main(){

go[0][0] = l;go[0][l] = 2;go[0][2] = 3;

go[4][0] = 8;go[4][l] = 2;go[4][2] = 3;

go[6][l] = 9;go[6][2] = 3;

go⑺⑵=10;

symbol .push_back('#');

status.push_back(O);

COUt<< ”输入语句,以#结束七cin>>input;

COUt

return 0;

编译原理实验报告2

电子科技大学 实验报告 学生姓名:学号:指导教师: 实验地点:计算机软件实验室实验时间: 一、实验室名称:计算机实验室 二、实验项目名称:词法分析器的设计与实现 三、实验学时:4 四、实验原理: 1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。 2.词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。 3. 状态转换图是有限有向图,是设计词法分析器的有效工具。 五、实验目的: 通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。

六、实验内容: 实现求n!的极小语言的词法分析程序,返回二元式作为输出。 七、实验器材(设备、元器件). 1. 操作系统:Windows 7 2.开发工具:visual studio 2008 八、实验步骤 (1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”->“新建”->“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C++ 项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。 (2)建立相应的单词符号与种别对照表; (3)根据状态转换图编写相应的处理函数; (4)完成词法分析器; (5)编译与调试以上程序; (6)生成相应的*.dyd文件,作为后面语法分析的输入文件。 九、实验数据及结果分析 1.结构与分析

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:11303070*** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

编译原理实验报告1

编译原理实验报告 某某: 班级: 学号: 自评:中

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,V ALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;V ALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,V ALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,本次试验用手工的方式(C语言)构造词法分析程序。根据文法和状态转换图直接编写词法分析程序。 四、基本实验题目 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表

编译原理实验报告1

03091337 李璐 03091339 宗婷婷 一、上机题目:实现一个简单语言(CPL)的编译器(解释器) 二、功能要求:接收以CPL编写的程序,对其进行词法分析、语法分 析、语法制导翻译等,然后能够正确的执行程序。 三、试验目的 1.加深编译原理基础知识的理解:词法分析、语法分析、语法制导 翻译等 2.加深相关基础知识的理解:数据结构、操作系统等 3.提高编程能力 4.锻炼独立思考和解决问题的能力 四、题目说明 1.数据类型:整型变量(常量),布尔变量(常量) 取值范围{…, -2, -1, 0, 1, 2, …}, {true, false} 2、运算表达式:简单的代数运算,布尔运算 3、程序语句:赋值表达式,顺序语句,if-else语句,while语句 五、环境配置 1.安装Parser Generator、Visual C++; 2.分别配置Parser Generator、Visual C++; 3.使用Parser Generator创建一个工程 编写l文件mylexer.l; 编译mylexer.l,生成mylexer.h与mylexer.c; 4.使用VC++创建Win32 Console Application工程并 配置该项目; 加入mylexer.h与mylexer.c,编译工程; 执行标识符数字识别器; 注意:每次修改l文件后,需要重新编译l文件,再重新编译VC工程 六、设计思路及过程 设计流程:

YACC预定义文法 BNF递归文法 扩展实现函数 词法分析 LEX的此法分析部分主要利用有限状态机进行单词的识别,在分析该部分之前,首先应该对YACC的预定义文法进行解释。在YACC中用%union扩充了yystype的内容,使其可以处理char型,int型,node型,其中Node即为定义的树形结点,其定义如下:typedef enum { TYPE_CONTENT, TYPE_INDEX, TYPE_OP } NodeEnum; /* 操作符 */ typedef struct { int name; /* 操作符名称 */ int num; /* 操作元个数 */ struct NodeTag * node[1]; /* 操作元地址可扩展 */ } OpNode; typedef struct NodeTag { NodeEnum type; /* 树结点类型 */ /* Union 必须是最后一个成员 */ union { int content; /* 内容 */ int index; /* 索引 */

编译原理实验报告

编译原理实验报告 一、实验目的 编译原理是计算机科学中的重要课程,旨在让学生了解编译器 的基本工作原理以及相关技术。本次实验旨在通过设计和实现一 个简单的编译器,来进一步加深对编译原理的理解,并掌握实际 应用的能力。 二、实验环境 本次实验使用了Java编程语言及相关工具。在开始实验前,我 们需要安装Java JDK并配置好运行环境。 三、实验内容及步骤 1. 词法分析 词法分析是编译器的第一步,它将源代码分割成一系列词法单元。我们首先实现一个词法分析器,它能够将输入的源代码按照 语法规则进行切割,并识别出关键字、标识符、数字、运算符等。

2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。 3. 语义分析 语义分析是编译器的第三步,它对语法树进行检查和转换。我们主要进行类型检查、语法错误检查等。如果源代码存在语义错误,编译器应该能够提供相应的错误提示。 4. 代码生成 代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。在本次实验中,我们将目标代码生成为Java字节码。 5. 测试与优化

完成以上步骤后,我们需要对编译器进行测试,并进行优化。 通过多个测试用例的执行,我们可以验证编译器的正确性和性能。 四、实验心得 通过完成这个编译器的实验,我收获了很多。首先,我对编译 原理的知识有了更深入的理解。在实验过程中,我深入学习了词 法分析、语法分析、语义分析和代码生成等关键技术,对编译器 的工作原理有了更系统的了解。 其次,我提高了编程能力。实现一个完整的编译器需要处理复 杂的数据结构和算法,这对我的编程能力是一个很好的挑战。通 过实验,我学会了合理地组织代码,优化算法,并注意到细节对 程序性能的影响。 最后,我锻炼了解决问题的能力。在实验过程中,我遇到了很 多困难和挑战,但我不断地调试和改进代码,最终成功地实现了 编译器。这次实验使我明白了解决问题的关键在于坚持和勇于尝试。

编译原理语义分析与中间代码生成实验报告

编译原理语义分析与中间代码生成实验报告 专题6_语法制导翻译程序设计原理与实现技术 ***-***** 李若森计科1301 一、实验目的 语法制导的基本概念;目标代码结构分析的基本方法;赋值语句语法制导生成四元式的基本原理和方法;该过程包括语法分析和语义分析过程。 二、实验内容 2.1 实验项目 完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过程。 G[A]: A→V=E E→E+T|E-T|T T→T*F|T/F|F F→(E)|i V→i 2.2 设计说明 终结符号i为用户定义的简单变量,即标识符的定义。 2.3 设计要求 (1) 设计语法制导翻译过程,给出每一产生式对应的语义动作; (2) 设计中间代码四元式的结构(暂不与符号表有关); (3) 输入串应是词法分析的输出二元式序列,即某算术表达式“专题1”的输出结果。 输出为输入串的四元式序列中间文件;(4) 设计两个测试用例(尽可能完备),并给出程序执行结果。 2.4 任务分析 重点解决赋值语句文法的改写和语义动作的添加。 三、实现过程 3.1 扩展文法

G[s]: S→A A→V=E E→E+T|E-T|T T→T*F|T/F|F F→(E)|i V→i 3.2 非终结符FOLLOW集 FOLLOW(S) = { # } FOLLOW(A) = { # } FOLLOW(V) = { = } FOLLOW(E) = { +, -, ), # } FOLLOW(T) = { +, -, *, /, ), # } FOLLOW(F) = { +, -, *, /, ), # } 3.3 LR(0)分析器的构造 设DFA M的一个状态为i,该状态识别出的所有活前缀的有效项目集为Ci。则DFA M的状态集Q={C0, C1, C2, … , Cn}=C。C称为文法的LR(0)有效项目集规范族。 对Ci有三种操作: 求文法的LR(0)有效项目集规范族C的算法: 由上述算法可求得有效项目集规范族C={C0, C1, C2, … , C19}。 3.3.1 有效项目规范簇: C0 = { S→・A, A→・V=E, V→・i } C1 = { S→A・} C2 = { S→V ・=E } C3 = { V→i・} C4 = { S→V=・E, E→・E+T, E→・E-T, E→・T, T→・T*F, T→・T/F, T→・F, F→・(E), F→・i } C5 = { S→V=E・, E→E・+T, E→E・-T } C6 = { E→T・, T→T・*F, T→T・/F } C7 = { T→F・} C8 = { F→(・E), E→・E+T, E→・E-T, E→・T, T→・T*F, T→・T/F, T→・F,F→・(E), F→・i } C9 = { F→i・} C10 = { E→E+・T, T→・T*F, T→・T/F, T→・F, F→・(E), F→・i } C11 = { E→E-・T, T→・T*F, T→・T/F, T→・F, F→・(E), F→・i } C12 = { T→T*・F, F→・(E), F→・i } C13 = { T→T/・F, F→・(E), F→・i } C14 = { F→(E・), E→E・+T, E→E・-T } C15 = { E→E+T・, T→T・*F,

编译原理实验二LL(1)语法分析实验报告

专题3_LL(1)语法分析设计原理与实现 李若森 13281132 计科1301 一、理论传授 语法分析的设计方法和实现原理;LL(1) 分析表的构造;LL(1)分析过程;LL(1)分析器的构造。 二、目标任务 实验项目 实现LL(1)分析中控制程序(表驱动程序);完成以下描述算术表达式的 LL(1)文法的LL(1)分析程序。 G[E]: E→TE’ E’→ATE’|ε T→FT’ T’→MFT’|ε F→(E)|i A→+|- M→*|/ 设计说明 终结符号i为用户定义的简单变量,即标识符的定义。加减乘除即运算符。 设计要求 (1)输入串应是词法分析的输出二元式序列,即某算术表达式“专题 1”的输出结果, 输出为输入串是否为该文法定义的算术表达式的判断结果; (2)LL(1)分析程序应能发现输入串出错; (3)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。 任务分析 重点解决LL(1)表的构造和LL(1)分析器的实现。

三、实现过程 实现LL(1)分析器 a)将#号放在输入串S的尾部 b)S中字符顺序入栈 c)反复执行c),任何时候按栈顶Xm和输入ai依据分析表,执行下述三个动作之一。 构造LL(1)分析表 构造LL(1)分析表需要得到文法G[E]的FIRST集和FOLLOW集。 构造FIRST(α) 构造FOLLOW(A)

构造LL(1)分析表算法 根据上述算法可得G[E]的LL(1)分析表,如表3-1所示: 表3-1 LL(1)分析表 主要数据结构 pair: 用pair来存储单个二元组。该对照表由专题1定义。 map: 存储离散化后的终结符和非终结符。 vector[][]: 存储LL(1)分析表 函数定义 init: void init(); 功能: 初始化LL(1)分析表,关键字及识别码对照表,离散化(非)终结符 传入参数: (无) 传出参数: (无) 返回值: (无)

广工编译原理实验报告

广工编译原理实验报告 广工编译原理实验报告 一、实验目的 编译原理是计算机科学与技术专业中非常重要的一门课程,通过该课程的学习,我们可以了解到编译器的基本原理和实现方法。本实验的目的是通过实践,加 深对编译原理的理解,掌握编译器的设计和实现过程。 二、实验环境 本次实验使用的是C语言作为编程语言,使用的编译器是GCC。实验使用的操 作系统是Linux。 三、实验内容 本次实验的主要内容是设计一个简单的编译器,实现对一个简单的语言的词法 分析和语法分析。该语言是一种类似于C语言的语言,具有变量声明、赋值语句、条件语句和循环语句等基本功能。 四、实验步骤 1. 词法分析 词法分析是编译器的第一步,它将输入的源代码分解成一个个的单词或符号。 在本次实验中,我们需要设计一些正则表达式来描述各种单词的模式,并使用 有限自动机来实现词法分析器。 2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的单词序列转化为一个语法树。在本次实验中,我们需要设计一些文法规则来描述语言的语法结构,并使用自 顶向下的递归下降分析法来实现语法分析器。

3. 语义分析 语义分析是编译器的第三步,它对语法树进行分析,检查语法的正确性,并生 成中间代码。在本次实验中,我们需要设计一些语义规则来检查语法的正确性,并使用符号表来存储变量和函数的信息。 4. 代码生成 代码生成是编译器的最后一步,它将中间代码转化为目标代码。在本次实验中,我们需要设计一些规则来将中间代码转化为汇编语言,并使用汇编器将汇编代 码转化为机器码。 五、实验结果 经过实验,我们成功地设计并实现了一个简单的编译器。该编译器可以正确地 将输入的源代码转化为目标代码,并且可以正确地执行目标代码。通过本次实验,我们加深了对编译原理的理解,掌握了编译器的设计和实现过程。 六、实验总结 编译原理是一门非常重要的课程,通过学习和实践,我们可以了解到编译器的 基本原理和实现方法。本次实验通过设计和实现一个简单的编译器,加深了对 编译原理的理解,提高了我们的实践能力。希望通过今后的学习和实践,能够 进一步提高自己的编译器设计和实现的能力。

编译原理实验报告 词法分析

编译原理实验一·词法分析

一、实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。 二、实验内容及要求 对某特定语言A ,构造其词法规则。 该语言的单词符号包括: 保留字(见左下表)、标识符(字母大小写不敏感)、整型常数、界符及运算符(见右下表) 。 功能要求如下所示: ·按单词符号出现的顺序,返回二元组序列,并输出。 ·出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。 ·如果出现词法错误,报出:错误类型,位置(行,列)。 ·处理段注释(/* */),行注释(//)。 ·有段注释时仍可以正确指出词法错误位置(行,列)。 三、实验过程 1、词法形式化描述 使用正则文法进行描述,则可以得到如下的正规式: 其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。 A→(ID | NUM | RES | DEL | OPR) * ID→letter(letter | didit)* NUM→digit digit* letter→a | …| z | A | …| Z digit→0 | …| 9 RES→program | begin | end | var | int | and | or | not | if | then | else | while | do DEL→( | ) | . | ; | , OPR→+ | * | := | > | < | = | >= | <= | <>

计算机编译原理---词法分析器实验报告

编译原理 实验报告书

词法分析器 目录 1、摘要: (2) 2、实验目的: (2) 3、任务概述 (3) 4、实验依据的原理 (3) 5、程序设计思想 (5) 6、实验结果分析 (7) 7、总结 (9)

1、摘要: 本实验用C/C++高级语言编写词法分析程序,通过课堂上对词法分析器相关的背景知识的足够了解,清晰词法分析的过程,在脑海中形成词法分析的一般方案,根据方案一步步所要实现的目的,形成对词法分析器程序的模块划分和整体规划,最终实现一个词法分析器。具体要求能够通过扫描源程序分析出单词符号,将相应字符流转换成内码。 2、实验目的: 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的时间能力。通过本实验,掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法以及掌握词法分析的实现方法,并可以成功的上机调试编出词法分析程序。 3、任务概述 用C/C++实现对Pascal的子集程序设计语言的词法识别程序。 词法分析程序的主要工作为: (1)从源程序文件中读入字符。 (2)统计行数和列数用于错误单词的定位。 (3)删除空格类字符,包括回车、制表符空格。 (4)按拼写单词,并用(内码,属性)二元式表示。 (5)根据需要是否填写标识符表供以后各阶段使用。 4、实验依据的原理 (1)词法分析器工作流程图

图1 词法分析器工作流程图 实现流程:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。词法分析的功能是输入源程序,输出单词符号。所依据的理论基础有有限自动机、正规式、正规文法。

编译原理——语法分析程序设计实验报告

实验二语法分析程序设计 [实验目的]: 1.了解语法分析的主要任务。 2.熟悉编译程序的编制。 [实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。 [实验要求]: 1.选择一个文法,进行实验,可选的文法包括以下三个: P190 4.8 P190 4.9 P190 4.10 2.设计语法分析程序的输出形式(输出应为语法树或推导),一个可以参考的 例子,可见图1。 3.编写递归下降语法分析程序(参考P148-149 Topdown parsing by recursive-descent),实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法句子。实验报告中要说明分析使用的方法。 4.根据所作业题选项e所给出的input,生成并输出分析过程中所用的产生式 序列(show the actions of parser): 1 产生式1 2 产生式2 …… 5.自已设计一个不合法的句子,作为输出进行分析,给出结果。 [实验过程] 本次实验选择的文法为P190 4.8 lexp->atom|list atom->number|identifier list->(lexp-seq) lexp-seq->lexp lexp-seq 1.写出实现的算法,并画流程图。 本次实验采用递归下降算法,算法流程图如下图1-1:

图1-1 算法流程图 2.根据你选择的文法,分析左递归或左因子是否会影响本算法的结果。 会影响本算法的结果。递归下降分析法要求的文法是LL(1)文法,需要消除左递归和左因子的影响。如果存在左因子,对相同的字符跳转到不同的函数,无法实现递归。 3.列举实验设计过程中出现的问题及解决的方法(至少3条,选择实验中最困 扰的问题)。 1).会多次输出accept/error结果 解决方案:所有的递归函数返回类型为int,若accept返回1,error返回0,在main主函数中统一判断输出语句。 2).生成推导式错误 解决方案:先定义两个字符串string d(保存整个推导式过程),e(保存单次的推导式)每次进行递归函数调用,进行e的更新和替换,再将执行 d+=”=>”+e语句,更新d字符串。 3).递归调用出错 解决方案:设置条件,再调用递归函数。 4.比较作业题和本次实验结果,分析递归下降和LL(1)算法的异同点。 相同点:都是针对LL(1)文法,都是从上而下分析进行语法分析。

编译原理—pl0实验报告

PL/0实验报告 课程名称编译原理 题目名称PL/0编译程序 学生学院计算机科学与技术学院专业班级 学号 学生姓名 班内序号

山东理工大学实验报告纸第 1 页 姓名:蔡鹏飞计算机院_11_级02班同组者成绩_________室温:气压:课程名称:编译原理教师签字 实验项目 编号(1) PL/0编译程序的分析指导教师鞠传香 实验目的1.熟悉pl/0语言并能编写小程序 2.掌握pl/0编译程序的编译过程(词法分析、语法分析、语义分析等) 实验仪器(编号) 材料、工具 PC机、VC++6.0 (原理概述) pl/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。词法分析和代码生成作为独立的子程序供语法分析程序调用。语法分析的同时,提供了出错报告和出错恢复的功能。在源程序没有错误编译通过的情况下,调用类pcode解释程序解释执行生成的类pcode代码。

PL/0语言文法的EBNF表示 EBNF表示的符号说明。 〈〉:用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。 ∷= :该符号的左部由右部定义,可读作'定义为'。 | :表示'或',为左部可由多个右部定义。 { } :花括号表示其内的语法成分可以重复。在不加上下界时可重复0到任意次数,

有上下界时为可重复次数的限制。 如:{*}表示*重复任意次,{*}38表示*重复3-8次。 [ ] :方括号表示其内的成分为任选项。 ( ) :表示圆括号内的成分优先。 例:用EBNF描述<整数>文法的定义: <整数>∷=[+|-]<数字>{<数字>} <数字>∷=0|1|2|3|4|5|6|7|8|9 或更好的写法 <整数>∷=[+|-]<非零数字>{<数字>}|0 <非零数字>∷=1|2|3|4|5|6|7|8|9 <数字>∷=0|<非零数字> PL/0语言文法的EBNF表示

编译原理实验报告FIRST集与FOLLOW集

编译原理实验报告 实验名称计算first集合和follow集合 实验时间 院系计算机科学与技术 班级软件工程1班 学号 姓名 1.实验目的 输入:任意的上下文无关文法。 输出:所输入的上下文无关文法一切非终结符的first集合和follow集合。 2.实验原理 设文法G[S] =(V N , V T, P, S),则首字符集为: * FIRST (a)= {a | a= a B, a € V T , a , p € V }。 *

若 a = £,氏 FIRST ( a )o 由定义可以看出,FIRST (a)是指符号串a能够推导出的所有符号串中 设a = X1X2…X n, FIRST ( a)可按下列方法求得: 令 FIRST (a)=①,i = 1; (1)若 X i€ V T,贝U X i€ FIRST (a); (2)若 X i€ V N; ①若“ FIRST (X i),贝U FIRST (FIRST (a); ②若疋 FIRST (X i),贝U FIRST (X i)- { } € FIRST (a); (3)i = i+1,重复(1)、( 2),直到 X i € V T,( i= 2, 3,…,n) 或X i€ V N 且若“ FIRST (xj或i>n为止。 当一个文法中存在&产生式时,例如,存在 A - E,只有知道哪些符号可以合法地出现在非终结符 A之后,才能知道是否选择 A- E产生式。这些合法地出现在非终结符A之后的符号组成的集合被称为 FOLLOW集合。下面我们给出文法的FOLLOW集的定义。 设文法 G[S] =(V N,V T,P,S),贝U FOLLOW (A)= {a | S => -Aa …,a € V T}。 若 S=…A,#€ FOLLOW (A)。 由定义可以看出,FOLLOW (A)是指在文法 G[S]的所有句型中,紧跟在非终结符A后的终结符号的集合。 FOLLOW集可按下列方法求得: (1)对于文法G[S]的开始符号S,有#€ FOLLOW (S); * (2)若文法 G[S]中有形如 B-xAy的规则,其中 x,y € V *,则 FIRST (y)- { E € FOLLOW (A); (3)若文法G[S]中有形如B-xA的规则,或形如B-xAy的规则且E € FIRST ( y),其中 x,y € V *,贝U FOLLOW ( B) € FOLLOW (A ); 3.实验内容 计算first集合和follow集合 4.实验心得 通过上机实验我对文法符号的FIRST集和FOLLOW集有了更深刻的理 解,已经熟练的掌握了求解的思想和方法,同时也锻炼了自己的动手解决问题的能力,对编程能力也有所提高。 5.实验代码与结果 #in clude #in clude

编译原理实验报告5-语法分析程序的设计()

实验5语法分析程序的设计(2)一、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中算法优先分析方法。 二、实验内容 设计一个文法的算法优先分析程序,判断特定表达式的正确性。 三、实验要求 1、给出文法如下: G[E] E->T|E+T; T->F|T*F; F->i|(E); 2、计算机中表示上述优先关系,优先关系的机内存放方式有两种1)直接存放,2)为 优先关系建立优先函数,这里由学生自己选择一种方式; 1、给出算符优先分析算法如下: k:=1; S[k]:=‘#’; REPEAT 把下一个输入符号读进a中; IF S[k]∈V T THEN j:=k ELSE j:=k-1; WHILE S[j] a DO BEGIN REPEAT Q:=S[j]; IF S[j-1]∈V T THEN j:=j-1 ELSE j:=j-2 UNTIL S[j] Q 把S[j+1]…S[k]归约为某个N; k:=j+1;

S[k]:=N; END OF WHILE; IF S[j] a OR S[j] a THEN BEGIN k:=k+1;S[k]:=a END ELSE ERROR UNTIL a=‘#’ 1、 根据给出算法,利用适当的数据结构实现算符优先分析程序; 2、 利用算符优先分析程序完成下列功能: 1) 手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束; 2) 读入文本文件中的表达式; 3) 调用实验2中的词法分析程序搜索单词; 4) 把单词送入算法优先分析程序,判断表达式是否正确(是否是给出文法的语 言),若错误,应给出错误信息; 5) 完成上述功能,有余力的同学可以对正确的表达式计算出结果。 四、实验环境 PC 微机 DOS 操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、 分析文法中终结符号的优先关系; 2、 存放优先关系或构造优先函数; 3、利用算符优先分析的算法编写分析程序; 4、写测试程序,包括表达式的读入和结果的输出; 5、程序运行效果,测试数据可以参考下列给出的数据。 六、测试数据 输入数据: 编辑一个文本文文件expression.txt ,在文件中输入如下内容:

(完整word版)编译原理词法分析程序实现实验报告

(完整word版)编译原理词法分析程序实现实验报告 实验一词法分析程序实现 一、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 二、设计部分 因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下: GOTO 1:

(完整word版)编译原理词法分析程序实现实验报告 GOTO 2: 三、源程序代码部分 #include #include #include #define MAX 100 #define UNSIGNEDNUMBER 1 #define PLUS 2 #define SUBTRACT 3

#define MULTIPLY 4 #define DIVIDE 5 #define LEFTBRACKET 6 #define RIGHTBRACKET 7 #define INEFFICACIOUSLABEL 8 #define FINISH 111 int count=0; int Class; void StoreType(); int Type[100]; char Store[20]={'\0'}; void ShowStrFile();//已经将要识别的字符串存在文件a中 void Output(int a,char *p1,char *p2);//字符的输出过程 int Sign(char *p);//'+''-''*''/'整体识别过程 int UnsignedNum(char *p);//是否适合合法的正整数0~9 int LegalCharacter(char *p);//是否是合法的字符:Sign(p)||UnsignedNum(p)||'E'||'.' void DistinguishSign(char *p);//'+''-''*''/'具体识别过程 void TypyDistinguish();//字符的识别过程 void ShowType();//将类别码存储在Type[100]中,为语法分析做准备 void ShowStrFile()//已经将要识别的字符串存在文件a中 { FILE *fp_s; char ch; if((fp_s=fopen("a.txt","r"))==NULL)

(完整)编译原理实验报告(词法分析器 语法分析器)

(完整)编译原理实验报告(词法分析器语法分析器) 编辑整理: 尊敬的读者朋友们: 这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)编译原理实验报告(词法分析器语法分析器))的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。 本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)编译原理实验报告(词法分析器语法分析器)的全部内容。

编 译 原 理 实 验 报 告 实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号

2,识别出并输出简单语言的基本字.标示符.无符号整数。运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1)主程序 (2)扫描子程序 3 五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用

来表示正在分析的字符.字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include 〈stdio.h〉 #include

编译原理实验报告2-词法分析程序的设计

实验2 词法分析程序的设计 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*) 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < = ( ) ; 关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、根据正规式,画出状态转换图;

山东科技大学编译原理实验报告

(需要源代码请私信!请私信!) 编译原理实验报告 设计题目: 专业:班级: 设计人: 学号: 山东科技大学 2021年12 月4 日

指导教师对实验报告的评语 成绩: 指导教师签字: 年月日

目录 实验一词法分析之基于文法实现 (3) 1、实验目的 (3) 2、设计要求 (3) 3、设计说明 (3) 3.1需求分析 (3) 3.2概要设计 (4) 3.3详细设计 (4) 4、运行结果及分析 (11) 4.1测试数据及输出结果 (11) 4.2设计与思考 (11) 5、总结 (12) 实验二词法分析之基于Lex实现 (13) 1、实验目的 (13) 2、设计要求 (13) 3、设计说明 (13) 3.1需求分析 (13) 3.2概要设计 (13)

3.3详细设计 (16) 4、运行结果及分析 (17) 4.1测试数据及输出结果 (17) 4.2设计与思考 (19) 5、总结 (20) 实验三语法分析之递归下降分析法 (21) 1、实验目的 (21) 2、设计要求 (21) 3、设计说明 (21) 3.1需求分析 (21) 3.2概要设计 (22) 3.3详细设计 (23) (25) 4、运行结果及分析 (27) 4.1测试数据及输出结果 (27) 4.2设计与思考 (27) 5、总结 (28) 源代码 (29)

实验一词法分析之基于文法实现 1、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 2、设计要求 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 (遇到错误时可显示“Error”,然后跳过错误部分继续显示) 3、设计说明 3.1需求分析 输入范围:基本保留字、标识符、常数、运算符、分隔符。 输出范围:对正确的单词,按照<单词内部编码,值>的形式进行输出。对不正确的单词,做出错误处理,并进行记录输出。 输出形式:该程序依照<单词内部编码,值>的形式每行一个进行输出,例如(1,"int")。 程序功能:读入单词,并依次输出各个单词的内部编码及单词符号自身值。 正确测试数据:int,},3,=,a 错误测试数据:==

相关主题
文本预览
相关文档 最新文档