编译原理递归下降语法分析器C++简单实现

1.递归下降分析法的功能

语法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。

2.递归下降分析法的前提

改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法。

3.递归下降分析法实验设计思想及算法

为G的每个非终结符号U构造一个递归过程,不妨命名为U。U的产生式的右边指出这个过程的代码结构:

(1)若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。

(2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现, 具体为:(1)对于每个非终结符号U->u1|u2|…|un处理的方法如下

U( )

{

ch=当前符号;

if(ch可能是u1字的开头) 处理u1的程序部分;

else if(ch可能是u2字的开头)处理u2的程序部分;

…..

else error();

}

(2)对于每个右部u1->x1x2…xn的处理架构如下:

处理x1的程序;

处理x2的程序;

……

处理xn的程序;

(3)如果非终结符U有空产生式:Uàε ,则还需考虑ch属于Follow(U)的情况。

引入对空串的非特殊分析

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
char str[10];
int index = 0;void E();  // E->TX;
void X();  // X->+TX|-TX|^
void T();  // T->FY
void Y();  // Y->*FY|/FY|^
void F();  // F->(E) | i
int count;
int m ,n;
int len;
void rank1(){printf("%d\t",count);count++;
}void analyze(){if(m<0)cout<<' ';else{for(int i = 0;i <= m;i++)cout<<str[i];}cout<<'\t'<<'\t'<<'\t';
}void latter(){printf("%c",str[index]);cout<<'\t'<<'\t'<<'\t';
}void remain(){for(int j = n+1;j <= len;j++)cout<<str[j];cout<<'\n';
}/*
文法G[E]:
E→E+T|E-T|T
T→T*F|T/F|F
F→(E)|i消除左递归后:
E→TX
X→+TX|-TX|^
T→FY
Y→*FY| /FY|^
F→(E)|i
*/int main() {count = 0;m = -1,n = -1;index = 0;printf("请输入算数表达式:");scanf("%s", str);len = strlen(str);str[len] = '#';printf("步骤\t 文法\t\t 分析串\t\t\t分析字符\t\t剩余串\n");E();if (str[index] == '#')printf("正确\n");elseprintf("分析失败\n");return 0;
}void E() {rank1();printf("E -> TX\t\t");analyze();latter();remain();T();X();
}void X() {if (str[index] == '+') {rank1(); printf("X ->+TX\t\t");m++;n++;analyze();latter();remain();index++;T();X();}else if (str[index] == '-') {rank1(); printf("X ->-TX\t\t");m++;n++;analyze();latter();remain();index++;T();X();}else{rank1();printf("X -> ^\t\t");analyze();latter();remain();}
}
void T() {rank1();printf("T -> FY\t\t");analyze();latter();remain();F();Y();
}
void Y() {if (str[index] == '*') {rank1();printf("Y ->*FY\t\t");m++;n++;analyze();latter();remain();index++;F();Y();}else if (str[index] == '/') {rank1();printf("Y ->/FY\t\t");m++;n++;analyze();latter();remain();index++;F();Y();}else{rank1();printf("Y -> ^\t\t");analyze();latter();remain();}
}
void F() {if (str[index] == 'i'){rank1();printf("F ->i\t\t");m++;n++;analyze();latter();remain();index++;}else if (str[index] == '('){rank1();printf("F ->(E)\t\t"); m++;n++;analyze();latter();remain();index++;E();if (str[index] == ')') {rank1();printf("F ->(E)\t\t");m++;n++;analyze();latter();remain();index++;}else {printf("分析失败\n");exit(0);}}else{printf("分析失败\n");exit(0);}
}

/*
文法G[E]:
E→E+T|E-T|T
T→T*F|T/F|F
F→(E)|i

消除左递归后:
E→TX
X→+TX|-TX|^
T→FY
Y→*FY| /FY|^
F→(E)|i
*/

编译原理递归下降语法分析器C++实现相关推荐

  1. 《编译原理》实验报告——递归下降语法分析器的构建

    一.实验要求 运用递归下降法,针对给定的上下文无关文法,给出实验方案.预估实验中可能出现的问题. 二.实验方案 1.构造LL(1),通过设计.编制.调试递归下降语法分析程序,对输入的符号串进行分析匹配 ...

  2. 编译原理-递归下降分析器

    编译原理-简单的递归下降语法分析器LL(1) 在网上看了很多篇关于递归下降分析器的博文,均没有满意的,一是所写的程序不对.二是解释的不够清楚.所以想自己写一篇,顺便总结一下所学. 递归下降分析法 递归 ...

  3. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc

    递归下降语法分析器实验报告 编译原理实验报告 题目: 递归下降语法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁剑 指导教师 ...

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

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

  5. 编译原理 - 实验三 - 递归下降语法分析器的调试及扩展

    一. 语法分析介绍 语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备.执行语法分析任 ...

  6. 《编译原理》实验预习报告——递归下降语法分析器的构建

    一.实验目的 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对递归下降分析法的理解. 二.实验预习提示 1.递归下降分析法的功能 词法分析器的功能是利用 ...

  7. 编译原理实验-递归下降语法分析器的构建

    实验目的: 针对给定的上下文无关文法,编制一个递归下降分析程序. 分析: 递归下降语法分析的前提是保证LL(1)文法 递归下降的思路就是暴力dfs.对每个程序直接不管三七二十一搜进去,只要能搜到就继续 ...

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

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

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

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

  10. 【编译原理】LR语法分析器的设计与实现

    LR语法分析器的设计与实现 本文为当时编译原理实验作业,要求用设计的思想完成,小题大做,仅供参考 文章目录 LR语法分析器的设计与实现 实验要求 实现功能 输入输出 样例 一.LR语法分析器问题定义 ...

最新文章

  1. perl 的基本数据类型
  2. 首届中文NL2SQL挑战赛:千支队伍参赛,国防科大夺冠
  3. AIX 用户密码永不过期
  4. 阿里云VGN5i虚拟化GPU服务器价格更低的GPU计算服务
  5. sqlserver 安装共享功能什么意思_手表上的小表盘,大表盘是什么意思?它们可以带来哪些好玩的功能...
  6. 77 行代码实现 ABAP ALV 中的双击事件处理试读版
  7. django的单例模式和url分发
  8. java aopalliance-1.0.jar这个包是做什么用的?
  9. ATL是如何实现线程安全的引用计数和多线程控制的
  10. javascript 动态创建表格:新增、删除行和单元格
  11. vim学习笔记--代码折叠
  12. oracle两表联查分页公式,Oracle中分页查询和联表查询
  13. FileZilla Server下载以及安装使用
  14. ST电机库5.4.5FUL版本(ST MC SDK)
  15. 如何设计一个优惠券系统
  16. Linux内核中获取虚拟机KVM结构体信息以及vCPU个数
  17. SQL笔面试题:如何求取中位数?
  18. LittleVGL入门
  19. 网易丁磊提议统一充电接口
  20. Oracle linux7.2安装11g RAC

热门文章

  1. js数组 reduce函数
  2. FIT2CLOUD飞致云发布MeterSphere开源持续测试平台
  3. Js传参中文乱码解决方法
  4. java蓝牙串口调试,HC-05蓝牙串口调试
  5. ARM交叉编译工具链安装和使用教程【图文并茂】
  6. 详解Java中的Base64原理跟用法
  7. Android校园二手交易平台
  8. 校园二手交易平台的简要分析(纯文档)
  9. 数据库 使用 笛卡尔积两表联查 查询sql语句
  10. iphone5信号无服务器,南京苹果维修点告诉你iPhone手机显示无信号、wifi故障该怎么处理?...