c++的ll(1)分析法完整代码

时间: 2023-08-20 14:04:03 浏览: 45
以下是一个简单的C++ LL(1)分析法的完整代码示例,用于分析一个类C语言的简单语法: ``` #include <iostream> #include <string> #include <vector> #include <map> using namespace std; // 定义文法符号类型 enum SymbolType { TERMINAL, NONTERMINAL }; // 定义文法符号结构体 struct Symbol { SymbolType type; // 符号类型 string name; // 符号名称 }; // 定义产生式结构体 struct Production { Symbol left; // 左部非终结符 vector<Symbol> right; // 右部符号序列 bool operator==(const Production& p) const { return left.name == p.left.name && left.type == p.left.type && right == p.right; } }; // 定义预测分析表结构体 struct ParsingTable { map<string, map<string, Production>> table; // 预测分析表 void addProduction(string nonterminal, string terminal, Production p) { table[nonterminal][terminal] = p; } }; // 定义LL(1)文法 vector<Production> grammar = { { { NONTERMINAL, "Program" }, { { NONTERMINAL, "Stmt" }, { TERMINAL, ";" }, { NONTERMINAL, "Program" } } }, { { NONTERMINAL, "Program" }, { { NONTERMINAL, "Stmt" } } }, { { NONTERMINAL, "Stmt" }, { TERMINAL, "int" }, { TERMINAL, "id" } }, { { NONTERMINAL, "Stmt" }, { { NONTERMINAL, "Expr" }, { TERMINAL, "=" }, { NONTERMINAL, "Expr" } } }, { { NONTERMINAL, "Expr" }, { TERMINAL, "id" } }, { { NONTERMINAL, "Expr" }, { TERMINAL, "num" } }, }; // 定义终结符集合和非终结符集合 vector<string> terminals = { "id", "num", ";", "=", "int" }; vector<string> nonterminals = { "Program", "Stmt", "Expr" }; // 构造LL(1)预测分析表 ParsingTable constructParsingTable() { ParsingTable table; for (auto& p : grammar) { string A = p.left.name; for (auto& a : terminals) { if (a == p.right[0].name) { table.addProduction(A, a, p); } } if (p.right[0].type == NONTERMINAL) { string B = p.right[0].name; for (auto& a : terminals) { if (p.right.size() > 1 && a == p.right[1].name) { table.addProduction(B, a, p); } else { for (auto& b : terminals) { if (b != "epsilon" && table.table[B][b].left.name == B) { table.addProduction(B, a, p); } } } } } } return table; } // 解析输入文本串 bool parseInputString(string input, ParsingTable table) { vector<Symbol> stack = { { NONTERMINAL, "Program" } }; int i = 0; while (!stack.empty()) { Symbol X = stack.back(); stack.pop_back(); if (X.type == TERMINAL) { if (X.name == input.substr(i, X.name.size())) { i += X.name.size(); } else { return false; } } else { Production p = table.table[X.name][input.substr(i, 1)]; if (p.right[0].name != "epsilon") { for (int j = p.right.size() - 1; j >= 0; j--) { stack.push_back(p.right[j]); } } } } return i == input.size(); } // 测试程序 int main() { ParsingTable table = constructParsingTable(); string input; cout << "请输入待分析的文本串:" << endl; getline(cin, input); if (parseInputString(input, table)) { cout << "输入文本串符合文法规则!" << endl; } else { cout << "输入文本串不符合文法规则!" << endl; } return 0; } ``` 以上代码仅作为示例,实际应用中需要根据具体文法和要分析的文本串进行相应的修改和调整。

相关推荐

最新推荐

recommend-type

表驱动LL(1)语法分析程序.docx

通过设计、编制和调试一个典型的LL(1)语法分析方法,进一步掌握预测分析法的语法分析方法。 1.2主要完成的任务 (1)根据LL(1)分析法编写一个语法分析程序,输入文法的FIRST(α)和FOLLOW(U)集,由程序自动生成文法的...
recommend-type

编译原理-递归下降分析法的实现-内附源码

递归下降分析法是确定的自上而下分析法,这种分析法要求文法是LL(1)文法。它的基本思想是,对文法中的每个非终结符编写一个函数(或子程序),每个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。由于...
recommend-type

4 实验四:LR分析程序的设计与实现

1、了解LR(0)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。 2、掌握LR(0)语法分析方法。
recommend-type

编译原理实习设计 语法分析程序

构造并存储预测分析表,构造分析器,并能进行出错处理,实现LL(1)分析法。 设计好一个文法,消除文法的左递归性。将消除了左递归性的文法,构造每个非终结符的FIRST和FOLLOW集合。根据FIRST和FOLLOW集合构造LL(1...
recommend-type

QT5开发及实例配套源代码.zip

QT5开发及实例配套[源代码],Qt是诺基亚公司的C++可视化开发平台,本书以Qt 5作为平台,每个章节在简单介绍开发环境的基础上,用一个小实例,介绍Qt 5应用程序开发各个方面,然后系统介绍Qt 5应用程序的开发技术,一般均通过实例介绍和讲解内容。最后通过三个大实例,系统介绍Qt 5综合应用开发。光盘中包含本书教学课件和书中所有实例源代码及其相关文件。通过学习本书,结合实例上机练习,一般能够在比较短的时间内掌握Qt 5应用技术。本书既可作为Qt 5的学习和参考用书,也可作为大学教材或Qt 5培训用书。
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

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

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