⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2ex9.cpp

📁 学习编译原理的实用教程.教程共分7章: 第1章 编译系统概述 第2章 词法分析 第3章 程序设计语言的语法描述 第4章 自上而下的语法分析 第5章 自下而上的语法分析 第6章 语法制导翻译
💻 CPP
字号:
//第2章 习题9
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int pro_process(int &,int,char *,int);
const int REC_LEN=128;						//半区长度
void main()									//测试驱动程序
{
	int rec_no=0;							//文件逻辑记录号
	int buf_no=0;							//半区号 
	char buf[REC_LEN*2];					//扫描缓冲区
	int ReadIn;								//从文件读入字符数
int str_len;								//半区内实际字符数
	while(1){
		buf_no = (buf_no==1) ? 0 : 1;		//半区互补轮流工作
		//调用预处理函数,入口参数说明:
		// 1.ReadIn为从文件读入字符数(传名)
		// 2.buf_no为缓冲区号(传值)
		// 3.buf为缓冲区首址(传地址)
		// 4.rec_no为记录号(传值)
		str_len=pro_process(ReadIn,buf_no,buf,rec_no);//返回值为半区内实际字符数
		if(!ReadIn) break;					//若读入字符数为0,表示文件已读完。
		//显示缓冲区内容
		cout<<"<半区号>:"<<buf_no<<endl;
		for(int t = REC_LEN*buf_no;t < REC_LEN*buf_no+str_len ; t++)
			cout<<buf[t]<<flush;
		cout<<endl;
		rec_no++;							//逻辑记录号增1
	}
}
//预处理程序
int pro_process(int &ReadIn,int buf_no,char *buf,int rec_no)
{
	int str_len=0;char c;
	ReadIn=0;
	static bool in_comment=false;			//false表示当前字符未处于注释中
	ifstream cinf("source.txt");
	cinf.seekg(rec_no*REC_LEN,ios::beg);	//文件指针定位
	while(cinf.read(&c,sizeof(c)) && ReadIn<REC_LEN){
		ReadIn++;
		if(c=='\n')ReadIn++;				//实际上读入二个控制字符,'\r'被舍去。
		switch(in_comment){
			case false:
				if(c=='{' )					//进入注释
					in_comment=true;
				else{
					buf[buf_no*REC_LEN+str_len]=(c=='\n'||c=='\t')?' ':c;
					str_len++;
					break;
				}
			case true:
				if(c=='}' )					//离开注释
					in_comment=false;
		}//end of switch
	}//end of while
	return str_len;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -