CodeSky 代码之空

随手记录自己的学习过程

C 一个程序查找基本语法错误

2014-02-22 23:56分类: C评论: 0

题目如下: 编写一个程序,查找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)