编译题

编译题
编译题

1、从键盘任意输入某班20个学生的成绩,计算总成绩并统计成绩不及格的学生人数。、

#include

#define N 20

void main()

{ int a[N],i,count=0,sum=0;

printf("请输入%d个学生的成绩:\n",N);

for(i=0;i

{ scanf("%d",&a[i]);

sum+=a[i];

if(a[i]<60) count++;

}

printf("\n总成绩=%d, 不及格人数为: %d\n",sum,count);

}

2. //输入一个整数,判断它能否被3、7整除,并输出以下信息:能同时被3、7整除;能被其中一个数(指出哪个)整除;不能被3、7整除。

#include

void main()

{ int x;

printf("\n请输入一个整数x:",x);

scanf("%d",&x);

if(x%3==0&&x%7==0)

printf("%d能同时被3和7整除。\n",x);

else if(x%3==0)

printf("%d能被3整除,不能被7整除。\n",x);

else if(x%7==0)

printf("%d能被7整除,不能被3整除。\n",x);

else

printf("%d不能被3或7整除。\n",x);

}

3. //给一个不多于5位的正整数,要求:1)求出它是几位数;2)分别输出出每一位数字;3)按逆序输出各位数字。如:原数为321,应输出123。

#include

void main()

{ long x; int g,s,b,q,w;

printf("\ninput x:"); scanf("%ld",&x);

g=x%10; s=x/10%10; b=x/100%10; q=x/1000%10; w=x/10000;

if(x>=1E+5||x<=0)

printf("Out of range!\n");

else

{ if(w>0) printf("5位数,反序数字是:%d%d%d%d%d\n",g,s,b,q,w); else if(q>0) printf("4位数, 反序数字是:%d%d%d%d\n",g,s,b,q); else if(b>0) printf("3位数,反序数字是:%d%d%d\n",g,s,b);

else if(s>0) printf("2位数,反序数字是:%d%d\n",g,s);

else printf("1位数,数字是:%d\n",g);

}

}

4.读入一个年份判断是否是闰年,符合下列条件之一的年份都是闰年:能被400 整除的年份;不能被100整除,但可以被4整除的年份。

#include

void main()

{

int year;

printf("Enter year:");

scanf("%d",&year);

if (year%400==0 || (year%4==0 && year%100!=0))

printf("%d is a leap year.\n",year);

else

printf("%d is not a leap year.\n",year);

}

5. //任意输入一个整数,判断这个数的正负性和奇偶性。

#include

void main()

{

int x;

printf("\n请输入一个整数x:");

scanf("%d",&x);

if (x==0)

printf("\nx=%d,是一个偶数。\n",x);

else if(x>0)

{ if(x%2==0) printf("\nx=%d,是一个正偶数。\n",x);

else printf("\nx=%d,是一个正奇数。\n",x);

}

else

{ if(x%2==0) printf("\nx=%d,是一个负偶数。\n",x);

else printf("\nx=%d,是一个负奇数。\n",x);

}

}

6. //计算并显示由下列说明确定的一周薪水:如果工时小于40,则薪水按10元/小时计;否则,按400元加上超出40小时部分(超出40小时部分按15元/

小时,一周总工时不能超过84小时)。

#include

void main()

{

int x,y;

printf("\n请输入本周工时数x:");

scanf("%d",&x);

if(x>84||x<0)

printf("一周工时数不能为负,也不能超过84小时!");

else

{ if(x<=40)

y=x*10;

else

y=400+(x-40)*15;

printf("\n本周薪水是: %d元。\n",y);

}

}

7. #include

void main() /*用switch 语句评级 */

{ int score;

scanf("%d",&score);

if ( score<0||score>100) printf("Error!");

switch (score/10)

{ case 10:

case 9: printf("%d: A\n",score); break; case 8: printf("%d: B\n",score); break;

case 7: printf("%d: C\n",score); break;

case 6: printf("%d: D\n",score); break; default: printf("%d: E\n", score);

}

}

8.有一分段函数,编写程序,输入x,输出y的值。

#include

void main()

{ int x,y;

printf("input x:");

scanf("%d",&x);

if (x<1)

{ y=x;

printf("X=%d, Y=X=%d\n",x,y);

}

else if (x<10)

{ y=2*x-1;

printf("X=%d, y=2*x-1=%d\n",x,y);

}

else

{ y=3*x-11;

printf("X=%d, Y=3*x-11=%d\n",x,y);

}

}

9.编写程序,输入三角形的三条边长a、b、c,求其面积。注意:对于不合理的边长输入要输出数据错误的提示信息。(提示:p=(a+b+c)/2,面积为p*(p-a) *(p-b) *(p-c)的平方根。)

#include

#include

void main()

{ float a,b,c,p,area;

printf("请输入三条边长a b c:\n");

scanf("%f%f%f",&a,&b,&c);

if (a+b<=c||a+c<=b||b+c<=a) printf("这不是三角形!\n");

else

{p=(a+b+c)/2;

area=sqrt(p*(p-a)*(p-b)*(p-c));

printf("三边长为: %.2f, %.2f, %.2f\n",a,b,c);

printf("面积=:%.2f:\n",area);

}

}

10. //通过键盘输入一个字符,判断该字符是数字字符、大写字母、小写字母还是其他字符。

#include

void main()

{ char c;

printf("请输入一个字符:\n");

c=getchar();

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

printf("%c:是一个数字字符\n",c);

else if(c>='A'&&c<='Z')

printf("%c:是一个大写字母\n",c);

else if(c>='a'&&c<='z')

printf("%c:是一个小写字母\n",c);

else

printf("%c:是其它字符\n",c);

}

11. //输入三角形的三条边a,b,c,判断它们能否构成三角形,若能构成三角形,指出是何种三角形(等腰三角形、直角三角形、一般三角形)。

#include

#include

void main()

{ float a,b,c;

printf("请输入三条边长a b c:\n");

scanf("%f%f%f",&a,&b,&c);

if (a+b<=c||a+c<=b||b+c<=a) printf("这不是三角形!\n");

else

{ printf("三边长为: %.2f, %.2f, %.2f\n",a,b,c);

if(a==b||a==c|b==c)

printf("这是等腰三角形!\n");

if(a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b)

printf("这是直角三角形!\n");

if(!(a==b||a==c|b==c)&&!(a*a==b*b+c*c||b*b==a*a+c*c||c*c==a*a+b*b)) printf("这是一般三角形!\n");

}

}

12. //从键盘任意输入一个4位正整数x,编程计算x的每一位数字相加之和。例如,输入x为1234,则由1234分离出其千位1、百位2、十位3、个位4,然后计算1+2+3+4=10,并输出10。

#include

void main()

{

unsigned x,a,b,c,d;

printf("请输入一个4位正整数x: ");

scanf("%u",&x);

if(x>9999||x<1000)

printf("输入的数据不是4位正整数!\n");

else

{d=x%10;c=x/10%10;b=x/100%10;a=x/1000;

printf("%u的每位数字这和: \n%u+%u+%u+%u=%u\n\n",x,a,b,c,d,a+b+c+d);

}

}

13. //编制程序要求输入整数x、y和z,若x*x+y*y+z*z小于1000,则输出x*x+y*y+z*z;否则输出x+y+z。

#include

void main()

{ int x,y,z;

printf("\n请输入x,y,z:");

scanf("%d,%d,%d",&x,&y,&z);

if(x*x+y*y+z*z<1000)

printf("\n%d*%d+%d*%d+%d*%d=%d\n",x,x,y,y,z,z,x*x+y*y+z*z);

else

printf("\n%d+%d+%d=%d\n",x,y,z,x+y+z);

}

14. //百鸡问题:公鸡每只5元,母鸡每只3元,小鸡3只1元。用100元买100只鸡,问公鸡、母鸡和小鸡各能买多少只?要求列出所有可能。

#include

void main()

{

int x,y,z;

for (x=0;x<=100;x++)

for (y=0;y<=100;y++)

{

z=100-x-y;

if (5*x+3*y+z/3.0==100 )

printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);

}

}

15.输出1~500之间(即从1到500)的全部"同构数"之和。所谓"同构数"是指一个数,它出现在它的平方数的右端。如6的平方是36,6出现在36的右端,6就是同构数。

#include

void main()

{

int i,sum=0;

for(i=1;i<=500;i++)

if(i==i*i%10||i==i*i%100||i==i*i%1000)

sum+=i;

printf("sum=%d\n",sum);

}

16. //求所有的"水仙花数"。所谓"水仙花数"是指一个3位数,其各位数字的立方和等于该数本身。例如,153是一个"水仙花数",因为153=13+53+33

#include

void main()

{ int i,j,k,n;

printf("\n");

for (n=100;n<1000;n++)

{ i=n/100; j=n/10%10; /*等价于j=n%100/10 */

k=n%10;

if(n==i*i*i+j*j*j+k*k*k)

printf("%-10d",n);

}

printf("\n");

}

17.编程计算a+aa+aaa+…+aa…a(n个a,a为不等于0的数字),如:2+22+222+2222+22222(此时n=5),n和a的值由键盘输入。

#include

void main()

{int a,n,i; long sn=0,tn=0;

scanf("%d,%d",&a,&n);

for(i=1;i<=n;i++)

{ tn=tn*10+a;

sn+=tn;

}

printf("sum is %d\n",sn);

}

18. //b5、输入一行字符,分别统计出其中字母、数字和其他字符的个数。

#include

void main()

{

int letter=0,digit=0,other=0;

char c;

for(;(c=getchar())!='\n';)

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

letter++;

else if(c>='0'&&c<='9')

digit++;

else

other++;

printf ("\nletter=%d, digit=%d, other=%d\n",letter,digit,other); }

19.根据公式e=1+1/1!+1/2!+1/3!...求e的近似值,精度要求为小数点后6位. #include

void main()

{ int i;

float e,n;

e=1.0; n=1.0;

for (i=1;n>=1e-6;i++)

{ n=n/i;

e+=n; }

printf("e=%f\n",e);

}

20. //编写程序,对数据进行加密。从键盘输入一串数字,对每一位数字均加2,若加2大于9,则取其除以10的余数。如:2863加密后得到4085。(提示:将这串数字按字符串处理)

#include

void main()

{

char c;

c=getchar();

while(c>='0'&&c<='9') //如不是数字,则退出循环

{ c=c+2; //加数字加密

if(c>'9')

c=c-10;

putchar(c); //输出加密后数字

c=getchar(); //接收下一下数字

}

putchar('\n');

}

21..任意输入一个字符串,计算输入字符串的实际长度,然后输出,(即实现和函数strlen相同的功能)。

#include

void main()

{ char c,len=0;

do{c=getchar();

if(c=='\n') break;

len++;

}while(1);

printf("\nlen=%d\n",len);

}

22.国民经济总值按每年8%的比率增长,编程求解几年翻番。

#include

void main()

{ int i;float sum=1;

for(i=0;sum<2;i++)

sum*=1.08;

printf("i=%d\n",i);

}

23. //爱因斯坦数学题。爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。请问,这条阶梯共有多少阶?

#include

#include

void main()

{

int x=7;

while(1)

{if(x%3==2&&x%5==4&&x%6==5&&x%7==0) break;

x+=2;

}

printf ("\nx=%d\n",x);

}

24.输入两个正整数m和n,求其最大公约数和最小公倍数。

#include

void main()

{int m,n,p,r,temp;

scanf("%d,%d",&m,&n);

if(n

{temp=n;

n=m;

m=temp;}

p=m*n;

while(m!=0)

{r=n%m; n=m; m=r;}

printf("the greatest common divisor is:%d\n",n);

printf("the lease common multiple is:%d\n",p/n);

}

25.从键盘上输入一行字符,要求将所有大写字母转换成小写字母,小写字母转换成大写字母,然后输出该字符串。

#include

void main()

{char c;

while((c=getchar())!='\n')

{if(c>='A'&&c<='Z') c=c+32;

else if(c>='a'&&c<='z')

c=c-32;

putchar(c);

}

putchar('\n');

}

26. 输出1000以内能被6整除的所有数。

#include

void main()

{ int i;

for(i=1;i<=1000;i++)

if(i%6==0) printf("%10d",i);

printf("\n");

}

27.从键盘上输入一个大于2的整数,判断它是否是素数。

#include

#include

void main()

{ int i,k,m;

scanf("%d",&m);

k=sqrt(m);

for(i=2;i<=k;i++)

if(m%i==0) break; /*m%i==0,m不是素数*/

if(i>=k+1) printf("%d is a prime number\n",m );

else printf("%d is not a prime number\n",m );

}

28.输入一个实数x和一个整数n,计算x的n次方。(n为整数)#include

void main()

{ float x,s=1;int n,i;

printf("请输入x,n:\n");

scanf("%f,%d",&x,&n);

for(i=1;i<=n;i++)

s=s*x;

printf("%.2f\n\n",s);

}

29.利用公式求前100项之积,编程计算π的值。

#include

void main()

{ float pi=1,son=0,ma=1;int i;

for(i=1;i<=10000;i++)

{ if(i%2)

son+=2;

else

ma+=2;

pi=pi*son/ma;

}

printf("pi=%f\n\n",pi*2);

}

30.通过键盘输入10个整数在一维数组中,并且把该数组中所有为偶数的数,放在另一个数组中。

#include

#define N 10

void main()

{ int a[N],b[N],i,j;

printf("请输入%d个整数:\n",N);

for(i=0,j=0;i

{ scanf("%d",&a[i]);

if(a[i]%2==0)

{b[j]=a[i];j++;}

}

printf("\n偶数数组元素:\n");

for(i=0;i

printf("b[%d]=%d\n",i,b[i]);

}

31.10个评委给参赛选手打分,求参赛选手的平均分。

#include

#define N 5

void main()

{ float a[N],aver=0;int i;

printf("请输入%d个评委的分数:\n",N);

for(i=0;i

{ scanf("%f",&a[i]);

aver=aver+a[i];

}

printf("aver=%.2f\n",aver/N);

}

32.求Fibonacci数列前40个数

#define N 40

#include

void main()

{ int i;

int f[N]={1,1};

for(i=2;i

f[i]=f[i-2]+f[i-1];

for(i=0;i

{ if(i%5==0)

printf("\n");

printf("%12d",f[i]);

}

printf("\n");

}

33.从键盘上输入10个整数,求其中的最大值和最小值。

#define SIZE 10

#include

main( )

{ int i, max,min; int n[SIZE];

printf("请输入%d个整数:\n",SIZE);

for (i=0;i

{ printf("%d: ", i+1); scanf("%d",&n[i]); }

max=min=0;

for (i=0;i

if (n[max]

else if (n[min]>n[i]) { min=i;}

printf("max: n[%d]=%d, min: n[%d]=%d\n",max,n[max],min,n[min]); }

34.将两个字符串连接起来,不使用strcat函数。

#include

void main()

{ char s1[100],s2[100];

int i=0,j=0;

printf("\n请输入第一个字符串s1=");

gets(s1);

printf("\n请输入第二个字符串s2=");

gets(s2);

while (s1[i]!='\0') i++;

while (s2[j]!='\0') s1[i++]=s2[j++];

s1[i]='\0';

printf("\n 连接后的两个字符串为: %s\n",s1);

}

35.将一个数组中的值按逆序存放。例如,原来顺序为:9,6,7,8,要求改为:8,7,6,9。

#include

#define N 6

void main()

{ int a[N],i,temp;

printf("请输入%d个整数:\n",N);

for(i=0;i

scanf("%d",&a[i]);

for(i=0;i

{temp=a[i];a[i]=a[N-1-i];a[N-1-i]=temp;}

printf("\n逆序后%d个整数:\n",N);

for(i=0;i

printf("%10d",a[i]);

printf("\n");

}

36. //c7、编程实现从键盘任意输入20个整数,统计非负数个数,并计算非负数之和。

#include

#define N 20

void main()

{ int a[N],i,count=0,sum=0;

printf("请输入%d个整数:\n",N);

for(i=0;i

{scanf("%d",&a[i]);

if(a[i]>=0)

{count++;sum+=a[i]; }

}

printf("count=%d, sum=%d\n",count,sum);

}

37.从键盘任意输入10个不相同的整数,然后,输入要查找的数x,如果在这10个数中找到x,则打印"Found!";如果找不到,则打印"Not found!"。

#include

#define N 10

void main()

{ int a[N],i,x;

printf("请输入%d个不相同的整数:\n",N);

for(i=0;i

scanf("%d",&a[i]);

printf("\n请输入要查找的x: ");

scanf("%d",&x);

for(i=0;i

if(a[i]==x)

{printf("\nFound, a[%d]=x=%d\n",i,x);break; }

if(i==N)

printf("Not found!\n");

}

38.有一个已经按从小到大排好序的数组,现输入一个数,要求按原来排序的规律将它插入到数组中。

#include

#define N 10

void main()

{ int a[N]={1,2,3,4},i,j,k,x;

for(i=N-1;i>=0;i--)

if(a[i]!=0) break;

printf("原数组:\n");

for(j=0;j<=i;j++)

printf("%d : ",a[j]);

if(i==N-1)

printf("\n数组已满,不能再插入数据!\n");

else{

printf("\n请输入要插入的数x: ");

scanf("%d",&x);

for(j=i;j>=0;j--)

if(x>a[j])

{ for(k=i;k>j;k--)

a[k+1]=a[k];

a[j+1]=x;

break;}

printf("新数组:\n");

for(j=0;j<=i+1;j++)

printf("%d : ",a[j]);

}

printf("\n");

}

39.从键盘上任意键入一个4×4阶的矩阵,求其两条对角线元素之和。#include

#define N 4

void main()

{ int a[N][N],i,j,sum=0;

for(i=0;i

for(j=0;j

scanf("%d",&a[i][j]);

for(i=0;i

sum+=a[i][i]+a[i][N-1-i];

printf("sum=%d\n",sum);

}

40.输入一个二维数组,求中最大元素值及其行列号。

#define N 3

#define M 3

#include

void main()

{ int a[N]

,i,j,row=0,colum=0;

printf("请输入%d行%d列二维数组的值:\n",N,M);

for(i=0;i

for(j=0;j

scanf("%d",&a[i][j]);

for(i=0;i

{ for(j=0;j

printf("%12d",a[i][j]); printf("\n");

}

for(i=0;i

for(j=0;j

if(a[i][j]>a[row][colum])

{ row=i; colum=j; }

printf("max=%d,row=%d,colum=%d\n",a[row][colum],row,colum);

}

《编译原理》模拟期末试题汇总 6套,含答案

《编译原理》模拟试题一 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.计算机高级语言翻译成低级语言只有解释一种方式。(×) 2.在编译中进行语法检查的目的是为了发现程序中所有错误。(×) 3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。 (√ ) 4.正则文法其产生式为 A->a , A->Bb, A,B∈VN , a 、b∈VT 。 (×) 5.每个文法都能改写为 LL(1) 文法。 (√) 6.递归下降法允许任一非终极符是直接左递归的。 (√) 7.算符优先关系表不一定存在对应的优先函数。 (×) 8.自底而上语法分析方法的主要问题是候选式的选择。 (×) 9.LR 法是自顶向下语法分析方法。 (×) 10.简单优先文法允许任意两个产生式具有相同右部。 (×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.一个编译程序中,不仅包含词法分析,_____,中间代码生成,代码优化,目标代码生成等五个部分。 A.( ) 语法分析B.( )文法分析C.( )语言分析D.( )解释分析 2.词法分析器用于识别_____。 A.( ) 字符串B.( )语句 C.( )单词 D.( )标识符 3.语法分析器则可以发现源程序中的_____。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正D.( ) 语法错误 4.下面关于解释程序的描述正确的是_____。

(1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1)C.( ) (1)(2)(3) D.( ) (2)(3) 5.解释程序处理语言时 , 大多数采用的是_____方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 6.编译过程中 , 语法分析器的任务就是_____。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4) C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 7.编译程序是一种_____。 A. ( ) 汇编程序B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序 8.文法 G 所描述的语言是_____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 9.文法分为四种类型,即0型、1型、2型、3型。其中3型文法是_____。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法 10.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 _____。 A.( ) 句子B.( ) 句型 C.( ) 单词 D.( ) 产生式 三、填空题(每空1分,共10分)

大工19春《编译原理基础》在线作业3

(判断题)1: 试探与回溯是一种穷尽一切可能的办法,效率低、代价高,它只有理论意义,在实践中价值不大。 A: 对 B: 错 正确答案: (判断题)2: 预测分析的关键问题是在扩展一个非终结符时怎样为它选择合适的产生式。A: 对 B: 错 正确答案: (判断题)3: 移进-归约分析为输入串构造分析树是从根结点开始的,朝着叶结点方向前进。A: 对 B: 错 正确答案: (判断题)4: 句型的句柄是该句型中和一个产生式左部匹配的子串。 A: 对 B: 错 正确答案: (判断题)5: 一个文法,如果能为它构造出所有条目都唯一的LR分析表,就说它是LR文法。A: 对 B: 错 正确答案: (判断题)6: 语法制导的产生式有多组语义规则。 A: 对 B: 错 正确答案: (判断题)7: 属性文法是指语义规则函数无副作用的语法制导定义。 A: 对 B: 错 正确答案: (判断题)8: 仅仅使用综合属性的语法制导定义称为S属性定义。 A: 对 B: 错 正确答案: (判断题)9: 每个结点的属性值都标注出来的分析树叫做注释分析树。 A: 对 B: 错

(判断题)10: 过程定义是一个声明,它的最简单形式是将一个名字和一个语句联系起来,该名字是过程名,而这个语句是过程体。 A: 对 B: 错 正确答案: (判断题)11: 过程名出现在调用语句中则称这个过程在该点被调用。 A: 对 B: 错 正确答案: (判断题)12: 出现在过程定义中的某些名字是特殊的,它们被称为该过程的形式参数,简称形参。 A: 对 B: 错 正确答案: (判断题)13: 一个声明起作用的程序部分称为该声明的作用域。 A: 对 B: 错 正确答案: (判断题)14: 引用某个已被回收的存储单元就称为悬空引用。 A: 对 B: 错 正确答案: (判断题)15: 后缀表示是语法树的一种线性表示。 A: 对 B: 错 正确答案: (单选题)16: 对于LR(0)分析法,语法分析栈中存放的状态是识别规范句型()的DFA状态。A: 前缀 B: 活前缀 C: LR(0)项目 D: 句柄 正确答案: (单选题)17: 同心集合并可能会产生的冲突为()。 A: 二义 B: 移进-移进

编译原理期末考试卷

2001年编译原理试题 1.(10分)处于/* 和 */之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。 2.(10分)为语言 L ={a m b n | 0 ≤ m ≤ 2n}(即a的个数不超过b的个数的两倍) 写一个LR(1)文法,不准超过6个产生式。(若超过6个产生式,不给分。若所写文法不是LR(1)文法,最多给5分。) 3.(10分)构造下面文法的LL(1)分析表。 D → TL T → int | real L → id R R → , id R | ε 4.(15分)就下面文法 S → ( L) | a L → L , S | S ?给出一个语法制导定义,它输出配对括号的个数。 ?给出一个翻译方案,它输出每个a的嵌套深度。 如句子(a, (a, a) ),第一小题的输出是2,第二小题的输出是1 2 2。 5.(10分)Pascal语言for语句的含义见教材第222页习题7.13。请为该语句设计一种合理的中间代码结构。你可以按第215页图7.17的方式或者第219页图7.19的方式写出你的设计,不需要写产生中间代码的语法制导定义。 6.(5分)一个C语言程序如下: func(i1,i2,i3) long i1,i2,i3; { long j1,j2,j3; printf("Addresses of i1,i2,i3 = %o,%o,%o\n",&i1,&i2,&i3); printf("Addresses of j1,j2,j3 = %o,%o,%o\n",&j1,&j2,&j3); } main() { long i1,i2,i3;

大工19春《编译原理基础》在线作业1

(判断题)1: 编译器是一种翻译器,它的特点是目标语言比源语言低级。 A: 对 B: 错 正确答案: (判断题)2: 语法树的子结点代表该运算的运算对象。 A: 对 B: 错 正确答案: (判断题)3: 语义分析的一个重要部分是类型检查,编译器检查每个算符的运算对象,看它们的类型是否适当。 A: 对 B: 错 正确答案: (判断题)4: 语言定义不允许运算对象的类型作隐式转换。 A: 对 B: 错 正确答案: (判断题)5: 代码生成是指取源程序的一种中间表示作为输入并把它映射到一种目标语言。A: 对 B: 错 正确答案: (判断题)6: 符号表是为每个变量名字保存一个记录的数据结构,记录的域是该名字的属性。A: 对 B: 错 正确答案: (判断题)7: 解释器可以通过翻译来生成目标程序。 A: 对 B: 错 正确答案: (判断题)8: 解释执行的效率比编译器生成的机器代码的执行效率高。 A: 对 B: 错 正确答案: (判断题)9: 类型检查是一种捕捉程序中不一致性的成熟并且有效的技术。 A: 对 B: 错

(判断题)10: 类型检查技术不能用于捕捉多种安全漏洞。 A: 对 B: 错 正确答案: (判断题)11: 词法分析器的任务是把构成源程序的字符流翻译成词法记号流。 A: 对 B: 错 正确答案: (判断题)12: 词法分析难以发现源程序的错误,因为词法分析器对源程序采取非常局部的观点。 A: 对 B: 错 正确答案: (判断题)13: 字母表上的串是该字母表符号的有穷序列。 A: 对 B: 错 正确答案: (判断题)14: 术语语言表示字母表上的一个串集,属于该语言的串称为该语言的句子或字。A: 对 B: 错 正确答案: (判断题)15: 对于连接运算而言,空串是一个恒等元素。 A: 对 B: 错 正确答案: (单选题)16: ( )不是编译程序的组成部分。 A: 词法分析程序 B: 代码生成程序 C: 设备管理程序 D: 语法分析程序 正确答案: (单选题)17: 编译的各阶段工作都涉及( )。 A: 符号表管理 B: 词法分析 C: 语法分析

编译原理模拟试题六

《编译原理》模拟试题六 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.设r和s分别是正规式,则有L(r|s)=L(r)L(s)。(×) 2.确定的自动机以及不确定的自动机都能正确地识别正规集。(√) 3.词法分析作为单独的一遍来处理较好。 (× ) 4.构造LR分析器的任务就是产生LR分析表。 (√) 5.规范归约和规范推导是互逆的两个过程。 (× ) 6.同心集的合并有可能产生新的“移进”/“归约”冲突。 (× ) 7.LR分析技术无法适用二义文法。 (× ) 8.树形表示和四元式不便于优化,而三元式和间接三元式则便于优化。 (×) 9.程序中的表达式语句在语义翻译时不需要回填技术。 (√) 10.对中间代码的优化依赖于具体的计算机。 (× ) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.编译程序绝大多数时间花在_____ 上。 A.( ) 出错处理 B.( ) 词法分析 C.( ) 目标代码生成D.( ) 表格管理 2.编译程序是对_____。 A.( ) 汇编程序的翻译 B.( ) 高级语言程序的解释执行 C.( ) 机器语言的执行D.( ) 高级语言的翻译

3.采用自上而下分析,必须_____。 A.( ) 消除左递归 B.( ) 消除右递归 C.( ) 消除回溯 D.( ) 提取公共左因子 4.在规范归约中,用_____来刻画可归约串。 A.( )直接短语B.( )句柄 C.( )最左素短语D.( )素短语 5.若a为终结符,则A->α ·aβ为_____项目。 A.( )归约B.( ) 移进C.( ) 接受D.( ) 待约 6.间接三元式表示法的优点为_____。 A.( ) 采用间接码表,便于优化处理B.( ) 节省存储空间,不便于表的修改 C.( ) 便于优化处理,节省存储空间 D.( ) 节省存储空间,不便于优化处理 7.基本块内的优化为_____。 A. ( ) 代码外提,删除归纳变量B.( ) 删除多余运算,删除无用赋 值 C.( ) 强度削弱,代码外提 D.( ) 循环展开,循环合并 8. 在目标代码生成阶段,符号表用_____。 A.( ) 目标代码生成B.( ) 语义检查 C.( ) 语法检查D.( ) 地址分配 9.若项目集Ik含有A->α·,则在状态k时,仅当面临的输入符号a∈FOLLOW(A)时,才采取“A->α ·”动作的一定是_____。

编译原理试题汇总+编译原理期末试题(8套含标准答案+大题集)

编译原理考试题及答案汇总 一、选择 1.将编译程序分成若干个“遍”是为了_B__。 A . 提高程序的执行效率 B.使程序的结构更加清晰 C. 利用有限的机器内存并提高机器的执行效率 D.利用有限的机器内存但降低了机器的执行效率 2.正规式 MI 和 M2 等价是指__C__。 A . MI 和 M2 的状态数相等 B.Ml 和 M2 的有向弧条数相等。 C .M1 和 M2 所识别的语言集相等 D. Ml 和 M2 状态数和有向弧条数相等 3.中间代码生成时所依据的是 _C_。 A.语法规则 B.词法规则 C.语义规则 D.等价变换规则 4.后缀式 ab+cd+/可用表达式__B_来表示。 A. a+b/c+d B.(a+b)/(c+d) C. a+b/(c+d) D. a+b+c/d 6.一个编译程序中,不仅包含词法分析,_A____,中间代码生成,代码优化,目标代码生成等五个部分。 A.( ) 语法分析 B.( )文法分析 C.( )语言分析 D.( )解释分析 7.词法分析器用于识别__C___。 A.( ) 字符串 B.( )语句 C.( )单词 D.( )标识符 8.语法分析器则可以发现源程序中的___D__。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正 D.( ) 语法错误 9.下面关于解释程序的描述正确的是__B___。 (1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1) C.( ) (1)(2)(3) D.( ) (2)(3) 10.解释程序处理语言时 , 大多数采用的是__B___方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 11.编译过程中 , 语法分析器的任务就是__B___。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4)C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 12.编译程序是一种___C__。 A. ( ) 汇编程序 B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序 13.文法 G 所描述的语言是_C____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 14.文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 3 型文法是___B__。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法15.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 __D___。 A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式 16.通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目标代码生成等五个部分,还应包括_C____。

编译原理期末考试习题及答案知识分享

一、填空题|(每题4分,共20分) 1. 乔母斯基定义的3型文法(线性文法)产生式形式 A→Ba|a,或A→aB|a,A,B∈Vn, a,b∈Vt 。 2.语法分析程序的输入是单词符号,其输出是语法单位。 3 型为 B → .aB 的LR(0)项目被称为移进项目,型为 B → a.B 的LR(0) 项目被称为待约项目, 4.在属性文法中文法符号的两种属性分别为继承属性和综合属性。 5、运行时存贮管理方案有静态存储分配、动态存储分配和堆式存储分配和方案。 二.已知文法 G(S) (1) E → T | E+T (2) T → F | F*F (3) F →(E)| i (1)写出句型(T*F+i)的最右推到并画出语法树。(4分) (2)写出上述句型的短语,直接短语和句柄。(4分) 答:(1)最右推到(2分) E ==> T ==> F ==> (E) ==> (E+T) ==> (E+F) ==> (E+i) ==> (T+i) ==> (T*F+i) (2) 语法树(2分) (3)(4分) 短语:(T*F+i),T*F+i ,T*F , i 直接短语:T*F , i 句柄:T*F 三. 证明文法G(S) :S → SaS |ε是二义的。(6分) 答:句子aaa对应的两颗语法树为: 因此,文法是二义文法

四.给定正规文法G(S): (1) S → Sa | Ab |b (2) A → Sa 请构造与之等价的DFA。(6分) 答:对应的NFA为:(6分) 状态转换表: a b {F} Φ{S} {S} {S,A} Φ {S,A} {S,A} {S} 五. 构造识别正规语言b*a(bb*a)*b* 最小的DFA(要求写出求解过程)。(15分)答:(1)对应的NFA(5分) a b {0} {1,3} {0} {1,3} Φ{2,3} {2,3} {1,3} {2,3} (5分) 六. 已知文法G(S) : (1) S → ^ | a | (T) (2) T → T,S | S 试:(1)消除文法的左递归;(4分) (2)构造相应的first 和 follow 集合。(6分) 答:(1)消除文法的左递归后文法 G’(S)为: (1) S → ^ | a | (T) (2) T → ST’ | S (3) T’→ ,ST’ |ε(4分)

编译原理基本概念

1.编译程序 编译程序是一种翻译程序,它将高级语言所写的源程序翻译成等价的机器语言或汇编语言的目标程序。 2.词法分析(Lexical analysis或Scanning)和词法分析程序(Lexical analyzer 或Scanner) 词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用lex等工具自动生成。 3.语法分析(Syntax analysis或Parsing)和语法分析程序(Parser) 语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述. 4.语义分析(Syntax analysis)及中间代码生成 语义分析是编译过程的一个逻辑阶段. 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查, 进行类型审查.例如一个C程序片断: int arr[2],b; b = arr * 10; 源程序的结构是正确的. 语义分析将审查类型并报告错误:不能在表达式中使用一个数组变量,赋值语句的右端和左端的类型不匹配.语义分析时,根据语句的含义,可对它进行翻译,用另一种语言形式(比源语言更接近于目标语言的一种中间代码或直接用目标语言)来描述这种语义。 5.代码优化 代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效的,即省时间和空间的代码。 6.目标代码生成 目标代码的生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。 7.遍 8.前端(Front-end)和后端(Back end) 有时,常常把编译的过程分为前端(front end)和后端(back end),前端由那样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常这些阶段包括词法分析、语法分析、语义分析和中间代码生成,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理工作。后端工作指那

编译原理试题汇总

一、选择题(每个选择题 2 分,共 20 分) 1 .文法 G 产生的⑴ 的全体是该文法描述的语言。 A .句型 B. 终结符集 C. 非终结符集 D. 句子 2 .若文法 G 定义的语言是无限集,则文法必然是⑵ : A .递归的 B 前后文无关的 C 二义性的 D 无二义性的 3 . Chomsky 定义的四种形式语言文法中, 0 型文法又称为⑶ 文法; 1 型文法又称为⑷ 文法; 2 型语言可由⑸ 识别。 A .短语结构文法 B 前后文无关文法 C 前后文有关文法 D 正规文法 E 图灵机 F 有限自动机 G 下推自动机 4 .一个文法所描述的语言是⑹ ;描述一个语言的文法是⑺ 。 A .唯一的 B 不唯一的 C 可能唯一,好可能不唯一 5 .数组的内情向量中肯定不含有数组的⑻ 的信息 A.维数 B.类型 C.维上下界 D.各维的界差 6 .在下述的编译方法中,自底向上的方法有⑼ ,自顶向下的分析方法有⑽ 。 ①简单优先分析②算符优先分析③递归下降分析④预测分析技术⑤LR(K)分析 ⑥ SLR(k)分析⑦ LL(k)分析⑧LALR(K)分析 A.③④⑦ B. ③④⑧ C.①②⑧ D.③④⑤⑥⑦ E.①②⑤⑥⑦ F. ①②⑤⑥⑧ 二、简答题(每小题 5 分,共 20 分) 1 . LL ( 1 )分析法对文法有哪些要求? 2 .常见的存储分配策略有几种?它们都适合于什么性质的语言? 3 .常见循环优化都有哪些项目? 4 .什么是活动记录?它主要由哪些内容构成? 五、( 12 分)已给文法 G[S] :S → SaP | Sf | P P → qbP | q 将 G[S] 改造成 LL ( 1 )文法,并给出 LL ( 1 )分析表。 七、( 8 分)将下面的条件语句表示成逆波兰式和四元式序列: if a>b then x:=a+b*c else x:=b-a; 八、( 8 分)给定基本块: A:=3*5 B:=E+F C:=A+12 D:=E+F A:=D+12 C:=C+1 E:=E+F 假定出基本块后,只有 A 、 C 、 E 是活跃的,给出用 DAG 图完成优化后的代码序列。参考答案: 一、⑴ D ⑵ A ⑶ A ⑷ C ⑸ G. ⑹ A ⑺ B ⑻ A ⑼ F ⑽ A 二、 1 .对于 G 中的每个产生式A →γ 1 | γ 2 | … | γ m ,其各候选式均应满足:(1)不同的候选式不能推出以同一终结符号打头的符号串,即 FIRST( γ i ) ∩ FIRST( γ j )= φ(1 ≤ i ,j ≤ m ;i ≠ j )

编译原理考试试题1

编译原理 一、(5×6分)回答下列问题: 1.什么是S-属性文法?什么是L-属性文法?它们之间有什么关系? 2.什么是句柄?什么是素短语? 3.划分程序的基本块时,确定基本块的入口语句的条件是什么? 4.运行时的DISPLAY 表的内容是什么?它的作用是什么? 5.对下列四元式序列生成目标代码: A:=B*C D:=E+F G:=A+D H:=G*2 其中,H 是基本块出口的活跃变量, R0和R1是可用寄存器 二、(8分)设∑={0,1}上的正规集S 由倒数第二个字符为1的所有字符串组成,请给出该字集对应的正规式,并构造一个识别该正规集的DFA 。 三、(6分)写一个文法使其语言为L(G)={ a n b m a m b n | m,n ≥1}。 四、(8分)对于文法G(E): E →T|E+T T →F|T* F F →(E)|i 1. 写出句型(T*F+i)的最右推导并画出语法树。 2. 写出上述句型的短语,直接短语、句柄和素短语。 五、(12分)设文法G(S): ( |*)B B |B A A A |SiA S A →+→→ 1.构造各非终结符的FIRSTVT 和LASTVT 集合; 2.构造优先关系表和优先函数。 六、(9分)设某语言的do-while 语句的语法形式为 S → do S (1) While E 其语义解释为: 真 假 S (1)的代码 E 的代码

针对自下而上的语法分析器,按如下要求构造该语句的翻译模式: (1) 写出适合语法制导翻译的产生式; (2) 写出每个产生式对应的语义动作。 七、(8分)将语句if (A0) then while C>0 do C:=C+D; 翻译成四元式。 八、(10分) 设有基本块如下: T1:=S+R T2:= 3 T3:= 12/T2 T4:=S/R A:=T1-T4 T5:=S+R B:=T5 T6:=T5*T3 B:=T6 (1)画出DAG图; (2)设A,B是出基本块后的活跃变量,请给出优化后的四元式序列。 九、(9分) 设已构造出文法G(S): (1) S → BB (2) B → aB (3) B→ b 的LR分析表如下 ACTION GOTO 状态 a b # S B 0 s3 s4 1 2 1 acc 2 s6 s7 5 3 s3 s 4 8 4 r3 r3 5 r1 6 s6 s 7 9 7 r3 8 r2 r2 9 r2 假定输入串为abab,请给出LR分析过程(即按照步骤给出状态,符号,输入串的变化过程)。

编译原理知识点

编译原理: 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象。 基本概念: 编译原理即是对高级程序语言进行翻译的一门科学技术, 我们都知道计算机程序由程序语言编写而成, 在早期计算机程序语言发展较为缓慢, 因为计算机存储的数据和执行的程序都是由0、1代码组合而成的, 那么在早期程序员编写计算机程序时必须十分了解计算机的底层指令代码通过将这些微程序指令组合排列从而完成一个特定功能的程序, 这就对程序员的要求非常高了。人们一直在研究如何如何高效的开发计算机程序, 使编程的门槛降低。 编译器: C语言编译器是一种现代化的设备, 其需要借助计算机编译程序, C语言编译器的设计是一项专业性比较强的工作, 设计人员需要考虑计算机程序繁琐的设计流程, 还要考虑计算机用户的需求。计算机的种类在不断增加, 所以, 在对C语言编译器进行设计时, 一定要增加其适用性。C语言具有较强的处理能力, 其属于结构化语言, 而且在

计算机系统维护中应用比较多, C语言具有高效率的优点, 在其不同类型的计算机中应用比较多。 C语言编译器前端设计 编译过程一般是在计算机系统中实现的, 是将源代码转化为计算机通用语言的过程。编译器中包含入口点的地址、名称以及机器代码。编译器是计算机程序中应用比较多的工具, 在对编译器进行前端设计时, 一定要充分考虑影响因素, 还要对词法、语法、语义进行分析。 1 词法分析 词法分析是编译器前端设计的基础阶段, 在这一阶段, 编译器会根据设定的语法规则, 对源程序进行标记, 在标记的过程中, 每一处记号都代表着一类单词, 在做记号的过程中, 主要有标识符、关键字、特殊符号等类型, 编译器中包含词法分析器、输入源程序、输出识别记号符, 利用这些功能可以将字号转化为熟悉的单词。 2 语法分析 语法分析是指利用设定的语法规则, 对记号中的结构进行标识, 这包括句子、短语等方式, 在标识的过程中, 可以形成特殊的结构语法树。语法分析对编译器功能的发挥有着重要影响, 在设计的过程中, 一定要保证标识的准确性。 3 语义分析 语义分析也需要借助语法规则, 在对语法单元的静态语义进行检查时, 要保证语法规则设定的准确性。在对词法或者语法进行转化

编译原理模拟试卷及答案

模拟试题二 发表日期:2009年6月5日编辑:admin 阅读数:240 一、是非题(下列各题,你认为正确的,请在题干的括号内打“√”,错的打“×”。每题1分,共5分) 1、算符优先关系表不一定存在对应的优先函数。 2、数组元素的地址计算与数组的存储方式有关。 3、仅考虑一个基本块,不能确定一个赋值是否真是无用的。 4、每个文法都能改写为LL(1)文法。 5、对于数据空间的存贮分配,FORTRAN采用动态贮存分配策略。 二、填空题(每题2分,共20分) 1、从功能上说,程序语言的语句大体可分为_______语句和______语句两大类。 2、扫描器的任务是从________中识别出一个个_______。 3、所谓最右推导是指:_______。 4、语法分析最常用的两类方法是________和_________分析法。 5、一个上下文无关文法所含四个组成部分是_______________。 6、所谓语法制导翻译方法是_____________________。 7、符号表中的信息栏中登记了每个名字的有关的性质,如_________等等。 8、一个过程相应的DISPLAY表的内容为________。 9、常用的两种动态存贮分配办法是_____动态分配和_____动态分配。 10、产生式是用于定义_____的一种书写规则。 三、名词解释(每题2分,共10分) 1、遍 2、无环路有向图(DAG) 3、语法分析

4、短语 5、后缀式 四、简述题(每题4分,共24分) 1、考虑下面程序 ………… Var a:integer; Procedure S(X); Var X:integer; Begin a:=a+1; X:=a+X End; Begin a:=5; S(a); Print(a) End. 试问:若参数传递方式分别采取传名和传值时,程序执行后输出a的值是什么? 2、画出Pascal中实数(不带正负号,可带指数部分)的状态转换图。 3、写出表达式(a+b*c)/(a+b)-d的逆波兰表示及三元式序列。 4、已知文法G(S) S→a|∧|(T)

编译原理模拟题

《编译原理》模拟题(补) 一.单项选择题 1.()是两类程序语言处理程序。 A. 高级语言程序和低级语言程序 B. 解释程序和编译程序 C. 编译程序和操作系统 D. 系统程序和应用程序 2. 编译程序前三个阶段完成的工作是()。 A. 词法分析、语法分析和代码优化 B. 代码生成、代码优化和词法分析 C. 词法分析、语法分析、语义分析和中间代码生成 D. 词法分析、语法分析和代码优化 3. 一个上下文无关文法G包括四个组成部分:一组终结符,一组非终结符,一个开始符号,以及一组()。 A. 字符串 B. 产生式 C. 非开始符号 D. 文法 4. 词法分析器的输出结果是()。 A. 单词的种别编码 B. 单词在符号表中的位置 C. 单词的种别编码和自身值 D. 单词自身值 5. 一个句型中称为句柄的是该句型的最左()。 A. 非终结符号 B. 短语 C. 句子 D. 直接短语 6. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于()分析方法。 A. 自左向右 B. 自顶向下 C. 自底向上 D. 自右向左 7. 在通常的语法分析方法中,()特别适用于表达式的分析。 A. 算符优先分析法 B. LR分析法 C. 递归下降分析法 D. LL(1)分析法 8. 优化可生成_____的目标代码。 A. 运行时间较短 B. 占用存储空间较小 C. 运行时间短但占用内存空间大 D. 运行时间短且占用存储空间小 9.()是两类程序语言处理程序。 A. 系统程序和应用程序 B.编译程序和操作系统 C. 解释程序和编译程序 D.高级语言程序和低级语言程序 10. 经过编译所得到的目标程序是()。 A. 四元式序列 B. 间接三元式序列

编译原理试题B及答案

编译原理试题B 得分一、单项选择题(每题1分,共20分) 1、对编译系统有关概念描述正确的是( B) A.目标程序只能是机器语言 B. 编译程序处理的对象是源语言 C.解释程序属于编译程序 D. 词法分析无法自动进行 2. 设有表达式a*b-c,将其中a*b识别为表达式的编译阶段是什么 (B) A.词法分析 B. 语法分析 C.语义分析 D. 代码生成 3. 下面不能用于对文法进行描述的是(A ) A.源语言 B. EBNF C.BNF D. 语法图 4. 设有文法G[S]: S→0S|1A|0,A→1|1S|0B,B→1A|0B,下列符号串中是该文法的句子的是 ()? A.1010001001101 B.0101001110010010 C.1101010011110111 D.1010011101101010 (可画出DFA验证) 5. 文法G[S]: S→aA|bC|a A→aS|bB B→aC|bA|b C→aB|bS ,则不是L(G)句子的是( B )100501001000500aba B. a.a babbA5006021004010aa aaba D. aabC.abb (画出DFA) 6. 哪个不是DFA的构成成分(B) A.有穷字母表 B. 初始状态集合 C.终止状态集合 D. 有限状态集合 7.词法分析器的输入是( B ) A.单词符号串 B.源程序 C.语法单位 D.目标程序 8.在词法分析阶段不能识别的是(C ) A.标识符 B. 运算符 C.四元式 D. 常数

9.设有一段C语言程序while(i&&++j)

{ c=2.19; j+=k; i++;经过词法分析后可以识别的单词个数是(B )} ,.19 B.20 C.21 D.23A ( B )10.自上而下语法分析的主要动作是 C.规约 D. 匹配A.移进 B. 推导 ( D )分析器的自称部分是11.下面不属于LL(1) 总控程序 B. LL(1)分析表A.LL(1).分析栈 D.源程序串C 设有文法G[S]为12.→aS|c,C→AD|b,DBS→AB|bC, A→ε|b,→ε|aD A )则FOLLOW(A)为(.{a,#} D.{#}A.{a,c,#} B.{c,#} C G[S]: 13.设有文法)FIRST(Ap)为( C Ap|Bq→,A→a|cA,B→b|dB ,则S 其他.{p,q} B. {b,d} C.{a,c} D. A )自下而上语法分析的主要分析动作是(D 14. D. 移进-规约A.推导 B. 规约 C.匹配 ( C ) 15.算法优先分析中,可规约串是 .最左素短语 D.素短语A.句柄 B.活前缀 C )( B →SaS|ε},S}16. 设有文法,该文法是.二义性文法 B 文法A.LL(1)C.SLR(1)文法 D.算法优先文法 17、中间代码生成时所以据的是(C ) A.语法规则 B.词法规则 C.语义规则 D.等价变换规则 18、给定文法G: E→E+T|T,T→T*F|F,F→i|(E) 则L(G)中的一个句子i+i+(i*i)*i的逆波兰表示为( C ) A.iii*i++ B.ii+iii**+ C.ii+ii*i*+ D.其他 19.在编译程序中与生成中间代码的目的无关的是(B ) A.便于目标代码优化 B.便于存储空间的组织 C.便于目标代码的移植 D.便于编译程序的移植 20.中间代码是介于源语言程序和什么之间的一种代码( D) A.源代码 B. 机器语言 C. 汇编语言 D. 目标代码 得分二.简答(每题3分,共12分) 1. 什么是解释程序? 解释程序也是一种翻译程序,它将源程序作为输入并执行之,即边解释边执行。 2. 词法分析器的主要任务是什么? 词法分析器的主要任务是逐步扫描和分解构成源程序的字符串,识别出一个一个的单词符号。 3.文法有哪几部分组成?

编译原理试题及答案(期末复习版).pdf

<编译原理>历年试题及答案 一.(每项选择 2 分,共 20 分)选择题 1.将 编译程序分成若干个“遍”是为了_b__。 a.提 高程序的执行效率 b.使程序的结构更加清晰 c. 利用有限的机器内存并提高机器的执行效率 d. 利用有限的机器内存但降低了机器的执行效率 2.构造编译程序应掌握__d__。 a.源程序 b.目标语言 c.编译方 法 d.以上三项都是 3.变量应 当 c_。 a.持有左值 b.持有右值 c.既持有左值又持有右值 d.既不持 有左值也不持有右值 4.编译程序绝大多数时间花在 _d___上。 a.出错处理 b.词法分析 c.目标代码 生成 d.管理表格 5.词法分析器的输 出结果是_c___。 a.单词的种别编码 b.单词在符号表中的位置 c.单词 的种别编码和自身值 d.单词自身值 6.正规式 MI 和 M2 等价是指__c__。 a. MI 和 M2 的状态数相等 b.Ml 和 M2 的有向弧条数相等。 C.M1 和 M2 所识别的语言集相等 d. Ml 和 M2 状态数和有向弧条数相等7.中间代码生成时所依据的是—c。 a.语法规则 b.词法规则c.语义规则 d.等价变换规则 8.后缀式 ab+cd+/可用表达式__b_来表示。 a. a+b/c+d b. (a+b)/(c+d) c. a+b/(c+d) d. a+b+c/d 9.程序所需 的数据空间在程序运行前就可确定,称为____c__管理技术。 a.动态存储 b.栈式存储 c.静态存储 d.堆式存储 10.堆式 动态分配申请和释放存储空间遵守___d_____原则。 a.先请先放 b.先请后放 c.后请先放 d.任意 二(每小题 10 分,共 80 分)简答题 1.画出编译程序的 总体结构图,简述各部分的主要功能。 2. 已知文法 G[E]: E→ET+|T T→TF* | F F→F^ | a 试证:FF^^*是文法的句型,指出该句型的短语、简单短语和句柄.

编译原理模拟试卷答案

模拟试卷答案 模拟试卷A 一、 二、 int real id , $ D D →TL D →TL T T →int T →real L L →id R R R →, id R R → ε 三、 (1)状态转换图如下: (2)合并同心项目集(I 4和I 11,I 5和I 12,I 7和I 13,I 8和I 10)后没有动作冲突。 *

四、语法制导的定义如下: S → E print(S.loop); E →while E1do E2 E.loop := max(E1.loop, E2.loop) +1; E →id := E E.loop := E1.loop; E → E1 + E2 E.loop := max(E1.loop, E2.loop); E →id E.loop := 0; E → (E1) E.loop := E1.loop; 五、程序流图 (1)计算各基本块的到达-定值集IN[B]。公式为: IN[B] = ∪ OUT[P] P∈P[B] OUT[B] = GEN[B] ∪ ( IN[B] - KILL[B] ) 基本块GEN[B] 位向量KILL[B] 位向量B1{ d1, d2 } 11000000 { d3, d4, d6 } 00110100 B2{ d3, d4 } 00110000 { d1, d2, d6 } 11000100 B3{ d6 } 00000100 { d1, d4 } 10010000 B4{ } 00000000 { } 00000000

(2)求各基本块中各变量引用点的ud 链: 假设在程序中某点u 引用了变量a ,则把能到达u 的a 的所有定值点,称为a 在引用点u 的引用-定值链(简称ud 链)。可以利用到达-定值信息来计算各个变量在任何引用点的ud 链。 由图9.6(1)的程序流图可知,I 的引用点是d3、d5和d6,J 的引用点是d3和d8。 B2中I 和J 的引用点d3前面没有对I 和J 的定值点,其ud 链在IN[B2]={ d1, d2, d3, d6 }中,所以I 在引用点d3的ud 链是{ d1, d6 };J 在引用点d3的ud 链是{ d2, d3 }。 在B2中I 的引用点d5前面有I 的定值点d4,且在d4定值后到达d5,所以I 在引用点d5的ud 链是{ d4 }。 B3中I 的引用点d6前面没有I 的定值点,其ud 链是IN[B3]中I 的所有定值点,所以是{ d4 }。 B4中J 的引用点d8前面没有对J 的定值点,其ud 链是IN[B4]中J 的所有定值点。已知IN[B4] = { d3, d4 },所以,J 的引用点d8的ud 链是{ d3 }。 模拟试卷B 一、该正规式描述的语言是,所有不含子串001的0和1的串。 二、 (1)先给出接受该文法活前缀的DFA 如下:

编译原理考试试卷

一、填空题(每空 2 分,共 30 分) 1、编译程序的整个过程可以从逻辑上划分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等几个阶段,另外还有两个重要的工 作是表格管理和出错处理 2、规范规约中的可归约串是句柄,算符优先分析中的可归约串是最左素短语。 3、语法分析方法主要可分为自顶向下和自底向上两大类。 4、 LR ( 0)文法的项目集中不会出现移进 -归约冲突和归约 -归约冲突。 5、数据空间的动存态储分配方式可分为栈式和堆式两种。 6、编译程序是指能将源语言程序翻译成目标语言程序的程序。 7、确定有穷自动机DFA 是NFA的一个特例。 8、表达式 (a+b)*c的逆波兰表示为ab+c*。 二、选择题(每题 2 分,共 20 分) 1、 L R 语法分析栈中存放的状态是识别B的 DFA 状态。 A 、前缀B、可归前缀C、项目 D 、句柄 2、D不可能是目标代码。 A 、汇编指令代码 B 、可重定位指令代码 C、绝对机器指令代码 D 、中间代码 3、一个控制流程图就是具有C的有向图 A 、唯一入口结点B、唯一出口结点C、唯一首结点 D 、唯一尾结点 4、设有文法G[S] : S→ b|bB B → bS ,则该文法所描述的语言是C。 A 、 L ( G)={b i|i≥ 0}B、 L (G) ={b 2i |i≥0} C、 L ( G)={b 2i+1|i≥ 0} D 、 L ( G)={b 2i+1|i ≥1} 5、把汇编语言程序翻译成机器可执行的目标程序的工作是由 B完成的。 A 、编译器 B 、汇编器C、解释器D、预处理器6、在目标代码生成阶段,符号表用于D。 A 、目标代码生成 B 、语义检查C、语法检查D、预处理器地址分配0 7、规范归约是指B。 A 、最左推导的逆过程 B 、最右推导的逆过程C、规范推导D、最左归约逆过程 8、使用A可以定义一个程序的意义。 A 、语义规则B、词法规则C、语法规则D、左结合规则 9、经过编译所得到的目标程序是D。 A 、三元式序列B、四元式序列C、间接三元式 D 、机器语言程序或汇编语言程序 10、在一个基本块内进行的代码优化是B。 A 、全局优化B、局部优化C、循环优化D、代码外提 三、简答题( 3 小题,共 30 分) 1、已知文法G[S]:S→Ac|aB A→ ab B→ bc 证明该文法具有二义性(本题 6 分) 证明:因为该文法的句型abc 存在如下两棵语法树: 所以,该文法具有二义性 一、填空题(每空 1分,共 20分) 1.编译过程一般分为、、中间代码生成、 和目标代码生成五个阶段。 2.语法分析最常用的两类方法是和分析法。 3.确定的有穷自动机是一个,通常表示为。

相关文档
最新文档