论文部分内容阅读
摘要:本文从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-),黑龙江哈尔滨人,讲师,硕士,研究方向:数据挖掘和软件工程。
关键词:词法查错;语法查错;语义查错
中图分类号: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-),黑龙江哈尔滨人,讲师,硕士,研究方向:数据挖掘和软件工程。