212.cpp

来自「学习编译原理的实用教程.教程共分7章: 第1章 编译系统概述 第2章 词法分」· C++ 代码 · 共 47 行

CPP
47
字号
//2.1.2 源程序的输入及预处理
#include <fstream.h>
#include <iostream.h>
void pro_process(char *);
void main( )									//测试驱动程序
{
//定义扫描缓冲区
	char buf[4048]={'\0'}; 						//缓冲区清0
//调用预处理程序
	pro_process(buf);
//在屏幕上显示扫描缓冲区的内容
	cout<<buf<<endl;
}
void pro_process(char *buf)						//预处理程序
{
	ifstream cinf("source.txt",ios::in);
	int i=0; 									//计数器
	char old_c='\0',cur_c;						//前一个字符,当前字符。
	bool in_comment=false;						//false表示当前字符未处于注释中。
	while(cinf.read(&cur_c,sizeof(char))){		//从文件读一个字符
		switch(in_comment){
		case false:
			if(old_c=='/' && cur_c=='*'){		//进入注释
				i--;							//去除已存入扫描缓冲区的字符'/'
				in_comment=true;
			}
			else {
				if(old_c=='\\' && cur_c=='\n') 	//发现续行
					i--;						//去除已存入扫描缓冲区的字符'\'
				else {
					if(cur_c>='A' && cur_c<='Z')//大写变小写
						cur_c+=32; 
					if(cur_c =='\t' || cur_c =='\n')  //空格取代TAB换行
						cur_c=' '; 
					buf[i++]=cur_c ;
				}
			}
			break;
		case true:
			if(old_c=='*' && cur_c=='/')		//离开注释
				in_comment=false;
		}//end of switch
		old_c= cur_c;							//保留前一个字符
	}//end of while
	buf[i++]='#';								//在源程序尾部添加字符'#'
}

⌨️ 快捷键说明

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