状态机思想实现:消除程序文件中的注释并生成无备注文件

这篇博客介绍了如何运用状态机思想来处理C或C++源程序,有效地删除其中的单行和多行注释,同时处理特殊情况如转义字符和字符串内的注释标识。通过遍历不同状态,例如正常状态、注释开始状态、多行注释内部状态等,实现了对注释的识别和剔除,并将处理后的无注释文件保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消除程序中的注释(C语言)

最近在编译原理的学习中的实验。
对C或C++等高级程序设计语言编写的源程序中的//注释和//注释进行删除,保留删除后的源程序。
要求以文件形式进行保存。

算法分析
注释情况比较复杂,备注标识有两情况://与/*
且代码内会含有/与*,甚至有转义字符以及字符串内含有备注标识
对此我选择使用状态机进行相应的算法设计:

00)设正常状态为0,并初始为正常状态
向下遍历所有状态,全部成立或检查完毕,返回至此检查下一状态
01)状态0中遇到/,说明可能会遇到注释,则进入状态1  ex:int a = b;/
02)状态1中遇到*,说明进入多行注释部分,则进入状态2  ex:int a= b; /*
03)状态1中遇到/,说明进入单行注释部分,则进入状态4  ex:int a = b; //
04)状态1中没有遇到或/,说明/是路径符号或除号,则恢复状态0
ex:<secure/_stdio.h> or 5/3
05)状态2中遇到
,说明多行注释可能要结束,则进入状态3  ex:int a = b; /heh
06)状态2中不是遇到*,说明多行注释还在继续,则维持状态2 ex:int a = b; /hehe
07)状态3中遇到/,说明多行注释要结束,则恢复状态0  ex:int a = b; /hehe/
08)状态3中不是遇到/,说明多行注释只是遇到
,还要继续,则恢复状态2  
ex:int a = b; /heheh
09)状态4中遇到\,说明可能进入折行注释部分,则进入状态9       
ex:int a = b; //hehe
10)状态9中遇到\,说明可能进入折行注释部分,则维护状态9       
ex:int a = b; //hehe\
11)状态9中遇到其它字符,则说明进入了折行注释部分,则恢复状态4   
ex:int a = b; // hehe\a or hehe<enter>
12)状态4中遇到回车符\n,说明单行注释结束,则恢复状态0       
 ex:int a = b; //hehe
13)状态0中遇到’,说明进入字符常量中,则进入状态5   ex:char a = ’
14)状态5中遇到\,说明遇到转义字符,则进入状态6    ex:char a = ’
15)状态6中遇到任何字符,都恢复状态5   
ex:char a = ‘\n 还有如’\t’, ‘’’, ‘\’ 等 主要是防止’’’,误以为结束
16)状态5中遇到’,说明字符常量结束,则进入状态0    ex:char a = ‘\n’
17)状态0中遇到",说明进入字符串常量中,则进入状态7  ex:char s[] = "
18)状态7中遇到\,说明遇到转义字符,则进入状态8    ex:char s[] = "
19)状态8中遇到任何字符,都恢复状态7     
ex:char s[] = “\n 主要是防止”",误以为结束
20)状态7中遇到"字符,说明字符串常量结束,则恢复状态0       
 Ex:char s[] = "“hehe”

只需要在某特定状态输出字符即可(0、5、6、7、8)
if ((state == 0 && c != ‘/’) || state == 5 || state == 6 || state == 7 || state == 8){
输出动作;
}

读存文件部分

ifstream ifile; //建立文件流对象
ofstream ofile;
ifile.open(“s.cpp”); //待处理文件
ofile.open(“d.cpp”); //无备注文件
if (ifile.fail() || ofile.fail()) { //测试打开操作是否成功
cerr << “open file fail\n”;
return EXIT_FAILURE;
}

源代码

#include<iostream>
#include<fstream>    
#include<iomanip>
#include<cstdlib>
using namespace std;

int main() {
   
   
	ifstream ifile;  //建立文件流对象
	ofstream ofile;
	ifile.open("s.cpp"); 
	ofile.open("d.cpp");
	if (ifile.fail() || ofile.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值