导航:首页 > 源码编译 > 编译原理实验报告pl0

编译原理实验报告pl0

发布时间:2022-02-24 16:18:45

① 0513《编译原理》作业要求 设计并实现TINYC语言的扫描程序;

你的作业还在不在,能否借我一用,酬谢

② 编译原理词法分析 Cannot open include file: 'pl0.h'为什么

pl0..h
头文件
位置不对,建议放在cpp同目录下,你们一般都是从网上拷贝下来的。若用VC++03.net新建工程,添加.cpp和.h即可。

③ 编译原理 词法分析 C 版 老师要求由编译原理课后PL0完整源代码改编

用LEX和YACC可以自动生成词法分析和语法分析。
你要分析什么语法,没有明确讲啊。

④ 一个编译原理的课程设计,急急急

回答:alkaid_pku
学长
4月14日 06:31 1. 预处理
2. 编译
3. 汇编
4. 查找库函数
5. 连接

⑤ 编译原理PL/0如何将

1、分析原来的IF语句的BNF
<条件语句>::=IF <条件>THEN <语句>

和扩展后的IF语句的BNF

<条件语句>::=IF <条件>THEN <语句>[ELSE <语句>]

在原有的程序上把if----then 扩展为if then else(不是改程序里的if then,而是实现能分析if then else,原有的只能分析if then)

2、pl0的一维数组扩充
分析BNF
<数组变量声明>::=<标识符> ( <下界>: <上界>)

<数组变量引用>::= <标识符> ( <表达式> )

在实现上的要求

找到应该修改的地方,进行修改和扩充

⑥ 编译原理PL0c程序运行文件内容时崩溃什么原因

这种情况是因为程序源码本身没有语法错误之类的,所以可以编译通过,但在逻辑上却有错误,导致错误,比如内存读写错。举个例子,如果用scanf("%d",&a);时写成scanf("%d",a);,编译时并不会报错,但运行时却会因为读了a的值指向的没有权限读写的...

⑦ 编译原理实践:小型编译器实现。带程序设计实验报告。 谢谢啊。 邮箱:[email protected]!!

11婶。。。

⑧ 编译原理词法分析 Cannot open include file: 'pl0.h'为什么

pl0..h头文件位置不对,建议放在cpp同目录下,你们一般都是从网上拷贝下来的。若用VC++03.net新建工程,添加.cpp和.h即可。

⑨ 编译原理实验报告

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

}

阅读全文

与编译原理实验报告pl0相关的资料

热点内容
linux更换语言 浏览:361
雅典pdf 浏览:599
5g时代app归属什么公司 浏览:966
绝地求生国际服怎么开通服务器 浏览:144
通达信基本指标源码 浏览:363
如何看windows服务器日志 浏览:411
如何解锁平板电脑的加密 浏览:994
长沙社保是什么app 浏览:860
单片机的位寻址 浏览:851
服务器怎么设置内网穿透 浏览:753
pdf转jpg工具注册码 浏览:409
php上传进度百分比 浏览:923
江苏服务器阵列卡驱动云主机 浏览:416
魔兽世界怎么切换回服务器 浏览:226
如何使用java编程 浏览:191
win8c语言编程软件 浏览:407
cc是程序员必须学会的语言吗 浏览:594
广东源码论坛小程序 浏览:423
美团打车什么时候出的APP 浏览:370
chromejava插件安装 浏览:374