c++前提:给定预测分析表,见教材 P76 表 4.1(对应文法为文法 4.2) 要求:构造出相关预测分析程序,并返回一个符号串的分析结果,如果是一个合法的符号串输出正确标志并返回 True,否则输出错误标志并返回 False。 参考:教材 P76-78 4.5 预测分析程序

时间: 2023-12-10 20:39:54 浏览: 32
以下是一个简单的 C++ 预测分析程序,用于对给定的符号串进行分析: ```c++ #include <iostream> #include <stack> #include <map> using namespace std; // 定义文法符号的类型 enum SymbolType { TERMINAL, // 终结符 NONTERMINAL // 非终结符 }; // 定义文法符号结构体 struct GrammarSymbol { string name; // 符号名称 SymbolType type; // 符号类型 }; // 文法符号比较函数,用于 map 中的键值比较 bool operator<(const GrammarSymbol& a, const GrammarSymbol& b) { return a.name < b.name || (a.name == b.name && a.type < b.type); } // 定义预测分析表的类型 typedef map<pair<GrammarSymbol, GrammarSymbol>, int> PredictiveTable; // 定义分析栈的类型 typedef stack<GrammarSymbol> AnalysisStack; // 预测分析程序函数 bool predictiveAnalysis(string str, const PredictiveTable& table) { // 初始化分析栈 AnalysisStack stack; stack.push({"$", TERMINAL}); stack.push({"S", NONTERMINAL}); // 逐个读入输入字符串中的字符 for (int i = 0; i < str.size();) { // 取出栈顶符号和当前输入字符 GrammarSymbol topSymbol = stack.top(); char curChar = str[i]; // 如果栈顶为终结符,弹出栈顶并继续下一轮循环 if (topSymbol.type == TERMINAL) { stack.pop(); continue; } // 查找预测分析表中对应的产生式编号 int production = table.at({topSymbol, {curChar, TERMINAL}}); // 如果找不到相应的产生式,说明输入串不合法 if (production == 0) { cout << "Error: Invalid input string." << endl; return false; } // 弹出栈顶符号 stack.pop(); // 将对应的产生式逆序入栈 string productionStr = to_string(production); for (int j = productionStr.size() - 1; j >= 0; j--) { char symbolName = productionStr[j]; stack.push({string(1, symbolName), NONTERMINAL}); } // 如果当前字符为终结符,继续读入下一个字符 if (str[i] != '$') { i++; } } // 如果分析栈为空且已到达输入串末尾,则输入串合法 if (stack.empty()) { cout << "Input string is valid!" << endl; return true; } else { cout << "Error: Invalid input string." << endl; return false; } } int main() { // 定义文法符号 GrammarSymbol S = {"S", NONTERMINAL}; GrammarSymbol T = {"T", NONTERMINAL}; GrammarSymbol F = {"F", NONTERMINAL}; GrammarSymbol plus = {"+", TERMINAL}; GrammarSymbol times = {"*", TERMINAL}; GrammarSymbol leftParen = {"(", TERMINAL}; GrammarSymbol rightParen = {")", TERMINAL}; GrammarSymbol id = {"i", TERMINAL}; GrammarSymbol dollar = {"$", TERMINAL}; // 定义预测分析表 PredictiveTable table; table[{S, {leftParen, TERMINAL}}] = 1; table[{T, {leftParen, TERMINAL}}] = 2; table[{F, {leftParen, TERMINAL}}] = 3; table[{S, {id, TERMINAL}}] = 4; table[{T, {id, TERMINAL}}] = 5; table[{F, {id, TERMINAL}}] = 6; table[{S, {leftParen, TERMINAL}}] = 7; table[{T, {leftParen, TERMINAL}}] = 2; table[{F, {leftParen, TERMINAL}}] = 3; table[{S, {rightParen, TERMINAL}}] = 8; table[{T, {rightParen, TERMINAL}}] = 8; table[{F, {rightParen, TERMINAL}}] = 8; table[{S, {dollar, TERMINAL}}] = 9; table[{T, {plus, TERMINAL}}] = 10; table[{F, {times, TERMINAL}}] = 11; table[{S, {plus, TERMINAL}}] = 12; table[{T, {id, TERMINAL}}] = 13; table[{F, {id, TERMINAL}}] = 6; table[{S, {times, TERMINAL}}] = 14; table[{T, {times, TERMINAL}}] = 15; table[{F, {id, TERMINAL}}] = 6; // 输入待分析字符串 cout << "Please input a string to analyze: "; string str; cin >> str; str += '$'; // 进行预测分析 predictiveAnalysis(str, table); return 0; } ``` 上述程序中,我们首先定义了文法符号的类型和结构体,并重载了 `<` 运算符,以便在预测分析表中使用 map 进行查找。然后,我们定义了预测分析表的类型和分析栈的类型,并实现了预测分析程序的主函数 `predictiveAnalysis`。该函数首先初始化分析栈,然后逐个读入输入字符串中的字符,对于每个字符,它从分析栈的栈顶取出一个符号进行分析。 如果栈顶为终结符,则直接弹出栈顶并继续下一轮循环;如果栈顶为非终结符,则在预测分析表中查找对应的产生式编号,并将对应的产生式逆序入栈。如果在预测分析表中找不到相应的产生式,说明输入串不合法。最后,如果分析栈为空且已到达输入串末尾,则输入串合法;否则,输入串不合法。 在 main 函数中,我们首先定义了文法符号,并根据文法 4.2 的预测分析表填充了预测分析表。然后,我们输入待分析字符串,并调用 `predictiveAnalysis` 函数进行预测分析。

相关推荐

最新推荐

recommend-type

C语言实现歌手大奖赛计分程序

主要为大家详细介绍了C语言实现歌手大奖赛计分程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

PPT设计理论与制作技术

1.1 为什么要选择PPT(P2) 1.2 PPT的精髓?(P3) 1.3 PPT的元素分析之一:图表(P6) 1.4 PPT 的元素分析之二:图片(P12) 1.5 PPT的元素分析之三:文字(P16) 1.6 PPT的元素分析之四:动画 (P18) 1.7 PPT...
recommend-type

android手机应用源码Imsdroid语音视频通话源码.rar

android手机应用源码Imsdroid语音视频通话源码.rar
recommend-type

营销计划汇报PPT,市场品牌 推广渠道 产品 营销策略tbb.pptx

营销计划汇报PPT,市场品牌 推广渠道 产品 营销策略tbb.pptx
recommend-type

JavaScript_超过100种语言的纯Javascript OCR.zip

JavaScript
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。