导航:首页 > 源码编译 > 编译原理实验需要什么

编译原理实验需要什么

发布时间:2022-06-01 07:06:08

㈠ 学习编译原理,需要什么基础

编译原理内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
主要是讲怎么做程序的编译器。

需要数学基础和很强的逻辑思维。

编译原理里的字符闭包是指有限循环。关于闭包这些名词解释,你们的课程应该有离散数学吧?会有对这些概念的解释。

编译原理这书啊。得花老大精力去看了。每一行都会是至关重要的。如果你漏看了哪一节,或许接下来看到的新字母就不知道是什么意思了。

所以要反复看,反复用逻辑思维推敲。做习题,习题类型也就几种,做熟了就很简单

㈡ 编译原理实验报告

#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");
}

}

㈢ 学习编译原理之前,除了需要学习c语言外,还需要学什么

主要是会数学逻辑,你可以看看离散数学,其实话说回来 主要看你学编译原理用来干什么了,如果只学理论 你会发现你学完以后依然不知道怎么具体运用,只能知道大概的程序编译过程, 如果你想可以自己也能写出词法分析器语法分析器 甚至语义分析 那么 你最重要的是学好数据结构,我的毕业设计是C语言编译器 刚开始我觉得自动机什么的 是难点 可是到后来我才发现 最重要的是要有良好的数据结构的运用能力 数据结构是一切程序的灵魂!没有合理的存储结构 程序就像没有根基的浮萍

㈣ 如何学习编译原理

编译原理是本科计算机课程中最难的一门了,因为它实在是太抽象了,而且学过之后很容易忘记,但是它又是非常重要的一门课程,起到了承上启下的作用。
学习编译原理,不要死看课本,课本都是翻译国外的,读起来有点吃力。结合习题是比较好的,可以理解一些概念。
另外,可以用lex和yacc实现一个词法分析器和语法分析器,如果这两个实验跑通了,对你学习编译原理的学习非常有帮助。

㈤ 编译原理实验求助

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

㈥ 编译原理里面的flex是什么东西bison是什么编译原理里面的实验都是什么

你说的两个英文词是词法分析和语法分析程序的自动生成工具的软件名称。
这些工具的作用是将用正规式和产生式书写的词法和语法规则描述代码转换成完成分析功能的源程序。

编译原理里的实验有两类,一类是学习使用上述的工具自动生成编译分析程序,一类是自己手工编写编译分析程序。完成这些实验,可帮助学习者对编译过程有更多、更深入的了解。

㈦ 学习编译原理之前需要学哪些知识

1.你要学到什么水平?是想考试考好还是想实际写出来一个足够强度的编译器?如果是前者,就一句:努力当学霸才是你唯一的出路。
2.对于scanner &parser的话,对于书上所讲的算法的要求是很高的,有很大的依赖性,所以必须理解透彻,即使没有机会实现也要自己动手画画。同时这也是本科阶段所学的编译原理的所有内容。虽然flex和bison很好使,但是强烈不建议使用。
3.对于生成器、连接器或者解释器的话,那么你要了解汇编语言、微处理器、微机接口等计算机基础学科。简单的说就是从底层学到高级语言的层面。这个要求是很高的,毕竟涉及到二进制代码优化等很麻烦的。

㈧ 学好“计算机编译原理”需要具备其他一些知识么

1.你要学到什么水平?是想考试考好还是想实际写出来一个足够强度的编译器?如果是前者,就一句:努力当学霸才是你唯一的出路。
2.对于scanner &parser的话,对于书上所讲的算法的要求是很高的,有很大的依赖性,所以必须理解透彻,即使没有机会实现也要自己动手画画。同时这也是本科阶段所学的编译原理的所有内容。虽然flex和bison很好使,但是强烈不建议使用。
3.对于生成器、连接器或者解释器的话,那么你要了解汇编语言、微处理器、微机接口等计算机基础学科。简单的说就是从底层学到高级语言的层面。这个要求是很高的,毕竟涉及到二进制代码优化等很麻烦的。

阅读全文

与编译原理实验需要什么相关的资料

热点内容
xp自动备份指定文件夹 浏览:660
我的世界服务器如何让世界平坦 浏览:167
服务器和电脑如何共享 浏览:685
程序员早期症状 浏览:568
学小学生编程哪里学 浏览:947
单片机控制与设计论文 浏览:775
破解加密视频违法嘛 浏览:242
pythonforandroid下载 浏览:235
进光遇显示服务器繁忙怎么办 浏览:643
安卓手机如何改成苹果xr 浏览:519
华为服务器为什么在山里 浏览:274
黑马程序员基础测试题 浏览:265
网易服务器如何ban物品指令 浏览:817
安卓微信不更新了怎么办 浏览:155
专业程序员什么水平 浏览:879
如何查看服务器硬盘剩余空间 浏览:574
cdda算法 浏览:412
javawebserver 浏览:68
安卓手机怎么看视频区域限制 浏览:156
php获取二级域名 浏览:471