编写一个程序,查找C程序中的基本语法错误
如果要检查C语言程序中的所有语法错误,涉及编译原理方面的知识,难度较大,这里我们就编写一个检查特定范围的C语言程序语法错误:
- 圆括号、方括号、花括号是否匹配
- 单双引号、转义字符序列与注释是否符合语法规定
状态变量state
state是用来标志当前读入字符是在什么位置,比如是否在单行、多行注释内、单双引号内或者不在前述内容中。取值如下:
#define IN_SINGLE_QUOTE 4 /* 当前读入字符处于单引号内 */
#define IN_DOUBLE_QUOTE 3 /* 当前读入字符处于双引号内 */
#define IN_SINGLE_ANNOT 2 /* 当前读入字符处于单行注释 */
#define IN_MULTIPLE_ANNOT 1 /* 当前读入字符处于多行注释 */
#define OUT 0
错误代码
为了方便标识不同类错误,根据不同错误类型输出不同的错误信息等以及增强可读性,设置了这些字符常量:
#define E_SINGLE_ANN -1 /* 单行注释出错 */
#define E_MULTI_ANN -2 /* 单行注释出错 */
#define E_QUOTE -3 /* 引号不匹配出错 */
#define E_BRACKET -4 /* 括号(bracket)不匹配出错 */
#define E_ESC -5 /* 转义字符(escape character)错误 */
在C语言中使用布尔变量
其实在C语言本身是不含布尔变量的,但是后来出现了C99标准,其中新增了一个库#include <stdbool.h>
,里面定义了bool、true、false,可以想C++、Java那样使用bool
类型了。
解决问题
括号匹配
主要是通过使用栈来检查括号不匹配问题。将所有的左括号'('、'['、‘{’
都存于栈(用字符数组char stack[STACK_SIZE]
作为栈)。
如果当前读入的字符是左括号,则进栈;
如果当前字符是右括号')'、']'、‘}’
则也先加入栈,然后调用函数bool check_bracket(char stack[],int *pointer)
进行括号匹配检查,如果该右括号前面是对应的左括号,比如'('与')'
对应,则将两个括号都出栈,若不对应则说明括号不匹配,报错。
另外需要注意一点:当要检查的C程序所有内容都读入后,检查没有语法错误,在最后要再进行检查栈是否为空,若不为空,则说明栈里面有多余的未匹配的括号。
引号与转义字符
- 单引号
单引号主要检查引号里是否只有一个字符,还要检查该字符是否为转义字符,若是则需要检查是否为合格的转义字符(在程序中并未检查所有的转义字符);最后还要检查引号是否匹配。 - 双引号