您好,欢迎访问三七文档
#includeiostream#includestring#includestack#includefstreamusingnamespacestd;///////////////////////////////////////////////CBalance类//此类对于一般的C++或者C文件进行括号匹配检查//文件可以有注释,字符串……//字符串常量不可以跨行//my.h定义了常用的类库////////////////////////////////////////////classCBalance{private:ifstreamfin;//文件流intnCurrentLine;//正在处理的行号intnErrors;//已发现的错误数structCSymbol//此类记录遇到的字符和字符的行号{charcToken;intnTheLine;};enumCommentType{SlashSlash,SlashStar};//记录//和/*两中注释方式//CheckBalance()函数的工具类//CheckMatch函数用于比较两个符号是否匹配boolCheckMatch(charchar1,charchar2,intnLine1,intnLine2);//GetNextSymbol函数用于返回读到的括号charGetNextSymbol(void);//PutBackChar用于把字符重新返还给文件流voidPutBackChar(charchar1);//SkipComment根据注释符的不同跳过源文件的注释voidSkipComment(enumCommentTypetype);//SkipQuote函数用于跳过源文件中的字符串和字符常量voidSkipQuote(chartype);//NextChar函数用于得到下一个字符charNextChar(void);public:CBalance(constchar*filename);//构造函数intCheckBalance();//检查fin中的字符是否匹配};classnoFile{};//定义的异常类,当函数不存在的时候抛出异常CBalance::CBalance(constchar*filename){fin.open(filename);if(!fin)thrownoFile();nCurrentLine=1;nErrors=0;}intCBalance::CheckBalance(){structCSymbolnode;//符号与行号stackCSymbolst;//定义的符号栈charLastChar,Match;//LastChar为读入的符号,Match为栈顶的字符while(LastChar=GetNextSymbol())//从文件中读取括号字符,直到文件结束{//while_beiginswitch(LastChar){//switch_beigincase'(':case'[':case'{'://遇到这三种符号要进栈node.cToken=LastChar;node.nTheLine=nCurrentLine;st.push(node);break;case')':case']':case'}'://遇到这三种括号要进行比较if(st.isEmpty()){nErrors++;cout在第nCurrentLine有一个多余LastCharendl;}else{node=st.pop();Match=node.cToken;if(!CheckMatch(Match,LastChar,node.nTheLine,nCurrentLine))nErrors++;}break;}//switch_end}//while_endwhile(!st.isEmpty())//栈中多余的符号{nErrors++;node=st.pop();cout第node.nTheLine行的符号node.cToken不匹配endl;}returnnErrors;}boolCBalance::CheckMatch(charchar1,charchar2,intnLine1,intnLine2){if(char1=='('&&char2!=')'||char1=='['&&char2!=']'||char1=='{'&&char2!='}'){cout发现第nLine2的符号char2与第nLine1的符号char1不匹配endl;returnfalse;}returntrue;}charCBalance::GetNextSymbol(){charch;while(ch=NextChar()){if(ch=='/'){ch=NextChar();if(ch=='/')SkipComment(SlashSlash);elseif(ch=='*')SkipComment(SlashStar);elsePutBackChar(ch);}elseif(ch=='\''||ch==''){SkipQuote(ch);}elseif(ch=='['||ch=='{'||ch=='('||ch==']'||ch=='}'||ch==')'){returnch;}}returnNULL;}charCBalance::NextChar(){charch;if((ch=fin.get())==EOF)returnNULL;if(ch=='\n')nCurrentLine++;returnch;}voidCBalance::PutBackChar(charchar1){fin.putback(char1);if(char1=='\n')nCurrentLine--;}voidCBalance::SkipQuote(chartype){charch;while(ch=NextChar()){if(ch==type)return;elseif(ch=='\n'){nErrors++;cout在第nCurrentLine行缺少匹配的\'或者\endl;}elseif(ch=='\\'){ch=NextChar();}}}voidCBalance::SkipComment(enumCommentTypetype){charch,flag;if(type==SlashSlash)//对于像//注释一直读到行末尾{while((ch=NextChar())&&(ch!='\n')){return;}}flag='\0';//对于像/*这样的注释要不断的读文件while((ch=NextChar())!=NULL){if(flag=='*'&&ch=='/')return;flag=ch;}}intmain(){try{CBalanceb(123.txt);//文件要在工程当前目录下b.CheckBalance();}catch(noFile&file){cout文件打开失败!endl;}return0;}
本文标题:括号匹配C++程序
链接地址:https://www.777doc.com/doc-7026238 .html