编译原理中的一个小问题

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 ;
}
...全文
96 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

3,881

社区成员

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

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