《C语言程序设计》练习1-24 查找C程序中的基本语法错误,包括圆括号、方括号、花括号不匹配,引号、转义字符与注释等

编写一个程序,查找C程序中的基本语法错误

如果要检查C语言程序中的所有语法错误,涉及编译原理方面的知识,难度较大,这里我们就编写一个检查特定范围的C语言程序语法错误:

  1. 圆括号、方括号、花括号是否匹配
  2. 单双引号、转义字符序列与注释是否符合语法规定
状态变量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程序所有内容都读入后,检查没有语法错误,在最后要再进行检查栈是否为空,若不为空,则说明栈里面有多余的未匹配的括号。

引号与转义字符
  • 单引号
    单引号主要检查引号里是否只有一个字符,还要检查该字符是否为转义字符,若是则需要检查是否为合格的转义字符(在程序中并未检查所有的转义字符);最后还要检查引号是否匹配。
  • 双引号
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值