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才会输出,为什么与上一个程序不一样,我也没能弄明白。

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 成品, 源码, 题目, 存疑

添加新评论