C 一个程序查找基本语法错误
题目如下:
编写一个程序,查找C语言程序中的基本语法错误,如圆括号方括号花括号不能配对等。要正确处理引号(包括单引号和双引号),转义字符序列与注释。
当然只是基础版的,其中部分代码在:C 删除C语言程序中的所有注释一样。
源码:
#include <stdio.h>
int brace, brack, paren;
void in_quote(int c);
void in_comment(void);
void search(int c);
/* C语言程序初步的语法检查 */
main(void)
{
int c;
extern int brace, brack, paren;
while ((c = getchar()) != EOF) {
if (c == '/') {
if ((c = getchar()) == '*')
in_comment(); /* 评论内 */
else
search(c);
} else if (c == '\'' || c == '"')
in_quote(c); /* 引用内 */
else
search(c);
if (brace < 0) { /* 输出错误 */
printf("Unbalanced braces\n"); /* 大括号 */
brace = 0;
} else if (brack < 0) {
printf("Unbalanced brackets\n"); /* 方括号 */
brack = 0;
} else if (paren < 0) {
printf("Unbalanced parentheses\n"); /* 圆括号 */
paren = 0;
}
}
if (brace > 0) /* 输出错误 */
printf("Unbalanced braces\n");
if (brack > 0)
printf("Unbalanced brackets\n");
if (paren > 0)
printf("Unbalanced parenthess\n");
}
/* search函数:搜索一个基本语法错误 */
void search(int c)
{
extern int brace, brack, paren;
if (c == '{')
++brace;
else if (c == '}')
--brace;
else if (c == '[')
++brack;
else if (c == ']')
--brack;
else if (c == '(')
++paren;
else if (c == ')')
--paren;
}
/* in_comment函数:在一个有效的注释内 */
void in_comment(void)
{
int c, d;
c = getchar(); /* 上一个字符 */
d = getchar(); /* 目前的字符 */
while (c != '*' || d != '/') { /* 搜索结束标志 */
c = d;
d = getchar();
}
}
/* 在引用内 */
void in_quote(int c)
{
int d;
while ((d = getchar()) != c) { /* 搜索结束标志 */
if (d == '\\')
getchar();
}
}
差不多把注释翻译成汉语就懂了一大半了,不过上一篇中提到的问题依旧没明白。,再比如转义问题的解决。
刚开始我在想,为什么检测括号要大小写分开来写,不能直接!=0
吗?其实这样就会遇到诸如) (
;] ] ] [ [ [
;} } { {
也合适的问题了,所以他这么写才是合理的。
此外此程序只有到遇到EOF
才会输出,为什么与上一个程序不一样,我也没能弄明白。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。