LR(1)语法分析器

C++语言编写,已通过VS2019调试

文章目录

  • LR(1)语法分析器
      • 一、测试结果
      • 二、测试文件
      • 三、核心代码
      • 四、完整代码
    • 感谢阅读!
    • 如有错误,恳请指正!

一、测试结果



二、测试文件

在D盘下建立test.txttoken.txt两个文件(文件路径可自行修改)

test.txt内容,第一行为终结符集
=*i
S->L=R
S->R
L->*R
L->i
R->L
token.txt内容,为分析字符串
*i=i

三、核心代码

void LR1_Analyse() {CSS_LR1 p;//初始项目 S’->.S ,# p.start = css[0].start + "'";p.num = 0;//点在最前面 p.tail.push_back("#");p.next.push_back(css[0].start);I[0] = CLOSURE(p);//求闭包后的I[0]I[0].insert(I[0].begin(), p);I_count = 1;//计算项目集 for (int i = 0; i < I_count; i++) {//每个项目集  项目集I(i) cout << "===================" << endl;cout << "现在在计算项目集I" << i << endl;showI(I[i]);//展示项目集 cout << "===================" << endl;//---------求ACTION的r部分-------------- vector<CSS_LR1>::iterator t;for (t = I[i].begin(); t != I[i].end(); t++) {CSS_LR1 t2 = *t;if (t2.num == t2.next.size()) {int num = 0;for (int xp = 0; xp < CSSCount; xp++) {if (css[xp].start == t2.start && css[xp].next == t2.next) {num = xp;break;}}std::stringstream ss;ss << num;string s = ss.str();for (int q = 0; q < t2.tail.size(); q++) {ACTION[i][t2.tail[q]] = "r" + s;}if (t2.num == 1 && t2.next[0] == css[0].start) {ACTION[i]["#"] = "acc";}}}//-------------------------------------- set<string>::iterator it;for (it = VN.begin(); it != VN.end(); it++) {  //每个非终结符vector<CSS_LR1> temp;for (int j = 0; j < I[i].size(); j++) {CSS_LR1 lr = I[i][j];if (lr.num < lr.next.size() && lr.next[lr.num] == *it) {//cout<<*it<<endl; vector<CSS_LR1> t2;lr.num++;t2 = CLOSURE(lr);t2.push_back(lr);temp = temp + t2;}}//cout<<"temp.size"<< temp.size()<<endl;if (temp.size() > 0) {int k;for (k = 0; k < I_count; k++) {//找一找项目集是否已经存在 if (cmp_vector(I[k], temp)) {break;}}if (k == I_count) {//产生了新的项目集 I[I_count] = temp;cout << "  I" << i << " -- " << *it << "->" << "I" << I_count << endl << endl;GOTO[i][*it] = I_count;//更新goto表 I_count++;}else {//项目集已经存在,需要自己指向自己cout << "  I" << i << " -- " << *it << "->" << "I" << k << endl << endl;GOTO[i][*it] = k;}}}for (it = VT.begin(); it != VT.end(); it++) {  //每个终结符//cout<<"项目集I"<<i<<"输入"<<*it<<endl; vector<CSS_LR1> temp;for (int j = 0; j < I[i].size(); j++) {CSS_LR1 lr = I[i][j];if (lr.num < lr.next.size() && lr.next[lr.num] == *it) {vector<CSS_LR1> t2;lr.num++;t2 = CLOSURE(lr);//闭包求出的结果不包含本身 t2.insert(t2.begin(), lr);/求闭包遇到了一些问题 //showI(t2);temp = temp + t2;}}//cout<<"temp.size"<< temp.size()<<endl;if (temp.size() > 0) {int k;for (k = 0; k < I_count; k++) {//找一找项目集是否已经存在 if (cmp_vector(I[k], temp)) {break;}}if (k == I_count) {//产生了新的项目集 I[I_count] = temp;cout << "  I" << i << " -- " << *it << "->" << "I" << I_count << endl << endl;std::stringstream ss;ss << I_count;string s = ss.str();ACTION[i][*it] = "S" + s;//更新AVTION表 I_count++;}else {//项目集已经存在,需要自己指向自己cout << "  I" << i << " -- " << *it << "->" << "I" << k << endl << endl;std::stringstream ss;ss << k;string s = ss.str();ACTION[i][*it] = "S" + s;}}}}}

四、完整代码

下载链接


感谢阅读!

如有错误,恳请指正!

编译原理LR(1)语法分析器 C++实现相关推荐

  1. 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现

    编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...

  2. 【编译原理】词法分析器语法分析器

    简单编译器设计 采用Java语言对C++语言进行编译,具体的简单编译器设计 词法分析器-扫描器的设计与实现 基本符号表 状态转换图 代码实现 import java.io.*; import java ...

  3. 编译原理 LL(1)语法分析器的设计与实现

    实验内容 针对SysY语言中简单算术表达式文法G[E]: E→TE' E'→ATE'|ε T→FT' T'→MFT' |ε F→(E) | i A → + | - M → * | / 求解相应的FIR ...

  4. 编译原理之简单语法分析器(c语言)

    语法分析是编译过程的核心部分,其基本任务是根据语言的语法规则进行语法分析,如果不存在语法错误即给出正确的语法结果,并为语义分析和代码生成做准备. 语法分析器的两种方式 语法分析器的任务主要是确定是否可 ...

  5. 编译原理 实验2 语法分析器的构造

    [实验目的] 练习构造语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解:提高词法分析方法的实践能力 [实验要求] 利用某一高级程序设计语言构造语法分析程序 [具体要求]对于给定的文法 ...

  6. 编译原理-5-LL(1)语法分析器

    LL(1)语法分析器 1. 什么是LL(1)语法分析器 自顶向下的.递归下降的.预测分析的.适用于LL(1)文法的LL(1)语法分析器 自顶向下构建语法分析树 根节点是文法的起始符号SSS 每个中间节 ...

  7. 贵州大学-编译原理实验2-句法分析器

    贵州大学-编译原理实验2-句法分析器 考虑下面的C语言子集的文法,其中<>括起来的为非终结符,粗体为终结符. ® <statement_list> <statement_ ...

  8. LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)

    updata : 附我之前bilibili讲解视频链接 : https://www.bilibili.com/video/av63666423?share_medium=android&sha ...

  9. lr 1 语法分析器c语言,LR语法分析器

    1 LR语法分析器 本节介绍一个有效的自底向上的分析技术,可以用于一大类上下文无关文法的语法分析.这种技术叫做LR(k)分析法,其中L表示从左到右扫描输入串,R表示构造一个最右推导的逆过程,k指的是在 ...

最新文章

  1. 如何选择真正的万兆防火墙?
  2. 26 进程优先级队列Queue
  3. 关于parseInt面试题
  4. Python对文件的操作(转)
  5. php findbysql,hibernate的findByExample
  6. 初识C++之函数重载
  7. springboot test_精益求精!Spring Boot 知识点全面回顾,带你重新细读源码!
  8. Java读带有BOM的UTF-8文件乱码原因及解决方法(转)
  9. 阳振坤:电动汽车与分布式数据库的共同命运
  10. 深入剖析引用参数Ref和Out
  11. Apache Shiro(一)——Shiro简介
  12. HttpClient 4.5.3 模拟登陆CSDN
  13. 《Redis设计与实现》阅读:Redis底层研究之简单动态字符串SDS
  14. 苹果手机长截屏_发现一个手机必备软件
  15. 【CAN总线学习01】CAN网络概述
  16. 微信 speex 高清语音文件转MP3
  17. 802.11有线等效加密WEP
  18. T细胞培养方法进展及方法学对比
  19. string去掉末尾符号
  20. C语言实现PID之应用

热门文章

  1. el-upload上传失败提示框重新上传直接弹出选择文件
  2. 视频号5种提高曝光量的技巧
  3. 【教程】Excel VBA从入门到进阶(蓝色幻想) P6第6集:公式与函数
  4. 结合Vue实现344分割手机号码
  5. 设计原则(5)-迪米特法则
  6. 哪个PHP文本编辑器最好?
  7. 计算机网络(谢希仁-第八版)第五章习题全解
  8. 华为,工资岗位揭秘 2010年08月02日
  9. hnust 2186 C 层次遍历
  10. VAS授权接入开发者文档,全民共创VAS生态