当前位置:文档之家› gcc编译20例

gcc编译20例

gcc编译20例
gcc编译20例

5-1 厘米换算英尺英寸 (15分)

如果已知英制长度的英尺footfoot和英寸inchinch的值,那么对应的米是(foot+inch/12)\times 0.3048(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:

输入在一行中给出1个正整数,单位是厘米。

输出格式:

在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:

170

输出样例:

5 6

程序代码:

#include

#include

int main()

{

int f,i;

float m,cm;

scanf("%f",&cm);

m=cm/100;

f=m/0.3048;

i=(m/0.3048-f)*12;

printf("%d %d",f,i);

return 0;

}

5-2 然后是几点 (15分)

有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。

输入格式:

输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示

为530;流逝的分钟数可能超过60,也可能是负数。

输出格式:

输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310

程序代码:

#include

#include

int main()

{

int t,c,a,b,a1,b1,b2;

scanf("%d %d",&t,&c);

a1=t/100;

b1=t%100;

b2=a1*60+b1;

b=b2+c;

a=b/60;

b=b%60;

printf("%d",a*100+b);

return 0;

}

5-3 逆序的三位数 (10分)

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:

每个测试是一个3位的正整数。

输出格式:

输出按位逆序的数。

输入样例:

123

输出样例:

321

程序代码:

#include

#include

int main()

{

int x,a,b,c;

scanf("%d",&x);

a=x/100;

b=x/10-a*10;

c=x-a*100-b*10;

x=c*100+b*10+a;

printf("%d",x);

return 0;

}

5-4 BCD解密 (10分)

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:

输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:

输出对应的十进制数。

输入样例:

18

输出样例:

12

程序代码:

#include

#include

int main(){

int a,b,n;

scanf("%d",&n);

a=n/16;

b=n%16;

printf("%d",a*10+b);

return 0;

}

5-5 表格输出 (5分)

本题要求编写程序,按照规定格式输出表格。

输入格式:

本题目没有输入。

输出格式:

要求严格按照给出的格式输出下列表格:

------------------------------------

Province Area(km2) Pop.(10K)

------------------------------------

Anhui 139600.00 6461.00

Beijing 16410.54 1180.70

Chongqing 82400.00 3144.23

Shanghai 6340.50 1360.26

Zhejiang 101800.00 4894.00

------------------------------------

程序代码:

#include

#include

int main()

{

printf("------------------------------------\nProvince Area(km2) Pop.(10K)\n------------------------------------\nAnhui 139600.00 6461.00\nBeijing 16410.54 1180.70\nChongqing 82400.00 3144.23\nShanghai 6340.50 1360.26\nZhejiang 101800.00 4894.00\n------------------------------------\n");

return 0;

}

5-6 混合类型数据格式化输入 (5分)

本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:

输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:

在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:

2.12 88 c 4.7

输出样例:

c 88 2.12 4.70

程序代码:

#include

#include

int main()

{

int a;

char b;

float c1,c2;

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

printf("%c %d %.2f %.2f",b,a,c1,c2);

return 0;

}

5-7 12-24小时制 (15分)

编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。

输入格式:

输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。

提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。

输出格式:

在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。

输入样例:

21:11

输出样例:

9:11 PM

程序代码:

#include

#include

int main()

{

int a,b;

char c;

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

if(a>12)

{a=a-12;

printf("%d%c%d PM",a,c,b);}

else if(a==12)

printf("%d%c%d PM",a,c,b);

else

printf("%d%c%d AM",a,c,b);

return 0;

}

5-8 超速判断 (10分)

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。

输入格式:

输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。

输出格式:

在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、

或者是OK。

输入样例1:

40

输出样例1:

Speed: 40 - OK

输入样例2:

75

输出样例2:

Speed: 75 - Speeding

程序代码:

#include

#include

int main()

{

int a;

scanf("%d",&a);

if(a>60)

printf("Speed: %d - Speeding",a);

else

printf("Speed: %d - OK",a);

return 0;

}

5-9 用天平找小球 (10分)

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式:

输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式:

在一行中输出唯一的那个不一样的球。

输入样例:

1 1 2

输出样例:

C

程序代码:

#include

#include

int main()

{

int a,b,c;

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

if(a==b)

printf("C");

else if(a==c)

printf("B");

else

printf("A");

return 0;

}

5-10 计算工资 (15分)

某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。输入格式:

输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。输出格式:

在一行输出该员工的周薪,精确到小数点后2位。

输入样例1:

5 40

输出样例1:

2000.00

输入样例2:

3 50

输出样例2:

1650.00

程序代码:

#include

#include

int main()

{

int a,b;

float $;

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

if(a<5)

{if(b<40)$=30*b;

else $=30*b+15*(b-40);}

else

{if(b<40)$=50*b;

else $=50*b+25*(b-40);

}

printf("%.2f",$);

return 0;

}

5-11 分段计算居民水费 (10分)

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费yy(元)与月用水量xx(吨)相关:当xx不超过15吨时,y=4x/3y=4x/3;超过后,y=2.5x-17.5y=2.5x ?17.5。请编写程序实现水费的计算。

输入格式:

输入在一行中给出非负实数xx。

输出格式:

在一行输出应交的水费,精确到小数点后2位。

输入样例1:

12

输出样例1:

16.00

输入样例2:

16

输出样例2:

22.50

程序代码:

#include

#include

int main()

{

float x,y;

scanf("%f",&x);

if(x<15)

y=4*x/3;

else

y=2.5*x-17.5;

printf("%.2f",y);

return 0;

}

5-12 两个数的简单计算器 (10分)

本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。

输入格式:

输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。

输出格式:

当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。

输入样例1:

-7 / 2

输出样例1:

-3

输入样例2:

3 & 6

输出样例2:

ERROR

程序代码:

#include

#include

int main()

{

int x,y,z;

char a;

scanf("%d %c %d",&x,&a,&y);

if (a=='+')

z=x+y;

else if(a=='-')

z=x-y;

else if(a=='*')

z=x*y;

else if(a=='/')

z=x/y;

else if(a=='%')

z=x%y;

else { printf("ERROR");exit(0);}

printf("%d",z);

return 0;

}

5-13 日K蜡烛图 (15分)

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K 线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。如果Close<>Open,表示为“R-Hollow”(即“空心红蜡烛”);如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。

输入格式:

输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。输出格式:

在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow。

输入样例1:

5.110 5.250 5.100 5.105

输出样例1:

BW-Solid with Lower Shadow and Upper Shadow

输入样例2:

5.110 5.110 5.110 5.110

输出样例2:

输入样例3:

5.110 5.125 5.112 5.126

输出样例3:

R-Hollow

程序代码:

#include

#include

int main(){

float Open,High,Low,Close;

scanf("%f %f %f %f",&Open,&High,&Low,&Close);

if(Close

printf("BW-Solid");

else if(Close>Open)

printf("R-Hollow");

else

printf("R-Cross");

if(LowOpen&&High>Close)

printf(" with Lower Shadow and Upper Shadow");

else if(Low

printf(" with Lower Shadow");

else if(High>Open&&High>Close)

printf(" with Upper Shadow");

return 0;

}

5-14 求整数段和 (15分)

给定两个整数AA和BB,输出从AA到BB的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数AA和BB,其中-100\le A\le B\le 100?100≤A≤B≤100,其间以空格分隔。

输出格式:

首先顺序输出从AA到BB的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。

输入样例:

-3 8

-3 -2 -1 0 1

2 3 4 5 6

7 8

Sum = 30

程序代码:

#include

#include

int main()

{

int a,b,sum,i;

sum=0;

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

for (i=0;a<=b;a++)

{

printf("%5d",a);

sum=sum+a;

i++;

if(i%5==0)

printf("\n");

}

if(i%5!=0) printf("\n");

printf("Sum = %d",sum);

return 0;

}

5-15 计算圆周率 (15分)

根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。

\frac{\pi}{2} = 1+\frac{1}{3} + \frac{2!}{3\times 5}+ \frac{3!}{3\times 5\times 7}+\cdots + \frac{n!}{3\times 5\times 7\times \cdots \times (2n+1)}+\cdots2π=1+3 1+3×52!+3×5×73!+?+3×5×7×?×(2n+1)n!+?

输入格式:

输入在一行中给出小于1的阈值。

输出格式:

在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

0.01

输出样例:

3.132157

程序代码:

#include

#include

int main()

{

int a,b,j;

float sum,n,m,i,s,l;

sum=1,n=1;

scanf("%f",&i);

for (b=1,a=1;n>=i;b=b+2,a++)

{

for (j=1,s=1;j<=a;j++)

{

s=s*j;

}

for (j=1,l=1;j<=b+2;j=j+2)

{

l=l*j;

}

n=s/l;

sum=sum+n;

}

m=2*sum;

printf("%.6f",m);

return 0;

}

5-16 求符合给定条件的整数集 (15分)

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:

输入在一行中给出A。

输出格式:

输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

输入样例:

2

输出样例:

234 235 243 245 253 254

324 325 342 345 352 354

423 425 432 435 452 453

523 524 532 534 542 543

程序代码:

#include

#include

int main()

{

int a;

scanf("%d",&a);

int m[4] ;

int count = 0;

int i = 0;

int j = 0;

int k = 0;

for(i=0;i<4;i++){

m[i] = a+i;

}

for(i=0;i<4;i++){

for(j=0;j<4;j++){

for(k=0;k<4;k++){

if(k!=i&&k!=j&&i!=j){

printf("%d",m[i]*100+m[j]*10+m[k]);

count++;

if(count % 6 == 0){

printf("\n");

}else{

printf("");

}

}

}

}

}

}

5-17 爬动的蠕虫 (15分)

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:

输入在一行中顺序给出3个正整数N、U、D,其中D<

输出格式:

在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:

12 3 1

输出样例:

11

程序代码:

#include

#include

int main()

{

int N,U,D,L;

scanf("%d %d %d",&N,&U,&D);

int time;

time=L=0;

while(L

time++;

L=L+U;

if(L>=N)

break;

L=L-D;

time++;

}

printf("%d",time);

return 0;

}

5-18 二分法求多项式单根 (20分)

二分法求函数根的原理为:如果连续函数f(x)f(x)在区间[a, b][a,b]的两个端点取值异号,即f(a)f(b)<0f(a)f(b)<0,则它在这个区间内至少存在1个根rr,即f(r)=0f(r)=0。

二分法的步骤为:

检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2(a+b)/2;否则

如果f(a)f(b)<0f(a)f(b)<0,则计算中点的值f((a+b)/2)f((a+b)/2);

如果f((a+b)/2)f((a+b)/2)正好为0,则(a+b)/2(a+b)/2就是要求的根;否则

如果f((a+b)/2)f((a+b)/2)与f(a)f(a)同号,则说明根在区间[(a+b)/2, b][(a+b)/2,b],令a=(a+b)/2a=(a+b)/2,重复循环;

如果f((a+b)/2)f((a+b)/2)与f(b)f(b)同号,则说明根在区间[a, (a+b)/2][a,(a+b)/2],令b=(a+b)/2b=(a+b)/2,重复循环。

本题目要求编写程序,计算给定3阶多项式f(x)=a_3 x^3 +a_2 x^2 +a_1 x+a_0f(x)=a3x 3+a2x2+a1x+a0在给定区间[a, b][a,b]内的根。

输入格式:

输入在第1行中顺序给出多项式的4个系数a_3a3、a_2a2、a_1a1、a_0a0,在第2行中顺序给出区间端点aa和bb。题目保证多项式在给定区间内存在唯一单根。

输出格式:

在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:

3 -1 -3 1

-0.5 0.5

输出样例:

0.33

程序代码:

#include

#include

int main()

{

double a,b,a0,a1,a2,a3;

double t=0.001, m,f1,f2,n;

scanf("%lf%lf%lf%lf",&a3,&a2,&a1,&a0);

scanf("%lf%lf",&a,&b);

f1=a3*a*a*a+a2*a*a+a1*a+a0;

f2=a3*b*b*b+a2*b*b+a1*b+a0;

while(b-a>t)

{m=(a+b)/2;

f1=a3*a*a*a+a2*a*a+a1*a+a0;

f2=a3*b*b*b+a2*b*b+a1*b+a0;

n=a3*m*m*m+a2*m*m+a1*m+a0;

if(n==0)

{ printf("%0.2f",m);

return 0;

}

else if((n>0 && f1>0) || (n<0 && f1<0))

a=m;

else

b=m;

}

printf("%0.2f",(a+b)/2);

return 0;

}

5-19 支票面额 (15分)

一个采购员去银行兑换一张yy元ff分的支票,结果出纳员错给了ff元yy分。采购员用去了nn分之后才发觉有错,于是清点了余额尚有2y2y元2f2f分,问该支票面额是多少?输入格式:

输入在一行中给出小于100的正整数nn。

输出格式:

在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。

输入样例1:

23

输出样例1:

25.51

输入样例2:

22

输出样例2:

No Solution

程序代码:

#include

#include

int main()

{

int n, j, i;

int s1= 0, s2= 0;

int sum, flag;

int a=0, b=0;

j= 0; i = 0;

flag = 0;

scanf("%d", &n);

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

{

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

{

s1= j* 100 + i;

s2= 2 * i * 100 + 2 * j;

sum = s1- s2;

if (sum == n)

{

a = i;

b = j;

flag = 1;

}

}

}

if (flag)

printf("%d.%d", a, b);

else

printf("No Solution");

return 0;

}

5-20 打印九九口诀表 (15分)

下面是一个完整的下三角九九口诀表:

1*1=1

1*2=2 2*2=4

1*3=3 2*3=6 3*3=9

1*4=4 2*4=8 3*4=12 4*4=16

1*5=5 2*5=10 3*5=15 4*5=20 5*5=25

1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49

1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

本题要求对任意给定的一位正整数N,输出从1*1到N*N的部分口诀表。

输入格式:

输入在一行中给出一个正整数N(1\le≤N\le≤9)。

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

1*1=1

1*2=2 2*2=4

1*3=3 2*3=6 3*3=9

1*4=4 2*4=8 3*4=12 4*4=16

程序代码:

#include

#include

int main() {

int i, j, n;

scanf("%d", &n);

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

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

printf("%d*%d=%-4d", j, i, i * j);

}

printf("\n");

}

return 0;

gcc编译器使用简明指南

gcc编译器使用简明指南 gcc对文件的处理需要经过预处理->编译->汇编->链接的步骤,从而产生一个可执行文件,各部分对应不同的文件类型,具体如下: file.c c程序源文件 file.i c程序预处理后文件 file.cxx c++程序源文件,也可以是https://www.doczj.com/doc/b213870655.html, / file.cpp / file.c++ file.ii c++程序预处理后文件 file.h c/c++头文件 file.s 汇编程序文件 file.o 目标代码文件 gcc [选项]文件列表 -ansi 强制完全ANSI一致 -c 仅编译或汇编,生成目标代码文件,将.c、.i、.s等文件生成.o文件,其余文件被忽略 -S 仅编译,不进行汇编和链接,将.c、.i等文件生成.s文件,其余文件被忽略 -E 仅预处理,并发送预处理后的.i文件到标准输出,其余文件被忽略 -o file 创建可执行文件并保存在file中,而不是默认文件a.out -g 产生用于调试和排错的扩展符号表,用于GDB调试,切记-g和-O通常不能一起使用 -w 取消所有警告 -W 给出更详细的警告 -O [num]优化,可以指定0-3作为优化级别,级别0表示没有优化 -x language 默认为-x none,即依靠后缀名确定文件类型,加上-x lan确定后面所有文件类型,直到下一个-x出现为止 -D macro[=]类似于源程序里的#define,在-D macro中的macro可被源程序识别,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一个-D选项定义宏NUM,在程序中可以使用#ifdef来检查是否被设置,第二个-D定义宏FILE,在源程序中可用 -U macro 类似于源程序开头定义#undef macro,也就是取消源程序中的某个宏定义

四川大学编译原理期末复习总结

一、简答题 1.什么是编译程序 答:编译程序是一种将高级语言程序(源程序)翻译成低级语言(目标程序)的程序。 将高级程序设计语言程序翻译成逻辑上等价的低级语言(汇编语言,机器语言)程序的翻译程序。 2.请写出文法的形式定义 答:一个文法G抽象地表示为四元组 G=(Vn,Vt,P,S) –其中Vn表示非终结符号 –Vt表示终结符号,Vn∪Vt=V(字母表),Vn∩Vt=φ –S是开始符号, –P是产生式,形如:α→β(α∈V+且至少含有一个非终结符号,β∈V*) 3.语法分析阶段的功能是什么 答:在词法分析的基础上,根据语言的语法规则,将单词符号串分解成各类语法短语(例:程序、语句、表达式)。确定整个输入串是否构成语法上正确的程序。 4.局部优化有哪些常用的技术 答:优化技术1—删除公共子表达式 优化技术2—复写传播 优化技术3—删除无用代码 优化技术4—对程序进行代数恒等变换(降低运算强度) 优化技术5—代码外提 优化技术6—强度削弱 优化技术7—删除归纳变量 优化技术简介——对程序进行代数恒等变换(代数简化) 优化技术简介——对程序进行代数恒等变换(合并已知量) 5.编译过程分哪几个阶段 答:逻辑上分五个阶段:词法分析、语法分析、语义分析与中间代码生成、代码优化、目标代码生成。每个阶段把源程序从一种表示变换成另一种表示。 6. 什么是文法 答:文法是描述语言的语法结构的形式规则。是一种工具,它可用于严格定义句子的结构; 用有穷的规则刻划无穷的集合;文法是被用来精确而无歧义地描述语言的句子的构成方式;文法描述语言的时候不考虑语言的含义。 7. 语义分析阶段的功能是什么 答:对语法分析所识别出的各类语法范畴分析其含义,进行初步的翻译(翻译成中间代码); 并对静态语义进行审查。 8.代码优化须遵循哪些原则 答:等价原则:不改变运行结果 有效原则:优化后时间更短,占用空间更少 合算原则:应用较低的代价取得较好的优化效果 9.词法分析阶段的功能是什么 答:

常见gcc 编译错误整理

常见gcc 编译错误整理(开始)1 1 error: expected expression before 'else' else之前无表达式。 2 error: lvalue required as left operand of assignment 左值问题。 3 error: invalid storage class for function 'XXXXXX' 在文件的某个地方,丢失了一个大括号‘}’。 常见gcc编译警告整理(开始) 1、warning: no newline at end of file 在文件最后一行加上回车键 解释:在《Rationale for the C99 standard》一文中,有C99的相关信息: A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing a backslash/newline sequence. c/c++代码的每一行后面有一个“结束符”,也就是newline。避免当被include的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。 2、warning: comparison between pointer and integer 解释:integer与pointer比较

GCC常见错误解析

GCC常见错误解析 一、错误类型 第一类∶C语法错误 错误信息∶文件source.c中第n行有语法错误(syntex errror)。 这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。 有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,此时要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。 第二类∶头文件错误 错误信息∶找不到头文件head.h(Can not find include file head.h)。 这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。 第三类∶档案库错误 错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or directory. 这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。第四类∶未定义符号 错误信息∶有未定义的符号(Undefined symbol)。 这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc 连接选项中的-l和-L项。 排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。这个过程中的错误,只是我们在使用C语言描述一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。 二、常见错误信息解析与处理 1

1、GCC编译器的使用

linux下gcc编译器的使用 1、文件后缀名 .c C 源程序 .C C++ 源程序 .cc C++ 源程序 .cxx C++ 源程序 .m Objective –C源程序 .i 预处理过的c源程序 .ii 预处理过的C++源程序 .s 组合语言源程序 .S 组合语言源程序 .h 头文件 .o 目标文件 .a 存档文件 2、GCC常用选项 -c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件; -Dmacro定义指定的宏,使它能够通过源码中的#ifdef进行检验 #define -static 指定程序编译时采用静态编译的方法; -E 不经过编译预处理程序的输出而输送至标准输出; -g获得有关调试程序的详细信息,它不能与-o选项联合使用; -Idirectory在包含文件搜索路径的起点处添加指定目录; -llibrary提示链接程序在创建最终可执行文件时包含指定的库; -O、-O2、-O3将优化状态打开,该选项不能与-g选项联合使用; -S要求编译程序生成来自源代码的汇编程序输出; -v启动所有警报; -Wall发生警报时取消编译操作,即将警报看作是错误; -Werror在发生警报时取消编译操作,即把报警当作是错误; -w 禁止所有的报警。 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。

编译原理学习心得

编译原理学习心得 编译原理学习心得1 编译程序在计算机科学与技术的发展历史中发挥了巨大作用,是计算机系统的核心支撑软件。而“编译原理”这门课程一直以来是国内外大学计算机相关专业的重要课程。因为它的知识结构贯穿程序设计语言、系统环境以及体系结构,能以相对的视角体现从软件到硬件以及软硬件协同的整机概念。其理论基础又涉及形式语言与自动机、数据结构与算法等计算机学科的许多重要方面,为联系计算机科学理论和计算机系统的典范。 虽然编译原理这门课程在大多数的人里认为枯燥无味,学起来就像看天书一样。然而学习这门课程还是有一定的好处的。比如可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的,可以更加客观的比较不同语言的差异,并且学习新的语言的效率也会更加高,语言转换也会更加游刃有余。 不学“编译原理”这门课程的话,自己的编程思想会很浅显。而且编程也只仅仅停留在编程上,无法深入理解其中的原理。 学习编译原理的话,从文法、正规式、NFA与DFA的定义,下手,要用心动脑去体会 编译原理学习心得2

从联系最紧密的操作系统来说吧,你写多线程/多进程的程序就得和操作系统的知识打交道。写多线程得加锁吧,临界区、死锁的四个条件之类的标准的操作系统的内容吧(不得不吐槽一下,某国内一线电商干了三年的程序猿,写多线程居然不知道加锁,也是醉了)。进程间通信的几种方式什么管道、socket、共享内存等,这也是操作系统的内容吧。文件系统,这也是经常要打交道的东西。还有内存什么的,你做Android 开发,这些里边有很多东西都在系统层面被封装好了,但是你要是不知道原理,一旦出了错根本无从调试,况且你该不会打算写一辈子写Android 就是填逻辑吧。 然后,是编译原理,普通的程序猿是接触不到编译器或者虚拟机的开发的。但是这并不意味着编译原理就用不到。说个最常见的读取配置文件,只要你的配置文件有自定义的语法,你就要用编译原理的东西。还有类似于自动生成代码啦、正则表达式啦这些都算是编译原理的内容。你既然是写Java 的不了解虚拟机怎么可以,最基本的字节码总是需要能看懂的吧,分析一些疑难杂症的时候字节码还是很有用的。 最后,是计算机原理,如果只是做应用开发的话计算机原理其实不必要掌握的多深入,但是一些基本的概念还是要清楚的。比如寄存器、缓存、中断什么的,关键的时候可以帮助你调试。在一些对性能要求非常高的场合,也是很有作用的。此外,学了

gcc语言编译原理_CompilingBinaryFilesUsingACompiler

Making plain binary?les using a C compiler(i386+) Cornelis Frank April10,2000 I wrote this article because there isn’t much information on the Internet concerning this topic and I needed this for the EduOS project. No liability is assumed for incidental or consequential damages in connection with or arising out of use of the information or programs contained herein. So if you blow up your computer because of my bad“English”that’s your problem not mine. 1Which tools do you need? An i386PC or higher. A Linux distribution like Red Hat or Slackware. GNU GCC compiler.This C compiler usually comes with Linux.To check if you’re having GCC type the following at the prompt: gcc--version This should give an output like: 2.7.2.3 The number probably will not match the above one,but that doesn’t really matter. The binutils for Linux. NASM Version0.97or higher.The Netwide Assembler,NASM,is an80x86assembler designed for portability and modularity.It supports a range of object?le formats,including Linux‘a.out’and ELF,NetBSD/FreeBSD,COFF,Microsoft16-bit OBJ and Win32.It will also output plain binary?les.Its syntax is designed to be simple and easy to understand, similar to Intel’s but less complex.It supports Pentium,P6and MMX opcodes,and has macro capability. Normally you don’t have NASM on your system.Download it from: https://www.doczj.com/doc/b213870655.html,/pub/Linux/devel/lang/assemblers/ A text editor like pico or emacs.

GCC编译选项

Linux中gcc,g++常用编译选项 -x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定,C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀名是. pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。可以使用的参数有下面的这些: `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a ssembler-with-cpp'. 看到英文,应该可以理解的。 例子用法: cd.. gcc -x c hello.pig -x none filename 关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型 例子用法: gcc -x c hello.pig -x none hello2.c -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他将生成.o的obj文件 -S 只激活预处理和编译,就是指把文件编译成为汇编代码。 例子用法 gcc -S hello.c 他将生成.s的汇编代码,你可以用文本编辑器察看 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. 例子用法: gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一个hello word 也要预处理成800行的代码 -o 制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈 例子用法 gcc -o hello.exe hello.c (哦,windows用习惯了) gcc -o hello.asm -S hello.c -pipe 使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题 gcc -pipe -o hello.exe hello.c

编译原理课程设计心得体会

编译原理课程设计心得体会 假期期间我参加了由高平市教育局组织的构建高效课堂的培训,课题是三环节问题导学课课堂教学模式,张艳红老师论述了课堂是教学的主要阵地之一,是教师传授知识、学生学习知识的场所,教师和学生交往互动的空间,是教师引导学生发展、探究知识的主渠道,也是实现高效教学的主战场。要提高英语教学质量,就必须重视英语课堂教学,实现有效课堂教学。教师如何优化课堂教学,激发学生学习英语的兴趣,培养学生良好的英语学习习惯,通过这次理论学习和培训,使我对课堂有效教学有了更深刻的认知: 经过一个星期的编译原理课程设计,本人在老师的指导下,顺利完成该课程设计。通过该课程设计,收获颇多。 一、对实验原理有更深的理解 通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。 二、对该理论在实践中的应用有深刻的理解 要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。 通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。 自1987年就和程永革一起共事的歌舞话剧团演唱队队长骆汉泉含泪说道:“永革是我的好兄弟,这么多年,我们一起排练、演出,他的敬业精神一直留在我的脑海中,他的艺术才华和人品都给我们留下了深刻的印象。作为艺术人才,他尽职尽责,用自己的生命演绎出人生的追求。虽然他已经离我们而去,但是他难能可贵的责任担当和执着敬业的奉献精神一直感染着我们,我们也将在今后的工作中,以他为榜样,演好戏、做好人。” 月27日,全县《科学》教研会在城内小学召开。与其它学科教研会不同的是,《科学》教研会不是对新课标进行培训,而是科学课高效课堂的培训。原因是新拟定的《科学课程标准》还没有正式颁布。这次会议,全县专兼职老师一共100多人,观摩了三节高效课堂教学,聆听了龚主任所作的“构建自主探究式的高效课堂”专题讲座。

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc常用参数讲解gcc编译器使用方法 我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段: 1. 预处理(Pre-Processing) 2. 编译(Compiling) 3. 汇编(Assembling) 4. 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 以文件example.c为例说明它的用法 0. arm-linux-gcc -o example example.c 不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。 -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出 a.out 1. arm-linux-gcc -c -o example.oexample.c -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件 去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以 2.arm-linux-gcc -S -o example.sexample.c -S参数将对源程序example.c进行预处理、编译,生成example.s文件 -o选项同上 3.arm-linux-gcc -E -o example.iexample.c -E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上) 就是将#include,#define等进行文件插入及宏扩展等操作。 4.arm-linux-gcc -v -o example example.c 加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。 5.arm-linux-gcc -g -o example example.c -g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。 6.arm-linux-gcc -Wall -o example example.c -Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。 7.arm-linux-gcc -Ox -o example example.c -Ox使用优化选项,X的值为空、0、1、2、3 0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用较大的内存空间。 8.arm-linux-gcc -I /home/include -o example example.c -Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。如果在预设系统及当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。 9.arm-linux-gcc -L /home/lib -o example example.c

编译原理复习题及答案

编译原理复习题及答案一、选择题 1.一个正规语言只能对应( B ) A 一个正规文法 B 一个最小有限状态自动机 2.文法G[A]:A→εA→aB B→Ab B→a是( A ) A 正规文法 B 二型文法 3.下面说法正确的是( A ) A 一个SLR(1)文法一定也是LALR(1)文法 B 一个LR(1)文法一定也是LALR(1)文法 4.一个上下文无关文法消除了左递归,提取了左公共因子后是满足LL(1)文法的( A ) A 必要条件 B 充分必要条件 5.下面说法正确的是( B ) A 一个正规式只能对应一个确定的有限状态自动机 B 一个正规语言可能对应多个正规文法 6.算符优先分析与规范归约相比的优点是( A ) A 归约速度快 B 对文法限制少 7.一个LR(1)文法合并同心集后若不是LALR(1)文法( B ) A 则可能存在移进/归约冲突 B 则可能存在归约/归约冲突 C 则可能存在移进/归约冲突和归约/归约冲突 8.下面说法正确的是( A ) A Lex是一个词法分析器的生成器 B Yacc是一个语法分析器 9.下面说法正确的是( A ) A 一个正规文法也一定是二型文法 B 一个二型文法也一定能有一个等价的正规文法 10.编译原理是对(C)。 A、机器语言的执行 B、汇编语言的翻译 C、高级语言的翻译 D、高级语言程序的解释执行

11.(A)是一种典型的解释型语言。 A.BASIC B.C C.FORTRAN D.PASCAL 12.把汇编语言程序翻译成机器可执行的目标程序的工作是由(B)完成的。 A. 编译器 B. 汇编器 C. 解释器 D. 预处理器 13.用高级语言编写的程序经编译后产生的程序叫(B) A.源程序?B.目标程序C.连接程序D.解释程序14.(C)不是编译程序的组成部分。 A.词法分析程序 B.代码生成程序? C.设备管理程序 D.语法分析程序 15.通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括(C)。 A.模拟执行器B.解释器?C.表格处理和出错处理 ??? D.符号执行器16.编译程序绝大多数时间花在(D)上。 A.出错处理B.词法分析C.目标代码生成D.表格管理 17.源程序是句子的集合,(B)可以较好地反映句子的结构。 A. 线性表 B. 树 C. 完全图 D. 堆栈 18.词法分析器的输出结果是(D)。 A、单词自身值 B、单词在符号表中的位置 C、单词的种别编码 D、单词的种别编码和自身值 19.词法分析器不能(D) A. 识别出数值常量 B. 过滤源程序中的注释 C. 扫描源程序并识别记号 D. 发现括号不匹配 20.文法:G:S→xSx | y所识别的语言是(D)。 A、xyx B、(xyx)* C、x*yx* D、x n yx n(n≥0) 21.如果文法G是无二义的,则它的任何句子α(A) A.最左推导和最右推导对应的语法树必定相同 B.最左推导和最右推导对应的语法树可能不同 C.最左推导和最右推导必定相同 D.可能存在两个不同的最左推导,但它们对应的语法树相同 22.正则文法(A)二义性的。 A. 可以是 B. 一定不是 C. 一定是 23.(B)这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。 A. 存在 B. 不存在 C. 无法判定是否存在 24.给定文法A→bA | ca,为该文法句子的是(C)

常见gcc编译警告整理以及解决方法【收藏】

常见gcc编译警告整理以及解决方法【收藏】 1、warning: no newline at end of file ? ?在文件最后一行加上回车键 ? ?解释:在《Rationale for the C99 standard》一文中,有C99的相关信息: ? ?A backslash immediately before a newline has long been used to continue string literals, as well as preprocessing command lines. In the interest of easing machine generation of C, and of transporting code to machines with restrictive physical line lengths, the C89 Committee generalized this mechanism to permit any token to be continued by interposing a backslash/newline sequence. ? ?c/c++代码的每一行后面有一个结束符,也就是newline。避免当被include 的文件展开后,前一个文件的最后一行与后一个文件的第一行直接被连接成一行从而造成错误。 ? ?2、warning: comparison between pointer and integer ? ?解释:integer与pointer比较 ? ?3、warning: assignment discards qualifiers from pointer target type ?

最新GCC编译器选项及优化提示

G C C编译器选项及优 化提示

GCC编译器选项及优化提示 GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径; 因此献上此帖,以供各位玩家参考,绝对原创噢 = 大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。 如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。 一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。 一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了! 另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure 脚本会使用这两个环境变量代替Makefile文件中的值。 但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值): export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS 这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行), Intel通常是: pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium- m,prescott,nocona 说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu; prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋) AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx 用AMD的一般都是DIYer,就不必解释了吧。 如果编译时没有抱怨"segmentation fault,core dumped",那么你设定的"-O"优化参数一般就没什么问题。 否则请降低优化级别("-O3"-"-O2"-"-O1"-取消)。 个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3"; 不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。 编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。 所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

编译原理概念总结

第一章 引论 ? 为什么要用编译器 ? 与编译器相关的程序 ? 翻译步骤 ? 编译器中的主要数据结构 1、语言处理器 1、简单的说,一个编译器就是一个程序,它可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成一个等价的、用另一种语言(目标语言)编写的程序。 2、编译器的重要任务之一就是报告它在翻译过程中发现的源程序中的错误。 3、使用编译器是为了提高编程的速度和准确度。 4、与编译器相关的程序:解释程序(interpreter )、汇编程序(assembler )、连接程序(linker )、装入程序(loader )、预处理器(preprocessor )、编辑器(editor )、调试程序(debugger )、描述器(profiler )、项目管理程序(project manager )。 5、解释器是另一种常见的语言处理器。它并不通过翻译的方法生成目标程序。从用户的角度来看,解释器直接利用用户提供的输入执行源程序中指定的操作。 6、一个源程序可能被分割成多个模块,并存放于独立的文件中。把源程序聚合在 一起的任务有时会由一个被称为预处理器(preprocessor )的程序独立完成。预处理器还负责把那些称为宏的缩写形式转换为源语言的语句。 7、连接器(linker )能够解决外部内存地址的问题。 8、加载器(loader )把所有的可执行目标文件放到内存中执行。 2、一个编译器的结构 Output Source Program Front end Back end Object

1、将编译器看成黑盒,则源程序映射为在语义上等价的目标程序,而这个映射由两部分组成:分析部分和综合部分。 2、分析部分把源程序分解成多个组成要素,并在这些要素之上加上语法结构。 3、综合部分根据中间表示和符号表中的信息来构造用户期待的目标程序。 4、编译器的第一个步骤:词法分析(lexical)或扫描(scanning)。词法分析器读入组成源程序的字符流,并且将它们组成有意义的词素(lexeme)的序列。词法分析器产生词法单元(token)。 5、分隔词素的空格会被词法分析器忽略掉。 6、编译器的第二个步骤:语法分析(syntax)或解析(parsing)。语法分析器使用由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示。 7、语义分析(static semantic analysis):语义分析器使用语法树和符号表中的信息 来检查源程序是否和语言定义的语义一致。它同时也收集类型信息,并把这些信息存放在语法树或符号表中,以便在随后的中间代码生成过程中使用。语义分析的一个重要部分是类型检查(type checking)。编译器检查每个运算符是否具有匹配的运算分量。 8、总的说,编译器的翻译步骤是:扫描程序----语法分析程序----语义分析程序---- 源代码优化程序----代码生成器----目标代码优化程序。 3、编译器结构中的主要数据结构 1、记号(token) 2、语法树(syntax tree) 3、符号表(symbol table) 4、常数表(literal table) 5、中间代码(intermediate code) 6、临时文件(temporary file) 4、将编译器分成了只依赖于源语言(前端( front end))的操作和只依赖于目 标语言(后端( back end))的操作两部分。 第二章词法分析 ? 扫描处理 ? 正则表达式 ? 有穷自动机 ? 从正则表达式到D FA ? 利用L e x自动生成扫描程序 1、Tokens记号标记:identifiers、keywords、integers、floating-point、symbols、strings、comments 1、使用正则表达式去描述程序语言tokens 2、一个正则表达式是归纳确定 3、一个正则表达式R描述一组字符串集合L(R) 4、L(R) = the language defined by R 5、所有的token都能用正则表达式表示 2、正则表达式: 1、基本正则表达式:他们是字母比哦啊中的单个字符且自身匹配

vi编辑器及GCC编译器的使用

实验三vi编辑器及GCC编译器的使用 【实验目的】 一、掌握文本编辑器vi的使用方法 二、了解GNU gcc编译器 三、掌握使用GCC编译C语言程序的方法 【实验内容】 一、vi的三种工作模式: 1、命令模式:执行相关文本编辑命令 2、输入模式:输入文本 3、末行模式:实现查找、替换、保存、多文件操作等等功能 二、进入vi,直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。 三、退出vi 1、在命令模式下输入“:wq”,保存文件并退出vi 2、若不需要保存文件,输入“:q” 3、若文件已修改,但不保存,输入“:q!”强制退出vi 4、其它一些不常用的方法在此省略。 四、命令模式下的常用编辑命令 1、启动vi后,进入的是vi的命令模式 2、按i键,进入输入模式,可以进行文本的编辑,在输入模式下,按esc 键,可切换回命令模式 i:光标位置不变,可在光标左侧插入正文 a:光标位置向后退一格,可在光标左侧插入正文 o:在光标所在行的下一行增添新行 O:在光标所在行的上一行增添新行 I:光标跳到当前行的开头 A:光标跳到当前行的末尾 3、光标的移动 k、j、h、l分别等同于上、下、左、右箭头键 Ctrl+b,向上翻一页 Ctrl+f,向下翻一页 nH,将光标移到屏幕的第n行 nL,将光标移到屏幕的倒数第n行 4、删除文本 nX,删除光标所指向的前n个字符 D,删除光标右侧的所有字符(包括光标所指向的字符) db,删除光标左侧的全部字符 ndd,删除当前行和当前行以后的n行内容 5、粘贴和复制 p,将缓冲区的内容粘贴到当前字符的右侧

P,将缓冲区的内容粘贴到当前字符的左侧 yy,复制当前行到内存缓冲区 nyy,复制n行内容到内存缓冲区 6、搜索字符串 /str1,正向搜索字符串str1 n,继续搜索 ?str2,反向搜索字符串str2 7、撤销和重复 u,撤销前一条命令的执行结果 .,重复最后一条命令 五、末行模式下的命令 :n,将光标移动到第n行 :nw file,将第n行写入file文件 :n,mw file,将第n行至第m行写入file文件 :w,将编辑的内容写入原始文件 :wq,将编辑的内容写入原始文件并退出编辑程序 :w file,将编辑的内容写入file文件,保持原有文件的内容不变 :f file,将当前文件重命名为file :e file,编辑新文件file代替原有内容 :f,打印当前文件的状态,如文件的行数,光标所在的行号等 :!<命令>,执行相应shell命令 六、三种工作模式的切换 1、在Linux shell下,键入vi或vi <文件名>进入命令模式 2、在命令模式下,键入:进入末行模式 3、在命令模式下,键入文本编辑命令如i,a,o等进入文本输入模式 4、在文本输入模式下,按esc键进入命令模式 5、在末行模式下,按backspace键或del键进入命令模式 6、在末行模式下,键入q或wq,退出vi,饭后到Linux shell下 GCC编译器的使用 一、使用vi或其它文本编辑器,输入C语言程序,并保存为test.c 二、在Linux shell下,输入命令gcc –o test test.c 三、编译正确后,输入命令./test运行程序,观察程序运行结果 四、若编译错误,根据提示信息,进入程序查错,再回到第二步,直至程序 语法无误。 附:GCC使用方法和常用选项 使用GCC编译C程序生成可执行文件需要经历4个步骤: 1、预处理,这一步需要分析各种命令,如#define、#include、#ifdef 等。Gcc调用cpp程序来进行预处理 2、编译,这一步将根据输入文件产生汇编语言,gcc调用ccl进行编 译工作

编译原理知识点总结

考试题型:填空24%简答4*4=16%+解答4*15=6 Chapter 1 重要概念 1?什么编译程序?P3 答:编译程序的主要功能是把用高级语言编写的源程序翻译为等 价的目标程序。 2. 编译程序的工作过程?(6个阶段)P4 1、词法分析程序2、语法分析程序3、语义分析程序4、中间代码生成5、代码优化程序6、目标代码生成 (不做优化是4个阶段,5、6不要) 4. 执行高级语言编写的程序:(编译执行、解释执行) 1)按编译方式在计算机上执行用高级语言编写的程序,一般须 经过两个阶段。第一个阶段称为编译阶段,其任务是由编译程序将源程序编译为目标程序,若目标程序不是机器代码,而是汇编语言程序,则尚需汇编程序再行汇编为机器代码程序;第二阶段称为运行阶段,其任务是在目标计算机上执行编译阶段所得到的

目标程序。 2)用高级语言编写的程序也可以通过解释程序来执行。解释程序也以源程序作为它的输入,它与编译程序的主要区别是在解释程序的执行过程中不产生目标程序,而是解释执行源程序本身。缺点:这种边翻译边执行的方式工作效率很低,但由于解释程序 的结构比编译程序简单,且占用内存较少,在执行过程中也易于在源程序一级对程序进行修改,因此一些规模较小的语言,如BASIC,也常采用此种方式。 5. P11第一段 编译程序的各部分之间的关系,是指他们之间的逻辑关系,而不一定是执行时间上的先后顺序,事实上,可按不同的执行流程来组织上述各部分的工作,这在很大程度上依赖与编译过程中对源程序扫描的遍数,以及如何划分各遍扫描所进行的工作。此处所说的“遍”,是指对源程序或其内部表示从头到尾扫视一次,并进行有关的加工处理工作。 (执行过程:单遍扫描、多遍扫描(大多数)) Chapter 2前后文无关文法和语言 1. 文法和语言的形式定义 产生语言就是制定出有限个规则(文法),借助于它们,就能产生出此语言的全部句子。 2. 文法规则四要素:

编译原理语法分析 算术表达式

package语法分析; public class displymain { public static void main(String args[]) { new frame(); } } package 语法分析; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class frame implements ActionListener{ JFrame frame1; JLabel L1,L2; JButton bt,bt2; JTextField input,result; top_down_grammar a =new top_down_grammar(); public frame() { frame1=new JFrame(""); input=new JTextField(20); result=new JTextField(20); L1=new JLabel("请输入表达式以#结束"); L2=new JLabel("结果是:"); bt=new JButton("语法分析"); bt2=new JButton("关闭"); frame1.setTitle("递归下降子程序分析语法"); frame1.setLayout(new GridLayout(3,1)); frame1.add(L1); frame1.add(input); frame1.add(L2); frame1.add(result); frame1.add(bt); frame1.add(bt2); bt.addActionListener(this); bt2.addActionListener(this); frame1.setSize(500, 500); frame1.setVisible(true); } public void actionPerformed(ActionEvent e) { a.i=0; a.x.str=input.getText();

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