编译原理中的一个小问题

Tiger-3D 2011-03-08 04:52:05
麻烦有心人了,我很菜,很无语。。。。。。。

下面的程序可以运行,但不能输出应该的结果:可能是source.txt文件的路径有问题,但是我多次验证了路径,还是不常:

理想结果:begin real r,h,s; s = 2 * 3.14 * r * (r + h) end #
press any key to continue...

实际结果:/* 该行空着,无任何输出
press any key to continue...

soutce.txt文件中的内容:
Begin /* s = 2 * 3.14 * r * r + 2 * 3.14 * r * h /
real r, h, s ;
s = 2 * 3./
.14 * r * (r + h)
End

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

void pro_process (char *buf) //预处理程序
{
ifstream cinf ("F:\\FFF\\learning\\编译原理\\第二章\\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 ;
}
old_c =cur_c ; //保留前一个字符
}
buf[++i] ='#' ;
}

int main ()
{
//定义扫描缓冲区
char buf[4048] ={'\0'} ; //缓冲区清0
//调用预处理程序
pro_process (buf) ;
//在屏幕上显示扫描缓冲区的内容
cout <<buf <<endl ;

return 0 ;
}
...全文
153 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger-3D 2011-03-08
  • 打赏
  • 举报
回复
非常感谢高手的耐心指点。自己在按着课本写程序时,没有注意细节,在程序出错时,也没有仔细检查程序的准确性。汗。。。。。。致敬!!!
fox_ocean 2011-03-08
  • 打赏
  • 举报
回复

Begin /* s = 2 * 3.14 * r * r + 2 * 3.14 * r * h */ //这里少了一个"*"号
real r, h, s ;
s = 2 * 3\ //续航符写错了
.14 * r * (r + h)//因为.14前有两个空格,所以结果也会有,处理以下
End
void pro_process (char *buf) //预处理程序
{
ifstream cinf ("F:\\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 ;//把++i改为i++
}
}
break ;

case true :
if (old_c =='*' && cur_c =='/') //离开注释
in_comment =false ;
}
old_c =cur_c ; //保留前一个字符
}
buf[i++] ='#' ;//把++i改为i++
}
solohac 2011-03-08
  • 打赏
  • 举报
回复
文件名改正确时候,函数可以返回内容了,但是是不是你要的结果,自己分析下。
输出的时候,循环输出
cout << buf[i];
solohac 2011-03-08
  • 打赏
  • 举报
回复
F:\\FFF\\learning\\编译原理\\第二章\\source.txt
soutce.txt文件中的内容:

这2文件名,看出什么了吗? sour sout
内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统的建模与求解实践,帮助用户掌握MOPSO在实际工程问题的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧