有关c文件处的讨论(部分有关编译器的词法分析)

dr2tr 2005-03-23 11:32:08
1 stream=fopen("a.txt","r");
while(!feof(stream)){ action();}
在action()函数中,有fgetc()的调用;
事实证明,我用feof()测试文件结尾是失败的(死循环),而我通过在action()中加入if((ch=getc(stream)==EOF)的话,程序就能正常结束了。为什么呢?大家说说看。

2 在词法分析的部分,我用以下程序段,请留意回退的部分。
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//字母?
{
n=0;
while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')
|| (ch>='0'&&ch<='9'))
{
if(n<20)
{
str[n]=ch;
n++;
}
ch=getch(stream);
}
str[n]='\0';
if(compare(str))//不是保留字?
{
printf("%s",str);
}
else
{
printf(" %d ",index);
}
if(ch==EOF)
exit(0);
fseek(stream,-1,SEEK_CUR);//回退
}
我觉得这样每识别一个词就做一次回退是很没效率的,但又没想到合适的方法,请大家指点阿
...全文
126 点赞 收藏 9
写回复
9 条回复
TangChin 2005年03月24日
你不是在每次action中回退了文件指针吗?
当action中读到了EOF,如果你不做处理,最后你又用fseek回退了文件指针。此时就不是EOF。
回复 点赞
yxxng 2005年03月23日
你的action是怎么写的?有循环么?
回复 点赞
dr2tr 2005年03月23日
为什么使用while(!feof(stream))和while(1)一样呢?
stream的文件指针不是一直在移动的吗?feof()可以检测到的阿
回复 点赞
TangChin 2005年03月23日
明白了。
如果那样的话,你循环的退出在action中完成
那你使用while(!feof(stream))和while(1)一样。
回复 点赞
dr2tr 2005年03月23日
顺便把我整个程序的思路简单说一下
main(){
while(!feof(stream))
action();}
action()把整个程序代码分为:变量名、数字和运算符三种,其中有循环,读完一种就返回。

action()里主要依靠fgetc()函数,并利用它每读一次就把文件指针向后移一个的原理。
回复 点赞
dr2tr 2005年03月23日
1、回退是因为ch是在action()里的变量,到主程序就没用了。
而在我的程序里,action()是用来逐个寻找标记的函数,例如我读入一个串:A3+1 :其中有三个标记:A3、“+”和“1”;根据我在上面贴出的程序,读入标记A3以后,“+”号被存在变量ch中,但是函数结束了,ch失效了,所以到下一个循环在调用action()的时候,“+”就被错过了。
ps.我刚刚看到了一个函数,ungetc()就是用来处理回退的,大家可以看看,在讨论一下。

2、TO: TangChin(我爱我家)
action()确实包括了我在第二个问题中的代码,不知道看了我上面第一点的解释,你觉得对不对。或者可能我想错了,大家讨论阿
回复 点赞
TangChin 2005年03月23日
1.如果你的action就是你在第二个问题中的代码的话,你每次action结束后
你又调用了 fseek往后退,这样你在去判断当然不会是文件尾。
2.为什么要回退?你已经读出了数据,接着往下读分析就好啦。
回复 点赞
hofer_song 2005年03月23日
库里,getc()函数注释:“The getc() function returns the next character from
stream, or EOF if the end of file is reached.”
feof()的:“The function feof() returns a nonzero value if the end of the given file stream has been reached.”
feof()函数到达文件结尾时返回非0值,否则返回0,手册上对于feof还有这样一段:“注意:即使流中没有更多要读取的字符,feof也不指示遇到文件结尾,除非要读到最后一个字符之外,这个函数通常在输入操作失败之后使用。”
问题是不是可能出在这里“feof也不指示遇到文件结尾,”
回复 点赞
archim 2005年03月23日
词法分析不需要做回退的

也就是说你可以根据当前的状态和当前输入的字符唯一地确定当时正在识别的Token
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告