编译出错种类
- 格式:doc
- 大小:48.00 KB
- 文档页数:7
编译原理期末总结复习编译原理期末总结复习篇一:一、简答题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.词法分析阶段的功能是什么?答:逐个读入源程序字符并按照构词规则切分成一系列单词任务:读入源程序,输出单词符号—滤掉空格,跳过注释、换行符—追踪换行标志,指出源程序出错的行列位置—宏展开,……10.什么是符号表?答:符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息。
keil的几种编译模式【实用版】目录1.编译模式的概念2.Keil 的编译模式的种类3.各种编译模式的特点和适用场景4.编译模式的选择建议正文【1.编译模式的概念】编译模式是指编译器在编译源代码时所采用的不同的编译策略,这些策略会影响到编译后的程序的性能、体积以及调试的方便性等。
【2.Keil 的编译模式的种类】Keil 是一款广泛应用于嵌入式系统开发的集成开发环境(IDE),它支持多种编译模式,主要包括以下几种:- 优化模式(Optimized)- 调试模式(Debug)- 实时模式(Real-time)- 小型模式(Small)- 微型模式(Micro)【3.各种编译模式的特点和适用场景】(1)优化模式(Optimized):这种模式下,编译器会采用各种优化技术对源代码进行优化,以提高程序的执行效率。
这种模式适用于对运行速度有较高要求的场景,如正式发布的产品。
(2)调试模式(Debug):这种模式下,编译器会加入调试信息,便于程序员进行调试。
这种模式适用于开发过程中,需要不断调试的场景。
(3)实时模式(Real-time):这种模式下,编译器会考虑实时性,优化程序的执行顺序,以满足实时系统的要求。
这种模式适用于对实时性有较高要求的场景,如实时操作系统的开发。
(4)小型模式(Small):这种模式下,编译器会尽量减小程序的体积,减少不必要的代码和数据。
这种模式适用于对程序体积有较高要求的场景,如嵌入式系统的开发。
(5)微型模式(Micro):这种模式下,编译器会进一步减小程序的体积,优化代码和数据的存储方式。
这种模式适用于对程序体积有极高要求的场景,如某些特定类型的嵌入式系统。
【4.编译模式的选择建议】在选择编译模式时,需要根据实际的项目需求和场景进行选择。
在开发初期,可以选择调试模式进行开发,以便于调试;在项目接近完成时,可以选择优化模式或实时模式,以提高程序的性能和实时性;在对程序体积有要求的场景,可以选择小型模式或微型模式。
C++答案与解析一、单项选择题1、在一个C++程序中,main函数的位置(3)。
①必须在程序的开头②必须在程序的后面③可以在程序的任何地方④必须在其它函数中间2、C++程序基本单位是(3)。
①数据②字符③函数④语句3、执行语句int i=10,*p=&i;后,下面描述错误的是(1)。
①p的值为10②p指向整型变量i③*p表示变量i的值④p的值是变量i的地址4、执行语句int a=5,b=10,c; int *p1=&a, *p2=&b;后,下面不正确的赋值语句是(2)。
① *p2=b; ② p1=a; ③ p2=p1; ④ c=*p1*(*p2);解析:④*p = *p1 * (*p2) 中间的*是乘号的意思,两边的代表指针地,也就是地址。
指针p1和p2指向的地址单元中存放的数据相乘,最后都指向了同一p指向的地址单元内。
相当于*p=a*b5、设i=1,j=2,则表达式i++ +j的值为(3)。
①1 ②2 ③3 ④46、设i=1,j=2,则表达式++i+j的值为(4)。
① 1 ②2 ③3 ④ 4考察i++,++i的区别7、执行下列语句后,x的值是(4),y的值是(3)。
int x,y;x=y=1; ++x||++y;① 不确定②0 ③1 ④2操作符||和&&都具有短路现象如a||b 假如判断了a是正确的,就不会判断b了,无论b是否正确。
a&&b也一样,不过是反过来的,假如判断了a是错误的,就不会继续判断b了。
8、已知x=5,则执行语句x+=x-=x×x;(题目有错误吧?c++语言中的x是*)后,x的值为(3)。
①25 ②40 ③-40 ④20先分解:X²=25(看符号优先级)x-=25 则x=-20x+=-20,既最终x=-409、已知a=4,b=6,c=8,d=9,则“(a++,b>a++&&c>d)?++d:a<b”的值为(4)。
cl的编译参数(实用版)目录1.编译参数的定义和作用2.CL 编译器的特点3.CL 编译器的常用编译参数4.编译参数对程序性能的影响5.编译参数的实际应用案例正文编译参数是编译器在编译源代码时所使用的选项和参数,可以影响编译后的程序代码质量、性能和调试特性等方面。
编译参数通常可以在编译命令行中指定,也可以在编译器的设置文件中设置。
编译参数的种类和作用因编译器而异,但是一般来说,编译参数可以控制编译器的优化程度、目标平台、代码格式化等方面的选项。
CL 编译器是 Linux 系统中常用的 C 语言编译器之一,其具有如下特点:1.高度可定制性:CL 编译器可以根据用户的需求和目标平台的特性进行定制,以满足不同用户的需求。
2.高性能:CL 编译器在编译 C 语言程序时,采用了一系列优化措施,可以有效地提高程序的性能。
3.良好的兼容性:CL 编译器可以兼容多种不同的操作系统和平台,使得开发的程序可以在不同的环境下运行。
CL 编译器的常用编译参数包括以下几个方面:1.优化参数:通过指定不同的优化参数,可以控制编译器对程序进行优化的程度。
例如,使用“-O2”参数可以开启中等优化级别,使用“-O3”参数可以开启最高优化级别。
2.平台参数:通过指定不同的平台参数,可以控制编译器输出的目标文件格式和运行时库。
例如,使用“-m64”参数可以指定输出 64 位可执行文件,使用“-m32”参数可以指定输出 32 位可执行文件。
3.代码格式化参数:通过指定不同的代码格式化参数,可以控制编译器对源代码进行格式化的方式。
例如,使用“-fno-align-commons”参数可以禁止对齐公共子表达式,使用“-falign-functions”参数可以强制对齐函数。
编译参数对程序性能的影响非常大,不同的编译参数可以产生不同的程序性能。
因此,在实际应用中,需要根据不同的需求和目标平台,选择合适的编译参数,以获得最佳的程序性能。
例如,在编译一个高性能的科学计算程序时,可以使用“-O3”参数开启最高优化级别,以获得最佳的程序性能;在编译一个嵌入式系统程序时,可以使用“-O0”参数关闭优化,以节省空间和资源。
java泛型详解-绝对是对泛型⽅法讲解最详细的,没有之⼀1. 概述泛型在java中有很重要的地位,在⾯向对象编程及各种设计模式中有⾮常⼴泛的应⽤。
什么是泛型?为什么要使⽤泛型?泛型,即“参数化类型”。
⼀提到参数,最熟悉的就是定义⽅法时有形参,然后调⽤此⽅法时传递实参。
那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于⽅法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使⽤/调⽤时传⼊具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。
也就是说在泛型使⽤过程中,操作的数据类型被指定为⼀个参数,这种参数类型可以⽤在类、接⼝和⽅法中,分别被称为泛型类、泛型接⼝、泛型⽅法。
2. ⼀个栗⼦⼀个被举了⽆数次的例⼦:1 List arrayList = new ArrayList();2 arrayList.add("aaaa");3 arrayList.add(100);45for(int i = 0; i< arrayList.size();i++){6 String item = (String)arrayList.get(i);7 Log.d("泛型测试","item = " + item);8 }毫⽆疑问,程序的运⾏结果会以崩溃结束:1 ng.ClassCastException: ng.Integer cannot be cast to ng.StringArrayList可以存放任意类型,例⼦中添加了⼀个String类型,添加了⼀个Integer类型,再使⽤时都以String的⽅式使⽤,因此程序崩溃了。
为了解决类似这样的问题(在编译阶段就可以解决),泛型应运⽽⽣。
我们将第⼀⾏声明初始化list的代码更改⼀下,编译器会在编译阶段就能够帮我们发现类似这样的问题。
复习汇总一、第一章概述1.文法与自动机的等价1)0型文法—图灵机2)1型文法—线性有界非确定图灵机3)2型文法—非确定下推自动机4)3型文法—有限状态自动机2.编译技术的应用1)语法制导的结构化编辑器2)程序格式化工具3)软件测试工具4)程序理解工具5)高级语言的翻译工具6)等等3.从面向机器的语言到面向人类的语言(结合第二章第9小点理解)1)面向机器的语言:机器指令,汇编语言2)面向人类的语言:通用程序设计语言,数据查询语言,形式化描述语言(正规式,产生式)等等。
4.各语言的分类(结合第二章第9小点理解)1)过程式语言,面向对象语言:通用程序设计语言。
2)函数语言:面向特点领域的,递归特性。
例如LISP语言3)说明性,非算法式语言:LEX/YACC,SQL。
4)脚本式语言:Shell语言5.语言之间的转换(李静PPT41)1)高级语言之间的转换一般称为预处理或转换。
2)高级语言翻译成汇编语言或机器语言称之为编译。
3)把汇编语言翻译成机器语言称之为汇编。
4)将一个汇编语言程序汇编为可在另一台机器上运行的机器指令称之为交叉汇编。
5)把机器语言翻译成汇编语言称之为反汇编。
6)把汇编语言翻译成高级语言称之为反编译。
6.编译器和解释器1)编译器●源程序的翻译和翻译后的程序的运行是两个不同的阶段。
◆编译阶段:用户输入源程序,经过编译器的处理,生成目标程序。
◆目标程序的运行阶段:根据要求输入数据,得出结果。
2)解释器(凡是可以采用编译器的地方均可以采用解释器)●解释器把翻译和运行结合到一起,编译一段源程序,紧接着就执行它。
这种方式称为解释。
7.解释器的优点(对比与编译器)1)具有较好的动态特性。
2)具有较好的移植特性。
8.解释器的缺点(对比于编译器)1)相比于编译器需花费大量的时间。
2)占用更多的内存空间。
9.编译器的工作阶段(结合第二章6小点红色部分理解)1)源程序->词法分析器->语法分析器->语义分析器->中间代码生成器->代码优化器->目标代码生成器->目标代码2)工作过程中的每个阶段均采用了符号表管理器,出错处理器。
1、执行循环语句 for i in range(1,5):pass 后,变量 i 的值是【 4】2、循环语句 for i in range(-3,21-4) 的循环次数为【 6】3、Python 语言是一种解释型、面向【对象】的程序设计语言4、建立模块 a.py, 模块内容如下。
def B():print( ‘BBB’)def A():print( ‘AAA’)为了调用模块中的 A()函数应先使用语句【 from a import A 】5、执行循环语句 for i in range(1,5,2):print(i), 循环体执行的次数是【 2】6、函数定义以【def】开始,最后以【冒号】结束7、Python 表达式 4.5/2 的值为【 2.25 】,4.5//2 的值为【 2.0】,4.5%2 的值为【 0.5】8、循环语句for i in range(6,-4,-2):循环执行【5】次,循环变量i的终值应当为【 -2】9、Python 包含了数量众多的模块,通过【import 】语句,可以导入模块,并使用其定义的功能10、下面语句的输出结果是【{1: ’x’,3: ’c’} 】d={1: ’a’,2: ’b’,3: ’c’}del d[1]d[1]= ’x’del d[2]print(d)11、Python 语句 print(tuple(range(2)),list(range(2)))的运行结果是【(0,1)[0,1] 】12、Python 表达式 1/4+2.75 的值为【 3.0 】13、下列 Python 语句的输出结果是【编译错误或异常或出错或报错或错误】print( “数{0},量单价 {1} ”.format(100,285,6))print(str.format(“{0},数单量价 {1:3.2f}”,100,285.6))print( “数%4d,量单价 %3.3f ”%(100,285,6))14、在直角坐标中,x,y是坐标系中任一点的位置,用x和 y 表示第一象限或第二象限的Python 表达式为【x>0 and y>0 or x<0 and y>0 】15、语句print(‘AAA’,”BBB”-’,sep=,end=’’!’)执行的结果是【A AA-BBB! 】16、判断整数i能否同时被3和5整除的python表达式为【i%3==0and i%5==0 】17、要关闭Python解释器,可使用函数【quit()】或快捷键【Ctrl+Q】18、python 语句既可以采用交互式的【命令】执行方式,又可以采用【程序】的执行方式19、语句a,a=10,20执行后,a的值是【20】20、设有f=lambda x,y;{x:y},则f(5,10)的值是【{5:10}】21、下列程序的输出结果是【BBB 】try:print(2/ ’0’)except ZeroDivisionError:print( ‘AAA’)except exception;print( ‘BBB’)22、根据文件数据的组织形式,Python的文件可分为【文本文件】和【二进制文件】,一个 python 程序文件是一个【文本文件】,一幅 jpg 图像文件是一个【二进制文件】23、下列语句执行后,s值为【[4,’x’,’y’]】s=[1,2,3,4,5,6]s[:1]=[]s[:2]=’a’s[2:]=’b’s[2:3]=[‘x’,’y’]del s[:1]24、下列语句执行后,print( di[‘fruit’][1])banana值为【】di={ ‘fruit’:[‘apple’,’banana}’,’orange’]di[fruit].append(‘watermelon ’)25、设m,n为整型数据,则与m%n 等价的表达式为【 m-m//n*n或m-n*(m//n) 】26、下列语句执行后的结果是【 15】27、fruits={ ‘apple ’:3, ’banana’:4, ’pear ’:5}fruits[ ‘banana’]=7print(sum(fruits.values()))28、python 语句 print(len({})) 的结果是【 0】***选择我就写上选项了 ***29、Python 语言属于【 D 高级语言】30、下列程序执行后,y的值是【B 125】def f(x,y):return x**2+y**2y=f(f(1,3),5)31、设s=’Python Programming’,那print(s[么-5:])的结果是【Amming 】32、执行下列语句后的显示结果是【 D FALSE 】from math import sqrtprint(sqrt(3)*sqrt(3)==3)33、语句x=imput()执行时,如果从键盘输入12 并按回车键,则 x的值是【 C ‘12’】34、tuple(range(2,10,2)) 的返回结果是【 D (2,4,6,8) 】35、语句eval(‘2+4/5’)执行后输出结果是A【2.8】36、在python中,逻辑量有【B True,False】37、设 s=’Happy New Year ’,s[3:8]则的值为【 B ‘py Ne ’】38、设 a=set([1,2,2,3,3,3,4,4,4,4]), 则 sum(a) 的值是【 A 10 】39、下列属于 math 库中的数学函数的是【 D sqrt() 】40、关于循环描述下列说法错误的是【 B python 允许无止境的循环】41、下列表式中,值不是 1 的是【 C ~1 】42、下列程序的输出结果是【 B 10 】f=open ( ‘f.txt’,’w’)f.writelines([‘python programming.])f.close()f=open( ‘f.txt’,’rb’)f.seek(10,1)print(f.tell())43、下列while循环执行的次数为【 B 10】k=1000while k>1:print(k)k=k/244、下列语句的运行结果是【 C 8】f1=lambda x:x*2f2=lambda x:x**2print(f1(f2(2)))45、一下关于函数说法正确的是【 C 函数的实际参数可以是其他函数的调用】46、下列语句执行后的输出是【 D 5 】if 2:print(5)else:print(6)47、python 内置的集成开发工具是【 C IDLE 】48、在python中,实现多支选择结果的最佳方法是【D if-elif-else】49、下列标识符中合法的是【 B _9】50、python 表达式中,可以使用【A 圆括号 ()】控制运算的优先顺序51、下列Python语句的输出结果是【B [4,0,6]】s1=[4,5,6]s2=s1s1[1]=0print(s2)52、Python 语句 print(r ”nGood”)的运行结果是【 D \nGood 】53、下面程序段求x和y中的较大数,不正确的是【Cif(y>=x):maxNum=y:maxNum=x】54、循环语句 for i in range(-3,21,4) 的循环次数为【 6】55、下列 python 语句的执行结果是【 4 3 】a,b=3,4a,b=b,aprint(a,b)56、以下while循环的循环次数是【无限】i=0while(i<10):if(i<1):coninueif(i==5):breaki+=157、seek(0) 将文件指针定位于【起始位置】,seek(0,1) 将文件指针定位于【当前位置】,seek(0,2) 将文件指针定位于【文件末尾】58、python表达式12/4-2+5*8/4%5/2的值为【1.0 】59、已知fruits=[‘apple’,’banana’,’pear ’-1],print(fruits[-1])的结果是【 r】,pirnt(fruits.index(‘apple’))的0】结,果print(是【‘Apple’in furits) 的结果是【False 】60、{1,2,3,4}&{3,4,5} 的值是【 {3,4} 】,{1,2,3,4}|{3,4,5} 的值是【{1,2,3,4,5} 】,{1,2,3,4}-{3,4,5} 的值是【 {1,2} 】61、使用关键字【global】可以在一个函数中设置一个全局变量62、Python 提供了【异常处理】机制来专门处理程序运行时错误,相应的语句是【 try-except 】63、python 语句 print(set([1,2,1,2,3])) 的结果是【 {1,2,3} 】64、一直 ans =’n’, 则表达ans==(式‘y’ or ‘Y’) 的False值为】【65、使用math模块库中的函数是,必须要使用【import math 】语句导入该模块66、以下python注释代码,不正确的是【 C //python 注释代码】67、将字符串中全部字母转换为大写字母的字符串方法是【Cupper 】68、已知x=2,语句x*=x+1执行后,x的值是【C 6】69、下列选项中,不属于python 特点的是【 B 运行效率高】70、下列选项中不属于函数优点的是【 C 便于发挥程序员的创造力】71、在读写文件之前,用于创建文件对象的函数是【 A open 】72、在一个同时包含整数和浮点数的表达式中,python 要进行的转换是【 B 整数转换为浮点数】73、python 不支持的数据类型有【 A char 】74、如果以负数作为平方根函数math.sqrt() 的参数将产生【 DValueError 异常】75、对于字典D={‘A’:10,’B’:20,’C’},len(D):30,’D的’是:40【A 4】76、python 语句 print(type([1,2,3,4])) 的输出结果是【 C <class‘list ’>】77、以下不能创建集合的语句是【 D s3=(1,2,3,4) 】78、python 语句 print(type((1,2,3,4))) 的输出结果是【 A <class‘tuple ’>】79、下列语句的作用是【C在D盘根文件夹下建立ppp 文件夹】>>>import os>>>os.mkdir(“d:ppp”)80、下列关于字符串的描述错误的是【 B 在字符串中,同一个字母的大小是等价的】81、下列表达式中,有3个表达式的值相同,另一个不相同,与其他 3 个表达式不同的是【 D “ABC”-“DEF”】82、已知f=lambda x.y:x+y,则f([4],[1,2,3])的值是【[4,1,2,3]】83、对于列表x,x.append(a)等价于【x+[a]】84、用户编写的python程序(避免使用依赖于系统的特性),无需修改 jiukeyi 在不同的平台上运行,这是 python 的【可移植】特性85、下列python语句的运行结果为【012234】for i in range(3):print(i,end=’’)for i in range( 2,5):print(i,end=’’)86、二进制文件的读取与写入可以分别使用【read()】和【write()】方法87、下列语句执行后的结果是【2】d={1: ’x’,2: ’y’,3: ’z’}del d[1]del d[2]d[1]= ’A’print(len(d))88、下列python语句的输出结果是【True TrueFlase True True】x=y=[1,2]x.append(3)print(x is y,x==y,end=’’)z=[1,2,3]print (x is z,x==z,y==z)89、表达式2<=1 and 0 or not 0的值是【True】90、python 的【 os】模块提供了许多文件处理方法91、下列语句的运行结果是【7】s1=[1,2,3,4]s2=[5,6,7]print(len(s1,s2))92、下列语句执行后的结果是【食品】d1={1: ’food ’}d2={1: ’食品’ ,2: ’饮料’}d1.update(d2)print(d1[1])93、在python中,设有s1={1,2,3},s2={2,3,5},则print(s1.update(s2)) 的结果为【 None 】,s1.intersction(s2) 的结果为【 {2,3,5} 】,s1.difference(s2) 的结果为【 {2} 】94、执行下列python语句后的输出结果是【1】,循环执行了【 1】次i=-1while(i<0):i*=iprint(i)95、和x/=x*y+z等价的语句是【x=x/(x*y+z)】96、字典是【无需的”关键字:值”对或key-value pair】97、在python中,传统除法运算符是【/】,整除除法运算符是【//】98、python 表达式 [i for i in range(5) if i%2!=] 的值为【 [1,3] 】,[i**2for i in range(3)] 的值为【 0,1,4 】99、在python解释器中,使用函数【help()】,可进入帮助系统100 、序列元素的编号从【 0】开始,访问序列元素的编号用【[]】括起来101 、 python 表达式 12/4-2+5*8/4%5/2的值为【1.0】102 、 python 无穷循环 while true: 的循环体中可用【 break 】语句退出循环103 、异常处理程序将可能发生异常的语句放在【try】语句中,紧跟其后可繁殖若干个对应【except 】语句。
二、实验原理:就像一个翻译要把汉语翻译成英语,必须对汉语和英语的单词、语法结构都很精通,才有可能翻译得准确无误。
另外,编译程序既然是为了完成这种功能的一个程序,就存在用什么语言来编写这个程序的问题。
这些问题在本节将逐步介绍。
现对PL/0语言编译程序的功能用“T”型图表示,并用图形概括描述PL/0编译程序的结构框架。
用语法图描述语法规则的优点是直观、易读。
在图1.1的语法图中用椭圆和圆圈中的英文字表示终结符,用长方形内的中文字表示非终结符。
所谓终结符,是构成语言文法的单词,是语法成分的最小单位,而每个非终结符也是一个语法成分。
但非终结符可由其它文法符号定义,终结符不能由其它文法符号定义。
例如,程序是由非终结符'分程序'和终结符"."组成的串定义的。
由于对某些非终结符可以递归定义,如图1.1(b)、2.1 (c)、2.1 (e)中:分程序、表达式和语句。
第一个非终结符 '程序'为文法的开始符号。
语句序列分程序1.1(d) 表达式因子如:{*}表示*重复任意次,{*}38表示*重复3-8次。
[ ] :方括号表示其内的成分为任选项。
( ) :表示圆括号内的成分优先。
例:用EBNF描述<整数>文法的定义:<整数>∷=[+|-]<数字>{<数字>}<数字>∷=0|1|2|3|4|5|6|7|8|9或更好的写法<整数>∷=[+|-]<非零数字>{<数字>}|0<非零数字>∷=1|2|3|4|5|6|7|8|9<数字>∷=0|<非零数字>PL/0语言文法的EBNF表示为:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉 {,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/〈关系运算符〉∷=#|=|<|<=|>|>=〈条件语句〉∷=IF〈条件〉THEN〈语句〉〈过程调用语句〉∷=CALL〈标识符〉〈当型循环语句〉∷=WHILE〈条件〉DO〈语句〉〈读语句〉∷=READ'('〈标识符〉{,〈标识符〉}')'〈写语句〉∷=WRITE'('〈表达式〉{,〈表达式〉}')'〈字母〉∷=a|b|…|X|Y|Z〈数字〉∷=0|1|2|…|8|9EBNF表示的符号说明。
VC++编译的常见错误1、fatal error C1010: unexpected end of file while looking for precompiled header directive。
寻找预编译头文件路径时遇到了不该遇到的文件尾。
(一般是没有#include "stdafx.h")2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory不能打开包含文件“R…….h”:没有这样的文件或目录。
3、error C2011: 'C……': 'class' type redefinition类“C……”重定义。
4、error C2018: unknown character '0xa3'不认识的字符'0xa3'。
(一般是汉字或中文标点符号)5、error C2057: expected constant expression希望是常量表达式。
(一般出现在switch语句的case分支中)6、error C2065: 'IDD_MYDIALOG' : undeclared identifier“IDD_MYDIALOG”:未声明过的标识符。
7、error C2082: redefinition of formal parameter 'bReset'函数参数“bReset”在函数体中重定义。
8、error C2143: syntax error: missing ':' before '{'句法错误:“{”前缺少“;”。
9、error C2146: syntax error : missing ';' before identifier 'dc'句法错误:在“dc”前丢了“;”。
10、error C2196: case value '69' already used值69已经用过。
(一般出现在switch语句的case分支中)11、error C2509: 'OnTimer' : member function not declared in 'CHelloView' 成员函数“OnTimer”没有在“CHelloView”中声明。
12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B'重载的函数“void reset(int)”在类“B”中找不到。
13、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。
14、error C2660: 'SetTimer' : function does not take 2 parameters “SetTimer”函数不传递2个参数。
15、warning C4035: 'f……': no return value“f……”的return语句没有返回值。
16、warning C4553: '= =' : operator has no effect; did you intend '='? 没有效果的运算符“= =”;是否改为“=”?17、warning C4700: local variable 'bReset' used without having been initialized局部变量“bReset”没有初始化就使用。
18、error C4716: 'CMyApp::InitInstance' : must return a value “CMyApp::InitInstance”函数必须返回一个值。
19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing 连接错误:不能打开P1.exe文件,以改写内容。
(一般是P1.Exe还在运行,未关闭)20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"连接时发现没有实现的外部符号(变量、函数等)VC6.0编译常见错误第一部分编译错误1. error C2001: newline in constant编号:C2001直译:在常量中出现了换行。
错误分析:(1)字符串常量、字符常量中是否有换行。
(2)在这句语句中,某个字符串常量的尾部是否漏掉了双引号。
(3)在这语句中,某个字符创常量中是否出现了双引号字符“"”,但是没有使用转义符“\"”。
(4)在这句语句中,某个字符常量的尾部是否漏掉了单引号。
(5)是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。
2. error C2015: too many characters in constant编号:C2015直译:字符常量中的字符太多了。
错误分析:单引号表示字符型常量。
一般的,单引号中必须有,也只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。
另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如:if (x == 'x || x == 'y') { … }值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。
两个单引号之间不加任何内容会引发如下错误:error C2137: empty character constant。
3. error C2018: unknown character '0x##'编号:C2018直译:未知字符‘0x##’。
错误分析:0x##是字符ASC码的16进制表示法。
这里说的未知字符,通常是指全角符号、字母、数字,或者直接输入了汉字。
如果全角字符和汉字用双引号包含起来,则成为字符串常量的一部分,是不会引发这个错误的。
4. error C2041: illegal digit '#' for base '8'编号:C2141直译:在八进制中出现了非法的数字‘#’(这个数字#通常是8或者9)。
错误分析:如果某个数字常量以“0”开头(单纯的数字0除外),那么编译器会认为这是一个8进制数字。
例如:“089”、“078”、“093”都是非法的,而“071”是合法的,等同于是进制中的“57”。
5. error C2065: 'xxxx' : undeclared identifier编号:C2065直译:标识符“xxxx”未定义。
错误分析:首先,解释一下什么是标识符。
标志符是程序中出现的除关键字之外的词,通常由字母、数字和下划线组成,不能以数字开头,不能与关键字重复,并且区分大小写。
变量名、函数名、类名、常量名等等,都是标志符。
所有的标志符都必须先定义,后使用。
标志符有很多种用途,所以错误也有很多种原因。
(1)如果“xxxx”是一个变量名,那么通常是程序员忘记了定义这个变量,或者拼写错误、大小写错误所引起的,所以,首先检查变量名是否正确。
(关联:变量,变量定义)(2)如果“xxxx”是一个函数名,那就怀疑函数名是否没有定义。
可能是拼写错误或大小写错误,当然,也有可能是你所调用的函数根本不存在。
还有一种可能,你写的函数在你调用所在的函数之后,而你有没有在调用之前对函数原形进行申明。
(关联:函数申明与定义,函数原型)(3)如果“xxxx”是一个库函数的函数名,比如“sqrt”、“fabs”,那么看看你在cpp文件已开始是否包含了这些库函数所在的头文件(.h文件)。
例如,使用“sqrt”函数需要头文件math.h。
如果“xxxx”就是“cin”或“cout”,那么一般是没有包含“iostream.h”。
(关联:#include,cin,cout)(4)如果“xxxx”是一个类名,那么表示这个类没有定义,可能性依然是:根本没有定义这个类,或者拼写错误,或者大小写错误,或者缺少头文件,或者类的使用在申明之前。
(关联:类,类定义)(5)标志符遵循先申明后使用原则。
所以,无论是变量、函数名、类名,都必须先定义,后使用。
如使用在前,申明在后,就会引发这个错误。
(6) C++的作用域也会成为引发这个错误的陷阱。
在花括号之内变量,是不能在这个花括号之外使用的。
类、函数、if、do(while)、for所引起的花括号都遵循这个规则。
(关联:作用域)(7)前面某句语句的错误也可能导致编译器误认为这一句有错。
如果你前面的变量定义语句有错误,编译器在后面的编译中会认为该变量从来没有定义过,以致后面所有使用这个变量的语句都报这个错误。
如果函数申明语句有错误,那么将会引发同样的问题。
6. error C2086: 'xxxx' : redefinition编号:C2374直译:“xxxx”重复申明。
错误分析:变量“xxxx”在同一作用域中定义了多次。
检查“xxxx”的每一次定义,只保留一个,或者更改变量名。
7. error C2374: 'xxxx' : redefinition; multiple initialization编号:C2374直译:“xxxx”重复申明,多次初始化。
错误分析:变量“xxxx”在同一作用域中定义了多次,并且进行了多次初始化。
检查“xxxx”的每一次定义,只保留一个,或者更改变量名。
8. C2143: syntax error : missing ';' before (identifier) 'xxxx'编号:C2143直译:在(标志符)“xxxx”前缺少分号。
错误分析:这是VC6的编译期最常见的误报,当出现这个错误时,往往所指的语句并没有错误,而是它的上一句语句发生了错误。