C 一个程序查找基本语法错误
题目如下: 编写一个程序,查找C语言程序中的基本语法错误,如圆括号方括号花括号不能配对等。要正确处理引号(包括单引号和双引号),转义字符序列与注释。
当然只是基础版的,其中部分代码在:C 删除C语言程序中的所有注释一样。
源码:
1#include <stdio.h>
2
3int brace, brack, paren;
4
5void in_quote(int c);
6void in_comment(void);
7void search(int c);
8
9/* C语言程序初步的语法检查 */
10main(void)
11{
12 int c;
13 extern int brace, brack, paren;
14
15 while ((c = getchar()) != EOF) {
16 if (c == '/') {
17 if ((c = getchar()) == '*')
18 in_comment(); /* 评论内 */
19 else
20 search(c);
21 } else if (c == '\'' || c == '"')
22 in_quote(c); /* 引用内 */
23 else
24 search(c);
25
26 if (brace < 0) { /* 输出错误 */
27 printf("Unbalanced braces\n"); /* 大括号 */
28 brace = 0;
29 } else if (brack < 0) {
30 printf("Unbalanced brackets\n"); /* 方括号 */
31 brack = 0;
32 } else if (paren < 0) {
33 printf("Unbalanced parentheses\n"); /* 圆括号 */
34 paren = 0;
35 }
36 }
37 if (brace > 0) /* 输出错误 */
38 printf("Unbalanced braces\n");
39 if (brack > 0)
40 printf("Unbalanced brackets\n");
41 if (paren > 0)
42 printf("Unbalanced parenthess\n");
43}
44
45/* search函数:搜索一个基本语法错误 */
46void search(int c)
47{
48 extern int brace, brack, paren;
49
50 if (c == '{')
51 ++brace;
52 else if (c == '}')
53 --brace;
54 else if (c == '[')
55 ++brack;
56 else if (c == ']')
57 --brack;
58 else if (c == '(')
59 ++paren;
60 else if (c == ')')
61 --paren;
62}
63
64/* in_comment函数:在一个有效的注释内 */
65void in_comment(void)
66{
67 int c, d;
68
69 c = getchar(); /* 上一个字符 */
70 d = getchar(); /* 目前的字符 */
71 while (c != '*' || d != '/') { /* 搜索结束标志 */
72 c = d;
73 d = getchar();
74 }
75}
76
77/* 在引用内 */
78void in_quote(int c)
79{
80 int d;
81
82 while ((d = getchar()) != c) { /* 搜索结束标志 */
83 if (d == '\\')
84 getchar();
85 }
86}
87
差不多把注释翻译成汉语就懂了一大半了,不过上一篇中提到的问题依旧没明白。,再比如转义问题的解决。
刚开始我在想,为什么检测括号要大小写分开来写,不能直接!=0
吗?其实这样就会遇到诸如) (
;] ] ] [ [ [
;} } { {
也合适的问题了,所以他这么写才是合理的。
此外此程序只有到遇到EOF
才会输出,为什么与上一个程序不一样,我也没能弄明白。
评论 (0)