C程序词法和语法查错分析

来源 :计算机光盘软件与应用 | 被引量 : 0次 | 上传用户:marsxiaozhu
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:本文从C程序查错的词法错误、语法错误、语义错误和逻辑错误四个角度出发,重点对词法查错和语法查错原理进行了探究,并分别用易于口语交流的自然语言表示法、易于书面语表达的形式化表示法和利于人机交流的语法图表示法进行了分析。
  关键词:词法查错;语法查错;语义查错
  中图分类号:TP391.1 文献标识码:A文章编号:1007-9599 (2011) 07-0000-01
  C Program Lexical and Syntax Troubleshooting Analysis
   Guo Junfeng 1, Wang Kaizhu 2
  (1.Harbin Finance University,Harbin150030,China;2.Harbin Institute of Technology,Harbin150001,China)
  Abstract:This article from the C program troubleshooting lexical errors,syntax errors,semantic errors and logical errors of four point of view,focusing on the morphology and syntax troubleshooting troubleshooting principle of inquiry,and were spoken with the easy-to-natural language representation easy to express the formal written representation and exchange of beneficial human syntax diagram representation is analyzed.
  Keywords:Lexical error checking;Syntax error checking;Semantic error checking
  一、程序错误
  (一)程序错误类型
  大多数的程序错误可以简单加以归类[1]:60%是标点符号错,20%是运算符或运算对象错,15%是关键字错,剩下5%是其他类型的错误,对这些错误按性质可以分为:词法错误、语法错误、语义错误和逻辑错误。
  (二)C程序错误分析
  如有如下C程序:
  main()
  {
  int b=5;
  printf(“%d”,B);
  }
  经TC编译给出如下信息(WIN-TC亦如此)。
  •Error c1.c 4:Undefined symbol ‘B’ in function main
  •Warning c1.c 5:’b’is assigned a value which is never used in function main
  编译程序[2]把B和b认为是两个不同的变量名,而显示出两个出错信息:一个是变量B无定义,另一个是变量b赋值后未使用。其实是编程者忽略了大小写字母的区别,使之成为两个不同的字,甚至是不同的词。编译程序最基本最首要的任务是进行词法分析和语法分析。
  二、词法查错分析
  C语言按词意和用途分六类词[3]:关键字、标识符、常数、运算符、分隔符和注释符。
  词法查错程序的任务是在程序中读出一个正确的词,当词出错时,给出错误位置、性质。如语句“a=12,3;”由4个词组成“a”、“=”、“12,3”、“;”。当读到“12,3”时,指出××行常数有错。词法查错程序的关键在于识别C语言的词。C语言的词按数量可以分为有限词和无限词,对于有限词有两种识别方法:一为查表法,如将32个关键词组成关键词表,当读一个以字母打头的词时,与关键词表匹配,匹配上说明是关键词,否则不是关键词;二为程序匹配法,如注释符“/*……*/”在程序中匹配时,读入2个符号是“/*”时,则在本行找“*/”的出现,则是注释符;否则不是注释符。对于无限词用规则识别,如标识符的规则是:由字母或下划线打头,后跟字母、数字、下划线串组成。标识符、整数、八进制整数、十六进制整数、实数、指数、字符常数、常符串常数的语法图分别用S1、S2、S3、S4、S5、S6、S7、S8表示,如图1-1、1-2、1-3、1-4、1-5、1-6、1-7、1-8所示。
  
  
  
  图1-1 标识符语法图S1图1-2 整数语法图S2
  
  
  图1-3 八进制整数语法图S3 图1-4 十六进制整数语法图S4
  
  
  图1-5 实数语法图S5 图1-6 指数语法图S6
  
  
  图1-7 字符常数语法图S7 图1-8 字符串常数语法图S8
  
  
  
  
  图1-9 S1状态机
  可以将每个语法图转换成状态机[4],从左到右编写状态,开始为状态0,状态间的连线是语法单位或终结符。语法单位表示调用子状态机。以S1为例,其状态机如图1-9所示。
  词法查错程序有8个状态机,如何区分它们,或者说如何识别状态机是执行各个状态机的首要问题。观察8个状态机中第一个状态转换的条件:字母或_、数字、0、X、整数、实数、‘、“,这些条件的首字符可分为三类:字母或_、数字、符号。当是“字母或_”时,确定是状态机S1和S4;当是数字时,确定是状态机S2、S3、S5和S6;当是符号时,确定是状态机S7和S8;如何继续区分各类的状态,又要观察每类的具体字符。看第一类中的S1和S4,如首符号是“_”,则必是S1;否则,当出现X1、x1、X12、x12等时,难以区分是S1或S3。看第二类中的S2、S3、S5和S6,如首符号是“0”,则必是S3;如无小数点,则必是整数S2;如有小数点且有大小写E,则为S6,否则为S5;看第三类中的S7和S8,如首符号是“‘”,则必是S7;否则为S8。
  具体词法查错程序实现思想:首先识别区分8个状态机;其次按语法图识别每个状态机,当识别中出现非输入字符时,则该状态机出错。
  三、语法查错分析
  语法查错程序的主要任务是识别每个语句的正确性,若有错则给出错误位置和错误性质。语句分两类[4]:类型说明语句和执行语句。下面重点对类型说明语句的查错识别进行分析。
  类型说明语句中的数据类型分为三类:基本数据类型、复合数据类型和地址数据类型。基本数据类型由整型(int)、单精度型(float)、双精度型(double)、字符型(char)、无值类型(void)5种组成。复合数据类型由数组型([])、结构型(struct)、联合型(union)、枚举型(enum)4种组成。地址数据类型由指针型(*)、文件型(FILE *)2种。识别的主要方法与词法查错程序相同。就是识别每个语句的句式。
  (一)整型类型说明语句的一般句式为
  int a;或int a,b;int a=3; 或int a=3,b;等。要归纳出它的一般语法规则,一个整型说明语句是指:由整型类型说明符int开始,后跟一个或用逗号隔开的多个变量名,最后用分号结尾,每一个变量名还可以初始化。或形式化表示为:
  int变量名[=常量表达式][,变量名[=常量表达式]……];
  其中[ ]表示可有可无。[,变量名[=常量表达式]……]表示重复出现。显然,形式化表示比自然语言表示要清晰。但是,计算机不能懂得此形式化,为此,用如图1-10所示的语法图表示。
  
  
  图1-10 整型类型说明语句语法图
  由此告知计算机四件事:有一个或一组用逗号隔开的变量;是整型;有7个整数运算符;每个变量还可以初始化。
  上述用了三种表示方法:自然语言表示法用于人类口语一般交流,一个概念的叙述,往往具有多个语句形式,利于人们逐步理解;形式化表示方法用于人类书面语交流,一个概念的叙述,具有精确而唯一的表示;语法图表示方法是语法的图形描述,用C语言的“字”表示终极符,用C语言的词表示非终极符,用有向线表示走向。从语法图的开始,沿着每一方向能走到图的结尾,就是一个合法的C语言的语句。它利于编写程序,即利于人与计算机的交流。
  (二)单精度型类型说明语句的一般句式为
  float变量名[=常量表达式][,变量名[=常量表达式]……];计算机不能懂得此形式化,为此,用如图1-11所示的语法图表示。
  
  
  
  图1-11单精度类型说明语句语法图
  由此告知计算机四件事:一个或一组用逗号隔开的变量;是实型;有4个实数运算符;每个变量还可以初始化。
  (三)双精度型类型说明语句的一般句式为
  double变量名[=常量表达式][,变量名[=常量表达式]……];语法图如图1-12所示。
  
  
  图1-12 双精度类型说明语句语法图
  由此告知计算机四件事:一个或一组用逗号隔开的变量;是实型;有4个实数运算符;每个变量还可以初始化。
  (四)字符型类型说明语句的一般句式为
  char变量名[=字符常量][,变量名[=字符常量]……];语法图如图1-13所示。
  
  
  图1-13字符类型说明语句语法图
  由此告知计算机四件事:一个或一组用逗号隔开的变量;是字符型;有2个字符运算符;每个变量还可以初始化。
  数组型类型说明语句的一般句式为:
  一维数组说明语句的一般句式为:
  类型标设符 数组名[整型常量表达式];
  或类型标设符 数组名[整型常量表达式]={数值表};
  二维数组说明语句的一般句式为:按行分段和按行连续初始化
  类型标识符 数组名[整型常量表达式1][整型常量表达式2];
  或类型标识符 数组名[整型常量表达式1][整型常量表达式2]={{数值表}[,数值表……]};
  类型标识符 数组名[整型常量表达式1][整型常量表达式2]={数值表};
  归纳成一般句式为:
  类型标识符 数组名[整型常量表达式][[整型常量表达式]……];
  或类型标识符 数组名[整型常量表达式][[整型常量表达式]……]={{{数值表}[,数值表……][,{数值表}[,数值表……]……]}};
  类型标识符 数组名[整型常量表达式][[整型常量表达式]……]={数值表};
  为此,对数组类型说明语句、按行连续初始化的数组类型说明语句和按行分段初始化的数组类型说明语句语法图分别如图1-14、1-15、1-16所示。
  
  
  图1-14 数组类型说明语句语法图
  
  
  图1-15 按行连续初始化的数组类型说明语句语法图
  
  
  图1-16按行分段初始化的数组类型说明语句语法图
  由此告知计算机六件事:具有一个或多个同类型的数组;每个数组具有同类型的有序变量;方括号多少表示维数的多少;数组元素的多少由整常量表达式决定,或由整常量表达式的乘积决定;数组本身没有运算符;每个数组还可以初始化。
  执行语句共有14个语句,每个语句的语法图另有文章详述。
  四、后续研究工作
  语义查错是在C语言的词和句都没有错时,程序还存在错误,并且这些错误是语用和语义上的错误。它们表现在词、句、句间、函数间、程序组成和文件使用的关系上。程序错误按性质可以分为:词法错误、语法错误、语义错误和逻辑错误,本文只讨论了词法错误和语法错误,对于语义错误研究是后续的重点工作之一。
  参考文献:
  [1]叶明影,邵冬云,王开铸.C程序错误分析和查错研究[J].电脑学习,2010(5):102-102
  [2]陈意云.编译原理[M].北京:高等教育出版社,2003
  [3]郭俊凤,朱景福.C程序设计案例教程[M].北京:清华大学出版社,2009
  [4]王开铸.系统软件设计[M].北京:哈尔滨工业大学出版社,1999
  [作者简介]郭俊凤(1978-),黑龙江哈尔滨人,讲师,硕士,研究方向:数据挖掘和软件工程。
  
其他文献
亮点一 开放性问题开放性问题相对于传统问题中的条件结论的“封闭性”而言,其具有答案不唯一、能较好地考查学生的迁移能力与创新能力等特点.体现了新课程标准所提出的“让不
软件开发的模式贯穿于整个项目,影响到开发的整个过程。传统的软件开发有瀑布式及增量式等,本文介绍的是平行模式,其优点就是快速、高效,重要的是能节约资源成本降低项目风险。将
本文主要结合着软件开发过程,说明了项目时间管理的基本理论及其管理方法,分析了软件项目在时间管理中存在的问题,并提出了相应的建议,也探讨了目前项目时间控制的一些基本方法。
本文主要介绍了计算机网络系统设计的原则和连接技术的方法,以及在实际应用过程中的计算机网络安全问题。
云计算是基于互联网的商业计算模型,它代表IT产业由硬件转向软件、软件转向服务、分散服务转向集中服务的发展趋势。笔者介绍了云计算的相关概念,云计算的应用形式,最后对云计算
与计算机技术相结合的多媒体技术,在今天高速地发展,已有声有色地进入我们的生活,本文就以传统文献的转变来体验多媒体技术如何改变我们身边的事物的状态。
在历年各地中考中都必然会考到物质推断题,对于学生来说十分重要.同时,初中生在解答这类题型的过程中,准确性不高,很容易失分.主要是由于该题型中所包含的内容相对较多,而其条件又比
一、自然数零的自述1.初中数学中零的地位及特点在小学我仅是表示什么也没有的狭意量,而在初中就不同啦,我是一个具有明确意义的量,我小于正数,但大于一切负数,是一个中性数.
新课程标准的实施,无疑是基础教育的一场革命.新课标下数学教学过程是教师组织和引导学生主动掌握数学知识,发展数学能力,形成良好的个性心理品质的认识与发展相统一的过程.
我校大力提倡“高校课堂”——一切以学生为本的办学理念和一切以学为源的教育思想.为了适应新课标的教学要求,改变我校现行化学实验课教学的现状,本工作首先从营造和谐的化学课