前言
开始学习编译原理了耶~ 关于编译原理的所有练习,按照老规矩,还是用我最喜欢的C#语言来实现,运行在.NetCore平台上~ 关于这个系列的所有代码已经上传到github了,项目主页:
本次题目
对C或C++等高级程序设计语言编写的源程序中的//注释和/…/注释进行删除,保留删除后的源程序。要求以文件形式进行保存。
思路分析
程序主要功能就是消除已经编写好的源程序中的注释。在源程序中注释有两种形式,一种是单行注释,用“//”表示,另一种是多行注释,用“/…/”表示。针对这两种形式,程序中用了if..else..语句加以判断,并做出相应的处理。在这里还有可能出现另一种情况,上述两种注释符号可能出现在引号中,出现在引号中的注释符号并没有注释功能,因此在引号中出现的注释符号不应该被消除。所以,这次编写的程序将要分三种情况分析。
第一种情况,单行注释:
if (ch != temp)
{
// 这里就是单行注释
ofile.put(ch);
ch = ifile.get();
}
或者
if (ch != temp)
{
/* 这里就是单行注释 */
ofile.put(ch);
ch = ifile.get();
}
第二种情况,块注释:
if (ifile.fail() || ofile.fail())
{
cerr << "open file fail\n";
return EXIT_FAILURE;
/*返回值EXIT_FAILURE(在cstdlib库中定义),用于向操作系统报*
告打开文件失败*/
}
第三种情况,行后注释:
ifile.close(); // 关闭文件
ofile.close();
cout << "/*ret/rtr";
system("pause");
return 0;
还有一个关键的注意点
可以看到这一行
cout << "/*ret/rtr";
这个字符串用双引号包起来的代码中有很多斜杠,所以要避免将这些斜杠识别为注释。 这里我用的方法是在处理注释前先把包含注释符号的字符串替换掉,等注释删除之后,再添加回去。
实现代码
注释写得很详细啦,配合上面的思路分析,我就不再继续分析代码了~
var sReader = new StreamReader(filePath);
var newSource = "";