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

时间:2019-05-14 03:15:28下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《编译原理语法分析实验报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《编译原理语法分析实验报告》。

第一篇:编译原理语法分析实验报告

实验2:语法分析

1.实验题目和要求

题目:语法分析程序的设计与实现。

实验内容:编写语法分析程序,实现对算术表达式的语法分析。要求所分析算术表达式由如下的文法产生。

EET|ET|TTT*F|T/F|F Fid|(E)|num实验要求:在对输入表达式进行分析的过程中,输出所采用的产生式。方法1:编写递归调用程序实现自顶向下的分析。方法2:编写LL(1)语法分析程序,要求如下。

(1)编程实现算法4.2,为给定文法自动构造预测分析表。(2)编程实现算法4.1,构造LL(1)预测分析程序。

方法3:编写语法分析程序实现自底向上的分析,要求如下。(1)构造识别所有活前缀的DFA。(2)构造LR分析表。

(3)编程实现算法4.3,构造LR分析程序。

方法4:利用YACC自动生成语法分析程序,调用LEX自动生成的词法分析程序。实现(采用方法1)

1.1.步骤:

1)对文法消除左递归

ETE'E'TE'|TE'|TFT'T'*FT'|/FT'|Fid|(E)|num

2)画出状态转换图

化简得:

3)源程序

在程序中I表示id N表示num

1.2.例子:

a)例子1 输入:I+(N*N)输出:

b)例子2 输入:I-NN 输出:

第二篇:编译原理实验报告

编译原理实验报告

报告完成日期 2018.5.30

一. 组内分工与贡献介绍

二. 系统功能概述;

我们使用了自动生成系统来完成我们的实验内容。我们设计的系统在完成了实验基本要求的前提下,进行了一部分的扩展。增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。

三. 分系统报告;

一、词法分析子系统

词法的正规式:

标识符

<字母>(<字母>|<数字字符>)* 十进制整数

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)* 运算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==; 对于标识符和关键字: A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε 综上正规文法为: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|ε

E1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|ε

C2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε

A4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε

状态图

流程图:

词法分析程序的主要数据结构与算法

考虑到报告的整洁性和整体观感,此处我们仅展示主要的程序代码和算法,具体的全部代码将在整体的压缩包中一并呈现

另外我们考虑到后续实验中,如果在bison语法树生成的时候推不出目标的产生式时,我们设计了报错提示,在这个词的位置出现错误提示,将记录切割出来的词在code.txt中保存,并记录他们的位置。

以下是我们的主要代码:

进制的识别:

结果展示:

二、语法分析子系统

根据选择的语法分析方法进行描述

我们使用了递归子程序发,并且对原有的产生式进行了改写,改写后的结果如下: P→LP1|L L→S

S→id=E|{P}|if C then S | if C then S

1else S2 | while C do S1 C→E1C’

C’→>E2|

E→int8E’| int10E’| int16E’| idE’|T E’→+T|-T||+TE’|-TE’

T→int8T’| int10T’| int16T’| idT’|F T’→*F|/F|*FT’|/FT’

F→(E)|int8|int10|int16|id

简化的语法图: S的语法图:

C的语法图:

E的语法图:

T的语法图:

F的语法图:

流程图:

语法分析子系统的主要数据结构与算法

我们采用了自动生成技术,同样在这里也是展示主要的核心功能代码,全部的代码展示在压缩包中:

我们在设计时,实现了产生式对应的字符串同时标识产生式定义的int值 辅助程序:

生成语法树的程序:

1.树节点:

2.创建新节点

3.创建实数类型新节点

4.创建标识符类型新节点

5.输出语法树 三、三地址码生成器

算法的基本思想:

我们增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。

在报错的时候,我们会呈现类型、作用域和赋值三种的问题的报错信息。

流程图:

算法展示:

四、实验体会

这次实验其实总的来说是让我们更加清晰的理解到了我们所学的内容。有时候我们上课听讲,课下复习写作业的时候,其实看似掌握了所学内容,但实际上并没有亲身体会的操作很难让我们深刻的理解其中的相关意义。通过这次实验,我们能够从根源处了解到了我们所学的内容,并且基于我们理解之后的输出。比如词法分析不能采用空格来区分单词,因为存在加减乘除等运算符和分隔符,使用空格来区分可能会造成错误的分解。又比如我们再在程序设计中,常常体会到效率的重要性。影响词法分析的效率的主要因素是各个状态的分支如何规划。如果每个进来的单词都能在最短的时间和最少的匹配次数内找到其入口,则效率将得到很大程度上的提高。所以由此我们产生了声明变量类型、赋值和作用域的想法,将其放在最后来进行判断,这样可以提高整体的执行效率。

另外,这次小组成员彼此不在一个班级,这样从某一方面来说,也加强了我们互相快速熟识并团结协作的能力,有了这种体验,我想我们在今后的生活中,面对这种情况的时候,将会变得更加有经验。

五、源程序

词法分析器: 输入结果:

输出结果:

语义分析结果:

输入:

第二组数据的输入:

输出:

三地址码的输入:

第二组数据的输入:

输出:

第三篇:编译原理--实验报告(小编推荐)

吉林大学计算机科学与技术学院实验报告

计算机基础实验教学中心编制

姓名,学号:胡智超,53070108;陈玉娟,53070130;程明,53070109;张宇航,53070110

2007 级1班 实验室:A209成绩指导教师(签字)(存档)

—————————————————————————————————————————————— ★ 实验课程名称:

★ 实验 项 目:

★ 实验 仪 器:

★ 实验 要 求:

★ 实验步骤、分析设计与结果:

第四篇:编译原理课程设计_算术表达式的语法分析及语义分析程序设计(模版)

设计题一:算术表达式的语法分析及语义分析程序设计。1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。2.设计内容及要求:

算术表达式的文法:

〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/

选择算符优先分析方法完成以上任务,生成逆波兰式的中间代码;

(1)写出算术表达式的符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(2)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

源代码

#define _CRT_SECURE_NO_WARNINGS #include “stdio.h” #include “stdlib.h” #include using namespace std;char data[20][20];//算符优先关系 char s[100];//模拟符号栈s char lable[20];//文法终极符集 char input[100];//文法输入符号串 char str[20][10];//用于输入串的分析 int k,j;char a,q;int r;//文法规则个数 int r1;int m, n, N;//转化后文法规则个数 char st[10][30];//用来存储文法规则 char first[10][10];//文法非终结符FIRSTVT集 char last[10][10];//文法非终结符LASTVT集

int fflag[10] = { 0 };//标志第i个非终结符的FIRSTVT集是否已求出 int lflag[10] = { 0 };//标志第i个非终结符的LASTVT集是否已求出 int deal();//对输入串的分析

int terminal_symbol(char c);//判断字符c是否是终极符 int location(char c);//求字符c在算符优先关系表中的下标 void out(int j, int k, char *s);//打印s栈

void firstvt(char c);//求非终结符c的FIRSTVT集 void lastvt(char c);//求非终结符c的LASTVT集 void table();//创建文法优先关系表 char output[10];//存储逆波兰式 void main(){

int i, j, k = 0;printf(“请输入文法规则数:”);scanf(“%d”, &r);printf(“请输入文法规则:n”);for(i = 0;i

} for(i = 0;i

} for(i = 0;i

for(j = 0;st[i][j]!= '';j++)if((st[i][j]<'A' || st[i][j]>'Z')&& st[i][j]!= '-'&&st[i][j]!= lable[k++] = st[i][j];for(j = 0;st[i][j]!= '';j++){

} if(st[i][0]<'A' || st[i][0]>'Z'){

} if(st[i][j] >= 'A'&&st[i][j] <= 'Z'){

} if(st[i][j + 1] >= 'A'&&st[i][j + 1] <= 'Z'){

} printf(“文法error!n”);exit(-1);printf(“文法error!n”);exit(-1);scanf(“%s”, st[i]);//存储文法规则,初始化FIRSTVT集和LASTVT集*/

first[i][0] = 0;/*first[i][0]和last[i][0]分别表示st[i][0]非终极符的last[i][0] = 0;

FIRSTVT集和LASTVT集中元素的个数*/

'>'&&st[i][j]!= '|')lable[k] = '#';lable[k + 1] = '';

} table();//

printf(“FIRST集为:n”);//输出每个非终结符的FIRST集 for(i = 0;i

} printf(“LAST集为:n”);//输出每个非终结符的LAST集 for(i = 0;i

} printf(“算符优先分析表如下:n”);for(i = 0;lable[i]!= '';i++)printf(“t%c”, lable[i]);printf(“n”);for(i = 0;i

} printf(“请输入文法输入符号串以#结束:”);scanf(“%s”, input);deal();cout << “逆波兰式为:”;for(i = 0;lable[i]!= '';i++)cout << output[i] << '';// cout << endl;printf(“%ct”, lable[i]);for(j = 0;j

char text[20][10];//存储改写后的文法

int i, j, k, t, l, x = 0, y = 0;int m, n;x = 0;for(i = 0;i

firstvt(st[i][0]);

lastvt(st[i][0]);} for(i = 0;i

{

text[x][y] = st[i][0];

y++;

for(j = 1;st[i][j]!= '';j++)

{

if(st[i][j] == '|')//

{

text[x][y] = '';

x++;

y = 0;

text[x][y] = st[i][0];

y++;

text[x][y++] = '-';

text[x][y++] = '>';

}

else

{

text[x][y] = st[i][j];

y++;

}

}

text[x][y] = '';

x++;

y = 0;} r1 = x;//

printf(“转化后的文法为:n”);for(i = 0;i

printf(“%sn”, text[i]);} for(i = 0;i

{

//输出转化后的文法规则串 /*求每个终结符的推导结果(去掉“->”后的

} str[i][0] = text[i][0];for(j = 3, l = 1;text[i][j]!= '';j++, l++)str[i][l] = text[i][j];str[i][l] = '';for(i = 0;i

for(j = 1;text[i][j + 1]!= '';j++){

if(terminal_symbol(text[i][j])&& terminal_symbol(text[i][j + 1])){

} if(text[i][j + 2]!= ''&&terminal_symbol(text[i][j])&& {

} if(terminal_symbol(text[i][j])&&!terminal_symbol(text[i][j + 1]))//终结{

} if(!terminal_symbol(text[i][j])&& terminal_symbol(text[i][j + 1]))//非终{ for(k = 0;k

} m = location(text[i][j]);for(t = 0;t

} n = location(first[k][t + 1]);data[m][n] = '<';if(st[k][0] == text[i][j + 1])

break;m = location(text[i][j]);n = location(text[i][j + 2]);data[m][n] = '=';m = location(text[i][j]);n = location(text[i][j + 1]);data[m][n] = '=';terminal_symbol(text[i][j + 2])&&!terminal_symbol(text[i][j + 1]))符和非终结符相接,用后于关系填表

结符和终结符相接,用先于关系填表

if(st[k][0] == text[i][j])

break;

}

n = location(text[i][j + 1]);

for(t = 0;t

{

m = location(last[k][t + 1]);

data[m][n] = '>';

}

}

} } m = location('#');//#后于所有的终结符规约

for(t = 0;t

n = location(first[0][t + 1]);

data[m][n] = '<';} n = location('#');//

for(t = 0;t

m = location(last[0][t + 1]);

data[m][n] = '>';} data[n][n] = '=';}

void firstvt(char c){ int i, j, k, m, n;for(i = 0;i

{

if(st[i][0] == c)

break;} if(fflag[i] == 0){

n = first[i][0] + 1;

m = 0;

do

{

if(m == 2 || st[i][m] == '|')

{ if(terminal_symbol(st[i][m + 1]))

//求FIRSTVT集

}

}

} {

} else {

} if(terminal_symbol(st[i][m + 2])){

} if(st[i][m + 1]!= c){

}

firstvt(st[i][m + 1]);for(j = 0;j

}

for(k = 0;k

}

int t;

for(t = 0;t

}

if(t == n){

}

first[i][n] = first[j][k + 1];n++;

if(first[i][t] == first[j][k + 1])

break;

if(st[j][0] == st[i][m + 1])

break;

first[i][n] = st[i][m + 2];n++;first[i][n] = st[i][m + 1];n++;m++;} while(st[i][m]!= '');first[i][n] = '';first[i][0] =--n;fflag[i] = 1;

void lastvt(char c)//求LASTVT集 {

int i, j, k, m, n;for(i = 0;i

} if(lflag[i] == 0){

n = last[i][0] + 1;m = 0;do {

if(st[i][m + 1] == '' || st[i][m + 1] == '|'){

if(terminal_symbol(st[i][m])){

} else {

if(terminal_symbol(st[i][m1];n++;last[i][n] = st[i][m];n++;if(st[i][0] == c)break;

}

}

}

}

}

}

}

if(t == n){

}

last[i][n] = last[j][k + 1];n++;m++;} while(st[i][m]!= '');last[i][n] = '';last[i][0] =--n;lflag[i] = 1;int deal(){

int i, j;int size = 0;// int x, y;int z;//输入串的长度 k = 1;s[k] = '#';//栈置初值

for(i = 0;input[i]!= '';i++);//计算输入串的长度 z = i--;// i = 0;while((a = input[i])!= '')//a表示要输入的字符 {

if(terminal_symbol(s[k]))j = k;j = k1]))j = j2;x = location(s[j]);y = location(q);} while(data[x][y]!= '<');int m, n, N;for(m = j + 1;m <= k;m++){

} k = j + 1;if(k == 2 && a == '#'){

out(1, k, s);printf(“%c”, a);out(i + 1, z, input);printf(“结束n”);for(N = 0;N

} if(!terminal_symbol(s[m])&&!terminal_symbol(str[N][n])){

} else

if(terminal_symbol(s[m]))if(s[m] == str[N][n]){

}

s[j + 1] = str[N][0];break;

if(terminal_symbol(s[m + 1])&& terminal_symbol(str[N][n + 1]){

}

s[j + 1] = str[N][0];break;&& s[m + 1] == str[N][n + 1])

}

} printf(“规约成功!n”);return 1;//输入串符合文法的定义

else

if(data[x][y] == '<' || data[x][y] == '='){ //移进

out(1, k, s);

printf(“%c”, a);

out(i + 1, z, input);

printf(“移进n”);

k++;

s[k] = a;

i++;

}

else

{

printf(“n规约失败n”);

return 0;

} } printf(“n规约失败n”);//

return 0;}

void out(int j, int k, char *s){ int n = 0;int i;for(i = j;i <= k;i++){

printf(“%c”, s[i]);

n++;} for(;n<15;n++){

printf(“ ”);} }

int location(char c){ int i;for(i = 0;lable[i]!= '';i++)

//求字符c在算符优先关系表中的下标

} {

} return-1;if(c == lable[i])return i;int terminal_symbol(char c)//判断字符c是否是终极符 {

} int i;for(i = 0;lable[i]!= '';i++){

} return 0;if(c == lable[i])return 1;

第五篇:《编译原理》课程(词法分析)实验报告

一.实验序号:《编译原理》第一次实验

二.实验题目:词法分析

三.实验日期:2010.10

四.实验环境(操作系统,开发语言)

操作系统:Windows

开发语言:C

五.实验内容(实验要求)

a)将标识符的词法改为“以大写字母或小写字母开头,后面可以跟大写字

母或小写字母或数字或下划线”。

b)将<条件>中的表示相等关系的单词“=”改为“= =”

c)将原来的无小数的数改为可以有小数的数

六.实验步骤

a)打开VC++,找到getsym()项目。

int getsym()

{...}

在getsym()函数中设置断点,F10逐过程调试

根据要求a修改为

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')

往后面看,修改while(ch>='a' && ch<='z' || ch>='0' && ch<='9' ||ch>='A' && ch<='Z' || ch=='_');

b)在检测赋值符号的程序段中找到等号 = 的判断代码,改变成为 = = 即

可。

c)在获取整数数字的值的程序段后面添加判断小数点的代码。如果是,即

读取符号并且按照小数的要求将其缩小并且累加到总的符号串中。

七.实验体会(包括收获、心得体会、存在的问题及解决问题的方法、建议等)

通过实验,如果要修改代码的话,首先应该读懂源码,在修改之前了解到程序段的功能是什么,然后再在相应的行进行修改添加,再进行合理的调试。如果问题太过困难可以查询资料或与同学进行讨论

八.实验结果(关键源程序)

a)

int getsym()

{

int i,j,k;

while(ch==' '||ch==10||ch==9)/*忽略空格,换行和TAB*/{

getchdo;

}

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')/*名字或保留字以a..zA。Z开头*/{

k=0;

do{

if(k

{

a[k]=ch;

k++;

}

getchdo;

}while(ch>='a' && ch<='z' || ch>='0' && ch<='9' || ch>='A' && ch<='Z' || ch=='_');//

if(ch>='0'&&ch<='9')/*检测是否为数字,以0..9开头*/{

k=0;

num=0;

sym=number;

do{

//435

num=10*num+ch-'0';

k++;

getchdo;

}while(ch>='0' && ch<='9');

if(ch=='.')

{

k++;

sym=period;

getchdo;

sym=number;

int div=10;

do{num=num+(ch-'0')/div;

k++;

getchdo;

div=div*10;

}while(ch>='0'&&ch<='9');

}

b)

else

{

if(ch=='>')//检测大于或大于等于符号{

getchdo;

if(ch=='=')//add by M

{

sym=geq;//构成>=

getchdo;

}

else

{

sym=gtr;//否则就是一个单独的>号}

}

else

{

if(ch=='=')

{

getchdo;

if(ch=='=')

{

sym=deq;

getchdo;

}

else

{

sym=eql;

}

}

c)else

{if(ch == ’.’)

{k=10;

getchdo;

do{num=num+(ch-'0')/k;

k=k*10;

getchdo;

}while(ch>='0'&&ch<='9');}

}

下载编译原理语法分析实验报告word格式文档
下载编译原理语法分析实验报告.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    编译原理 学习心得

    国际学院 0802 杨良燕 200819100227《编译原理》课程学习心得 《编译原理》是计算机专业的一门重要课程,正如教材 第一章的引论所述,“编译程序是现代计算机系统的基本组成部......

    编译原理课程设计

    课 程 设 计 报 告 设计题目:一个简单文法的编译器前端的设计与实现 班级: 计算机1206 组长学号:201239 组长姓名:闫智宣 指导教师:李晓华 设计时间:2014年12月 [在此处键入] 设......

    编译原理教学大纲(范文模版)

    编译原理教学大纲 一、课程的性质、地位 本课程是计算机专业的重要专业课之一,是一门理论性和实践性较强的课程。主要介绍程序设计语言编译程序构造的基本原理和基本实现方法......

    编译原理论文

    编译原理心得体会 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法,在计算机本科教学中占有十分重要的地位。 该课程理论性与实践性都很强,我......

    编译原理课程设计报告

    武 汉 纺 织 大 学 编译原理课程设计实验报告学院:数学与计算机 专业:计算机 姓名: 班级: 学号:1 编译原理 编译原理课设报告 一、 实验目的 加强对编译程序的整体认识和了解,巩......

    编译原理试题(2009-2010-1)

    《编译原理》试题A 1.名词解释 短语 LL(1)文法 语法分析 无环路有向图(DAG) 语法制导翻译 2. Pascal语言无符号数的正规定义如下: num  digit+ (.digit+)? (E(+|-)? digit+)?......

    编译原理学习论文(推荐)

    编译原理学习论文 班级:09应用(2)班姓名:彭文阳学号:2009081215 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,......

    编译原理课程设计设计任务书

    编译原理课程设计任务书 1、目的 学生在学习《程序设计语言编译原理》课程过程中,结合各章节的构造编译程序的基本理论,总共用10个课时完成课程设计。在基本实验完成的基础上,......