递归下降分析程序构造方法
递归下降分析程序构造方法
作业要求
对于文法
E -> E + T | E – T | T
T ->T * F | T / F | F
F -> (E) | i
取消左递归后,改为:
E ->TE’
E’-> +TE’ | -TE’ |ε
T ->FT’
T’-> *FT’ | /FT’|ε
F ->(E) | i
经证明,该文法为LL(1)方法。
请同学们根据第4章的递归下降分析程序构造方法或者预测分析法,为该文法构造程序。该程序的功能为,给定输入,程序按照先后顺序将使用的产生式输出。
如,输入25.6 * 14.5 + 2(首先经过词法分析,将其转化为 i * i + i),则输出
E->TE’
T->FT’
F->i
T’->*FT’
F->i
T’->ε
E’->+TE’
T->FT’
F-->i
T’->ε
E’->ε
提示:
在验证程序正确性时,要考虑语法正确的串和语法不正确的串。
如: 正确的串有:
25.6 * 14.5 + 2 i * i + i
2 / 5.2 + 78 - 6 i / i + i - i
错误的串有:
2 / 5.2 + 78 – i / i + i -
+56 * 7 + i * i
对于给定的输入,大家可以通过手写推导过程,然后再核对计算机输出的产生式顺序的方法,检验程序写的对错。
Java代码解决:
<pre name="code" class="java">package Bianyiyuanli.ThirdWeek;import java.util.Scanner;
/** 运行提示: 输入整数或小数以空格和换行分开,最多支持5个字符长度的表达式:* 如:12.3 * 6 + 5 * */
public class Up_Down_Word {private static int index = 0;private static String[] string = new String[6];static void E() {// E ->TE’T();E1();System.out.println("E ->TE’");}static void E1() {// E’-> +TE’| -TE’ |εif (string[index].equals("+")) {index++;T();E1();System.out.println("E’-> +TE’");} else if (string[index].equals("-")) {index++;T();E1();System.out.println("E’-> -TE’");}}static void T() {// T->FT’F();T1();}static void T1() {// T’->*FT’ | /FT’|εif (string[index].equals("*")) {index++;F();T1();System.out.println("T’->*FT’");} else if (string[index].equals("/")) {index++;F();T1();System.out.println("T’->/FT’");}}static void F() {// F ->(E) | iif (string[index].equals("i")) {index++;System.out.println("F->i");} else if (string[index].equals("(")) {index++;E();if (string[index].equals(")")) {index++;System.out.println("F->(E)");} else {System.out.println("分析失败");}} else {System.out.println("分析失败");}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);//System.out.println("请输入算数表达式");while (!sc.equals("----")) {System.out.println("请输入算数表达式");string[5] = "#";for (int i = 0; i < 5; i++) {string[i] = sc.next();try {if (string[i].matches("^(-?\\d+)(\\.\\d+)?$")) {string[i] = "i";} else if (string[i].matches("^-?\\d+$")) {string[i] = "i";}} catch (Exception e) {}}E();System.out.println("正确语句");//string.notifyAll();}}
}
运行结果:
递归下降分析程序构造方法相关推荐
- 递归下降分析程序的设计与实现_递归就是这么简单
[这是狗哥的第51篇文章] 来自我的好朋友,EvilSay 投稿的文章.我稍微润色了一下,以下是原文: 1.什么是递归? 维基百科给出了如下定义: 程序调用自身的编程技巧称为递归.递归作为一种算法在程 ...
- 编译原理|递归下降分析子程序
递归下降分析子程序 一.实验目的 掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递归调用程序的构造方法. 二.实验内容 给定CP语言中简单算术表达 ...
- 最全!最完整的递归下降分析法代码!!! (实验报告,代码)
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对递归下降分析法的理解. 程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串 ...
- 杭电编译原理实验-实验二-递归下降分析子程序设计
递归下降分析子程序设计 实验目的 实验内容 函数定义 程序流程图 源代码 测试用例 实验目的 掌握最基本的自顶向下分析方法,即递归下降子程序方法,理解其特点和适用范围(回溯,左递归等现象),锻炼递 ...
- 递归下降分析法(编译原理)
递归下降分析法的实现方案 递归下降分析法的原理是利用函数之间的递归调用模拟语法树自上而下的构造过程,具体实现方法概述如下: 1)每个非终结符对应一个解析函数: 2)产生式右侧为该产生式左侧非终结符所对 ...
- 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现
一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...
- 递归下降分析法实现强化计算器
一. 实验概述 1.使用bison 和 flex 实现扩展版计算器 该计算器支持实型的两种表达,分别是小数和科学计数法. 该计算器支持 加, 减, 乘 除 四种运算 和括号()运算符. 该计算器支持整 ...
- 自上而下的语法分析-递归下降分析和LL(1)文法
对输入的任意单词符号串,试图用一切可能的办法,从文法开始符号(树根)出发,自上而下.自左而右地建立起一棵语法分析树,使得该树的叶结点自左而右地排列起来,刚好就是所给的输入串.显然,这一过程应该与一个最 ...
- 语法分析:自上而下分析(递归下降分析法+预测分析法)
语法分析:自上而下分析 目录 语法分析:自上而下分析 知识背景 递归下降分析法 内容一:根据文法生成子程序 内容二:调用文法开始符号所对应的子程序 预测分析法 内容一:构造预测分析表 内容二:预测分析 ...
最新文章
- Android--学习路线指南
- Linux查看文件夹大小du
- arch Failed to load module intel
- C++ Public, Protected, Private
- 【安全漏洞】浅谈Bypass Waf (基础-实战)
- 【软件工程】关于计算机的一些问答与思考
- 39 岁网络技术员入住养老院,早 6 晚 9 的作息、和老人一起追剧晒太阳!
- 使用Logstash,JDBC将数据聚合并索引到Elasticsearch中
- Linux cd命令:切换目录
- arduino uno r3引脚图_Arduino入门: 安装和熟悉Arduino IDE
- [py][mx]django分页第三方模块django-pure-pagination
- Top 10 tough core Java interview questions answers programming
- vs2015卸载指南
- putty拷贝服务器文件,Windows下拷贝Linux的文件到本地(Putty)
- (三)office2016-excel制作打钩按钮
- 2017中国之旅系列之十一:山西绵山之旅(上)
- FlashPaper组件——api
- 【华人学者风采】刘小平 中山大学
- html语言加图片,html代码——给图片加边框代码
- 中国探月工程首席科学家欧阳自远:“嫦娥”月面图千真万确
热门文章
- 学习matlab(五)——多项式、插值、极限
- iphone 数据导android,一招解决iPhone数据导入vivo手机,网友直说,太方便
- 什么牌的运动耳机比较好、运动耳机排行榜10强
- Mybatis的mapper文件中涉及大于号小于号等特殊符号使用
- 睡眠质量不好怎么改善,失眠必备五款助眠好物
- 启动OpenOffice服务
- 【滤波器设计】基于汉明窗,汉宁窗,布莱克曼窗 矩形窗设计低通FIR滤波器附matlab代码
- 家用 NAS 服务器(5)| winserver2022激活及远程桌面控制
- 15K左右的Java常见面试题(无答案)
- 车企们重金押注世界杯,值不值?