C //练习 5-19 修改undcl程序,使它在把文字描述转换为声明的过程中不会生成多余的圆括号。

发布时间:2024年01月14日

C程序设计语言 (第二版) 练习 5-19

练习 5-19 修改undcl程序,使它在把文字描述转换为声明的过程中不会生成多余的圆括号。

注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。
IDE工具:Visual Studio 2010

?

代码块:
#include <ctype.h>
#include <stdio.h>
#include <string.h>

#define MAXTOKEN 100
#define MAXPOINTERS 10

enum { NAME, PARENS, BRACKETS };

int gettoken(void);
int tokentype; 
char token[MAXTOKEN]; 
char out[1000]; 

int getch(void);
void ungetch(int);

int main() {
    int type;
    int i, c, pcount;
    char temp[MAXTOKEN];
    char p[MAXPOINTERS];

    while (gettoken() != EOF) {
        strcpy(out, token);
        while((type = gettoken()) != '\n')
            if (type == PARENS || type == BRACKETS)
                strcat(out, token);
            else if (type == '*') {
                pcount++;

                while ((c = getch()) == '*' || c == ' '){
                    if (c == '*'){
                        if (pcount < (MAXPOINTERS - 1))
                            pcount++;
                        else
                            break;
                    }
                }

                ungetch(c);

                for (i = 0; i < pcount; i++){
                    p[i] = '*';
                }
                p[i] = '\0';


                pcount = 0;

                sprintf(temp, "(%s%s)", p, out);
                strcpy(out, temp);
            } else if (type == NAME) {
                sprintf(temp, "%s %s", token, out);
                strcpy(out, temp);
            } else
                printf("invalid input at %s\n", token);
        printf("%s\n", out);
    }
    return 0;
}

int gettoken(void) {
    int c;
    char *p = token;

    while ((c = getch()) == ' ' || c == '\t')
        ;

    if (c == '(') {
        if ((c = getch()) == ')') {
            strcpy(token, "()");
            return tokentype = PARENS;
        } else {
            ungetch(c);
            return tokentype = '(';
        }
    } else if (c == '[') {
        for (*p++ = c; (*p++ = getch()) != ']'; )
            ;
        *p = '\0';
        return tokentype = BRACKETS;
    } else if (isalpha(c)) {
        for (*p++ = c; isalnum(c = getch()); )
            *p++ = c;
        *p = '\0';
        ungetch(c);
        return tokentype = NAME;
    }

    return tokentype = c;
}

#define BUFSIZE 100

char buf[BUFSIZE]; 
int bufp = 0; 

int getch(void) {
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c) {
    if (bufp >= BUFSIZE)
        printf("ungetch: too many characters\n");
    else
        buf[bufp++] = c;
}
文章来源:https://blog.csdn.net/navicheung/article/details/135581434
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。