最近做编译原理时,老师要求添加一个过滤注释的功能,这是我自己实现一种过滤方法。
//获取下一个字符 p_input 静态指针指向下一个字符
char m_getch()
{
//input* 是自定义的一个字符串
ch=input[p_input];
p_input=p_input+1;
return(ch);
}
//去除空白字符
void getbc()
{
while(ch==' '||ch==10)
{
ch=input[p_input];
p_input=p_input +1;
}
}
void retract()
{
p_input =p_input -1;
}
//过滤注释
void filter()
{
//判断 遇到'/'判断紧跟后面的字符是否'/'或'*'
if(ch=='/'){
m_getch();
if(ch=='/')
{
m_getch();
//如果是'//'类型的注释就一直getch();直到遇到换行符
while(ch!='/0'&&ch!='\n')m_getch();
getbc();
m_getch();
}else if(ch=='*')
{
m_getch();
//如果是‘/*’类型的注释一直调用getch();直到遇到'*/'
while(ch!='/0'){
if(ch=='*')
//遇到'*'判断,如果紧跟下一个字符是'/'就满足注释结束条件,否则继续循环
{m_getch();
if(ch=='/')
{
m_getch();
//
getbc();break;
}
}
else
m_getch();
}
}
else
//不是注释行就回退,判断字符'/'
retract();}
}
在主程序调用注释过滤:
while(ch=='/'&&(input[p_input]=='/'||input[p_input]=='*'))
filter();