首页 > 编程知识 正文

递归下降分析程序的优缺点(递归下降解析器)

时间:2023-05-06 09:32:42 阅读:74470 作者:413

编译原理语法分析(1)递归下降分析法实验目的

根据某语法编写递归下降分析程序,分析任意输入的符号串。 这次实验的目的主要是加深对递归下降分析法的理解。

实验环境

Microsoft visual studio 2019通信

思路

为每个生成表达式创建函数。 根据生成式,如果是终端符号,则在直接使输入的字符与所请求的终端符号是否一致的非终端符号的情况下,调用与非终端符号对应的函数,将所传递的字符串与开始一致的位置作为参数。 如果在任何步骤中确定不符合语法规则,则认为该字符串有错误。 如果递归全部结束后仍未发现错误,则还需要判断剩下的字符是否匹配。 字符串不符合语法规则,因为如果存在不匹配的字符,则无法从开始字符转换为相应的状态。

产生式

(1)电子商务

)2) A-a|bAcB

(3) B型| AC

(4) C-e|dC

//syntax analysis.h # pragma once # include iostream # include ostream # include stack # include fstream # include vector # include 摘要///递归下降分析法词法分析///summaryclasssyntaxanalysis _ recursivedescentparsing { staticboole (stringstr,int pos ); 静态boola (stringstr,int pos ); 静态boolb (stringstr,int pos ); 静态boolc (stringstr,int pos ); 公共: staticvoidsyntaxanalyse _ recursivedescentparsing (stringstr; (; //syntax analysis.CPP # include ' syntax analysis.h ' usingnamespacestd; ///summary///非终结符E////summary///param name='str '要分析的字符串/param///param name='pos '开始分析的位置下标从0开始//returnsboolsyntaxanalysis _ recursivedescentparsing 33603360 e (stringstr,int pos ) Chaaram if(ch!='e ' ) { cout ' e :在第' pos1'个字符' ch '中出现错误' endl; 返回假; //使用生成表达式E - eBaAcout 'E - eBaA' endl; //Bpos; if (syntax analysis _ recursivedescentparsing :3360 b (str,pos )==false ) {return false; }//apos; ch=str[pos]; If (通道!='a ' ) { cout ' e :在第' pos1'个字符' ch '中出现错误' endl; 返回假; }//Apos; if (syntax analysis _ recursivedescentparsing :3360 a (str,pos )==false ) {return false; //生成表达式匹配到最后,但字符串后有内容if(posstr.length(-1 ) ) pos; ch=str[pos]; cout ' e :在第“pos 1”个字符“ch”中出现错误“endl; 返回假; }返回真; //summary//非终结符A////summary///param name='str '从要分析的字符串/param///param name='pos '开始分析的位置,下标从0开始//

/returns>bool SyntaxAnalysis_RecursiveDescentParsing::A(string str, int& pos){//使用产生式A -> achar ch = str[pos];if (ch == 'a'){cout << "A -> a" << endl;return true;}if (ch != 'b'){cout << "A:第" << pos + 1 << "个字符" << ch << "有错误" << endl;return false;}//使用产生式A -> bAcBcout << "A -> bAcB" << endl;//Apos++;if (SyntaxAnalysis_RecursiveDescentParsing::A(str, pos) == false){return false;}//cpos++;ch = str[pos];if (ch != 'c'){cout << "A:第" << pos + 1 << "个字符" << ch << "有错误" << endl;return false;}//Bpos++;if (SyntaxAnalysis_RecursiveDescentParsing::B(str, pos) == false){return false;}return true;}/// <summary>/// 非终结符B/// </summary>/// <param name="str">要分析的字符串</param>/// <param name="pos">开始分析的位置,下标从0开始</param>/// <returns>该字符串是否符合文法</returns>bool SyntaxAnalysis_RecursiveDescentParsing::B(string str, int& pos){char ch = str[pos];if (ch != 'a' && ch != 'd'){cout << "B:第" << pos + 1 << "个字符" << ch << "有错误" << endl;return false;}//使用产生式B -> aCif (ch == 'a'){cout << "B -> aC" << endl;//Cpos++;if (SyntaxAnalysis_RecursiveDescentParsing::C(str, pos) == false){return false;}}//使用产生式B -> dEdif (ch == 'd'){cout << "B -> dEd" << endl;//Epos++;if (SyntaxAnalysis_RecursiveDescentParsing::E(str, pos) == false){return false;}//dpos++;if (str[pos] != 'd'){cout << "B:第" << pos + 1 << "个字符" << ch << "有错误" << endl;return false;}}return true;}/// <summary>/// 非终结符C/// </summary>/// <param name="str">要分析的字符串</param>/// <param name="pos">开始分析的位置,下标从0开始</param>/// <returns>该字符串是否符合文法</returns>bool SyntaxAnalysis_RecursiveDescentParsing::C(string str, int& pos){//使用产生式C -> echar ch = str[pos];if (ch == 'e'){cout << "C -> e" << endl;return true;}if (ch != 'd'){cout << "C:第" << pos + 1 << "个字符" << ch << "有错误" << endl;return false;}//使用产生式C -> dCcout << "C -> dC" << endl;//Cpos++;if (SyntaxAnalysis_RecursiveDescentParsing::C(str, pos) == false){return false;}return true;}/// <summary>/// 递归下降分析法进行词法分析/// </summary>/// <param name="str">要分析的字符串</param>void SyntaxAnalysis_RecursiveDescentParsing::SyntaxAnalyse_RecursiveDescentParsing(string str){if (*(--str.end()) != '#')//判断是否以#结尾{cout << "不以#结尾,不符合规则" << endl;return;}str.pop_back();//弹出最后的#int pos = 0;//初始时要从0开始分析if (SyntaxAnalysis_RecursiveDescentParsing::E(str, pos)){cout << str << "#符合规则" << endl;}} cout << "------Syntax Analysis------" << endl;string str;cout << "输入要分析的字符串:";cin >> str;SyntaxAnalysis_RecursiveDescentParsing::SyntaxAnalyse_RecursiveDescentParsing(str);cout << "--------------------------" << endl << endl;

结果


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。