C //练习 5-20 扩展dcl程序的功能,使它能够处理包含其他成分的声明,例如带有函数参数类型的声明、带有类似于const限定符的声明等。

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

练习 5-20 扩展dcl程序的功能,使它能够处理包含其他成分的声明,例如带有函数参数类型的声明、带有类似于const限定符的声明等。

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

 

代码块:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAXTOKEN 100enum { NAME, PARENS, BRACKETS };
enum { ERR_YES, ERR_NO };void dcl(void);
void dirdcl(void);int gettoken(void);
int tokentype; 
char token[MAXTOKEN]; 
char name[MAXTOKEN]; 
char datatype[MAXTOKEN];
char out[1000];
int errtoken = ERR_NO;int main() {while (gettoken() != EOF) {strcpy(datatype, token);out[0] = '\0';dcl(); if (tokentype != '\n')printf("syntax error\n");printf("%s: %s %s\n", name, out, datatype);}return 0;
}void dcl(void) {int ns;for (ns = 0; gettoken() == '*'; ) ns++;dirdcl();while (ns-- > 0)strcat(out, " pointer to");
}void paramdcl(void);void dirdcl(void) {int type;if (tokentype == '(') { dcl();if (tokentype != ')') {printf("missing )\n");errtoken = ERR_YES;}} else if (tokentype == NAME) strcpy(name, token);else {printf("error: expected name or (dcl)\n");errtoken = ERR_YES;}while ((type=gettoken()) == PARENS || type == BRACKETS || type == '(')if (type == PARENS)strcat(out, " function returning");else if (type == '(') {strcat(out, " function expecting");paramdcl();strcat(out, " and returning");} else {strcat(out, " array");strcat(out, token);strcat(out, " of");}
}void dclspec(void);void paramdcl(void) {do {dclspec();} while (tokentype == ',');if (tokentype != ')')printf("error: missing ) in parameter declaration");
}int typespecifier(void);
int typequalifier(void);void dclspec(void) {char temp[MAXTOKEN];temp[0] = '\0';gettoken();do {if (tokentype != NAME) {errtoken = ERR_YES;dcl();} else if (typespecifier() || typequalifier()) {strcat(temp, " ");strcat(temp, token);gettoken();} else {printf("error: unknown type in param list\n");errtoken = ERR_YES;}} while (tokentype != ',' && tokentype != ')');strcat(out, temp);if (tokentype == ',')strcat(out, ",");
}int compare(const void *s, const void *t);int typespecifier(void) {static char *type[] = { "char", "int", "void" };char *pt = token;if (bsearch(&pt, type, sizeof(type)/sizeof(char *), sizeof(char *), compare) == NULL)return 0;return 1;
}int typequalifier(void) {static char *type[] = { "const", "volatile" };char *pt = token;if (bsearch(&pt, type, sizeof(type)/sizeof(char *), sizeof(char *), compare) == NULL)return 0;return 1;
}int compare(const void *s, const void *t) {char **chs;char **cht;chs = (char **) s;cht = (char **) t;return strcmp(*chs, *cht);
}int getch(void);
void ungetch(int);int gettoken(void) {int c;char *p = token;if (errtoken == ERR_YES) {errtoken = ERR_NO;return tokentype;}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 100char 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");elsebuf[bufp++] = c;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 919 (Div. 2)补题

Satisfying Constraints&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;有三种限定方式&#xff1a; 1.k>x; 2.k<x; 3.k!x; 根据若干限定&#xff0c;找出合法的k的个数。 思路&#xff1a;通过1&#xff0c;2定出区间&#xff0c;同时记录…

基于FFmpeg的简单Android视频播放器

1. 模块分割 首先对这个视频播放器所采用的一些部件要清楚。这个播放器主要可以拆分为4个部分&#xff1a; 1.解码&#xff1a;FFmpeg 2.音频输出&#xff1a;OpenSLES 3.视频渲染&#xff1a;OpenGLES 这些框架都是基于C的api&#xff0c;因此这次我们的主要工作将会集中…

ubuntu20.04安装cuda11.4以及cudnn

系统&#xff1a;ubuntu20.04硬件配置&#xff1a;GPU3080、CPU未知通过《软件和更新》在附加驱动选项中添加了驱动&#xff1a; 1.检查自己电脑支持的cuda nvidia-smi4. 下载cuda11.4.2 wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/c…

TypeScript 从入门到进阶之基础篇(十) 抽象类篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…

AI-图片转换绚丽动漫人物-UGATIT

​​​​​​ &#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​​​​…

P1125 [NOIP2008 提高组] 笨小猴——C++

[NOIP2008 提高组] 笨小猴 题目描述 笨小猴的词汇量很小&#xff0c;所以每次做英语选择题的时候都很头疼。但是他找到了一种方法&#xff0c;经试验证明&#xff0c;用这种方法去选择选项的时候选对的几率非常大&#xff01; 这种方法的具体描述如下&#xff1a;假设 maxn…

【Databend】多表联结,你不会还没有掌握吧!

文章目录 概述和数据准备内连接交叉连接左连接右连接左反和右反连接全连接总结 概述和数据准备 多表联结是两个或多个表的列合并到一个结果集中。Databend 中支持的连接类型有 inner join 、cross join 、natural join 、left join 、right join 、left anti join 、right ant…

SqlAlchemy使用教程(二) 入门示例及通过CoreAPI访问与操作数据库

二、入门示例与基本编程步骤 在第一章中提到&#xff0c;Sqlalchemy提供了两套方法来访问数据库&#xff0c;由于Sqlalchemy 文档杂乱&#xff0c;对于ORM的使用步骤讲解杂乱&#xff0c;SqlAlchemy2.x 与j1.x版本差异也较大&#xff0c;很多介绍SqlAlchemy的文章上来就讲ORM&…

Apache Camel Jbang的dep和classpath 及-O 简单记录

在Apache Camel Jbang 官网主要提到的deps的用法&#xff0c;classpath的较少。 deps 适用于环境上有maven repository或者git 的场景&#xff0c;对于传统发布jar/war的模式下&#xff0c;classpath更适用。 DEPS和CP都支持文件内或者命令行指定&#xff0c;文件内写法为 /…

TS2307: Cannot find module ‘./App.vue‘ or its corresponding type declarations.

目录 1. 问题描述2. 解决方案一&#xff1a;VSCode Volar&#xff08;官方推荐&#xff09;3. 解决方案二&#xff1a;WebStorm 2023.2 &#xff08;官方推荐&#xff09;4. 解决方案三&#xff1a;禁用严格类型检查选项&#xff08;不推荐&#xff09;5. 解决方案四&#xff…

大模型实战营Day5 LMDeploy大模型量化部署实践

模型部署 定义 产品形态 计算设备 大模型特点 内存开销大 动态shape 结构简单 部署挑战 设备存储 推理速度 服务质量 部署方案&#xff1a;技术点 &#xff08;模型并行 transformer计算和访存优化 低比特量化 Continuous Batch Page Attention&#xff09;方案&#xff08;…

rpc的正确打开方式|读懂Go原生net/rpc包

前言 大家好&#xff0c;这里是白泽&#xff0c;之前最近在阅读字节跳动开源RPC框架Kitex的源码&#xff0c;分析了如何借助命令行&#xff0c;由一个IDL文件&#xff0c;生成client和server的脚手架代码&#xff0c;也分析了Kitex的日志组件klog。当然Kitex还有许多其他组件&…

RXJS中Subject, BehaviorSubject, ReplaySubject, AsyncSubject的区别?

在RxJS&#xff08;Reactive Extensions for JavaScript&#xff09;中&#xff0c;Subject、BehaviorSubject、ReplaySubject和AsyncSubject都是Observable的变体&#xff0c;它们用于处理观察者模式中的不同场景。以下是它们之间的主要区别&#xff1a; 1、Subject: 是一种特…

在ubuntu平台上安装minecraft

一、获取minecraft启动器安装包 登陆minecraft官网Welcome to the Minecraft Official Site | Minecraft&#xff0c;使用已经购买minecraft的microsoft或者mojang账号登陆。 点击Download Launcher 对于ubuntu系统&#xff0c;使用点击debian版本 此后便会自动下载Minecraft.…

gcc -l 参数说明

gcc -l 参数说明 -l参数就是用来指定程序要链接的库&#xff0c;-l参数紧接着就是库名&#xff0c;那么库名跟真正的库文件名有什么关系呢&#xff1f; 就拿数学库来说&#xff0c;他的库名是m&#xff0c;他的库文件名是libm.so&#xff0c;很容易看出&#xff0c;把库文件名…

【STM32】FLASH闪存

1 FLASH闪存简介 本节所指STM32内部闪存&#xff0c;即下载程序的时候&#xff0c;程序存储的地方。&#xff08;非易失性&#xff09; STM32F1系列的FLASH包含程序存储器、系统存储器&#xff08;bootloader&#xff0c;不允许修改&#xff09;和选项字节三个部分&#xff0…

Spring Cloud整体架构解析

Spring Cloud整体架构 本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 Spring Cloud的中文名我们就…

pytorch学习笔记(八)

Sequential 看看搭建了这个能不能更容易管理&#xff0c;CIFAR-10数据集进行 看一下网络模型CIFAR-10模型 1 2 3 4 5 6 7 8 9 输入进过一次卷积&#xff0c;然后经过一次最大池化&#…

YOLOv7基础 | 手把手教你简化网络结构之yolov7.yaml(包括源码+封装步骤+网络结构图)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。通过下载YOLOv7源码可知&#xff0c;原始的yolov7.yaml文件是拆开写的&#xff0c;比较混乱&#xff0c;也不好理解&#xff0c;并且为后续改进增添了很多困难。基于此种情况&#xff0c;笔者就给大家介绍一种将yolov7.yam…

企业如何判断定岗定编是否合理?

定岗定编是一项最为基础的人力资源管理工作。定岗是指明确企业所需要的岗位&#xff1b;定编是指明确企业需要多少适合企业发展的个人。在企业组织结构确定之后&#xff0c;紧接着的问题就是定岗定编。定岗定编涉及企业业务目标的落实、员工能力和数量的匹配&#xff0c;科学合…