递归调用

实验二 递归下降语法分析

亡梦爱人 提交于 2019-12-05 22:58:33
一、实验目的: 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验原理 每个非终结符都对应一个子程序。 该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端: 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理 每遇到一个非终结符,则调用相应的子程序 三、实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。 例如: 输入begin a:=9;x:=2*3;b:=a+x end # 输出success 输入x:=a+b*c end # 输出‘end' error 四、实验步骤 1.待分析的语言的语法(参考P90) 2.将其改为文法表示,至少包含 –语句 –条件 –表达式 3. 消除其左递归 4. 提取公共左因子 5. SELECT集计算 6. LL(1)文法判断 7. 递归下降分析程序 实现源代码如下: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 char prog[]="a+b*c

实验二 递归下降语法分析

你。 提交于 2019-12-05 22:56:52
一、实验目的: 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验原理 每个非终结符都对应一个子程序。 该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端: 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理 每遇到一个非终结符,则调用相应的子程序 三、实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。 例如: 输入begin a:=9;x:=2*3;b:=a+x end # 输出success #include <stdio.h> #include <string.h> #include <stdlib.h> char prog[]="begin a:=9;x:=2*3#",token[20],ch; int syn,p,m,n,sum; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { for(n=0;n<20;n++) token[n]=NULL; m=0; sum=0

递归

我只是一个虾纸丫 提交于 2019-12-05 19:44:40
递归 To Iterate is Human, to Recurse, Divine 递归的定义 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法 递归的三三要素 1.明确的函数要干什么 2.明确终止条件 3.提取重复逻辑,去找等价关系 递归思想的精髓 递归:递是传递传递的意思,参数需要传递到下一层去,如果把递归形容成用要是打开一扇一扇的门的话,传递的就是钥匙; 归有归还的意思,打开所有的门需要把最终的目的归还到问题开始的地方。递归的精髓是对问题的解读,需要抽象出重复的 问题和现象,通过反复的调用将结果返回。 递归的经典例子 1.阶乘 f(int n){ if(n==1)return 1; return n*f(n-1); } 2.斐波那契数列 f(int n){ if(n==1||n==2){ return 1; } return f(n-1)+f(n-2); } 3.杨辉三角 f(int x,iny){ if(y<=x&&y>=0){ if(y==0||y==x){ return 1; }else{ return f(x-1,y-1)+f(x-1,y); } } return -1; } 4.汉诺塔问题 f(int level,String begin,String end){ if(level==1){ //结束 }else{ //倒数第二层移到b f

数据结构-栈逆序

拟墨画扇 提交于 2019-12-05 19:31:40
案例三: 实现一个栈的逆序,但是只能用递归函数和这个栈本身的操作来实现,而不能自己申请另外的数据结构(from直通bat) public int get(Stack<Integer> stack){ int result = stack.pop; if(stack.isEmpty()){ return result; }else{ int last = get(stack); stack.push(result); return last; } }//该函数功能为,移除栈底元素并返回 public void reverse(Stack<Integer> stack){ if(stack.isempty()){ return ; } int i = get(stack); reverse(stack); stack.push(i); } //get方法为,把栈底元素删除并返回功能。 //以上代码为,把栈中元素逆序的主方法。 //回忆视频中调用过程的图示分析,加强理解!! View Code 重新理解递归: 流程是什么,递归思路(分治思路)。 递归的确是把大问题化成小问题,但是在化的过程中牵涉到一种分治的思想。 终止条件:什么情况下问题不需要划分了。 如何理解递归行为?系统上如何实现? 一开始,主函数。 我的这个参数指望着我的子过程给我返回。 递归函数就是系统在帮你压栈的理解:

实验二 递归下降语法分析

亡梦爱人 提交于 2019-12-05 19:11:33
一、实验目的: 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验原理 每个非终结符都对应一个子程序。 该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端: 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理 每遇到一个非终结符,则调用相应的子程序 三、实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。 例如: 输入begin a:=9;x:=2*3;b:=a+x end # 输出success 输入x:=a+b*c end # 输出‘end' error 四、实验步骤 1.待分析的语言的语法(参考P90) 2.将其改为文法表示,至少包含 –语句 –条件 –表达式 3. 消除其左递归 4. 提取公共左因子 5. SELECT集计算 6. LL(1)文法判断 7. 递归下降分析程序 连接上次博客( https://www.cnblogs.com/a131452/p/11646345.html )中的代码进行改进: #include<conio.h> #include

作业12 递归下降语法分析

血红的双手。 提交于 2019-12-05 19:02:32
一、实验目的: 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验原理 每个非终结符都对应一个子程序。 该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端: 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理 每遇到一个非终结符,则调用相应的子程序 三、实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。 例如: 输入begin a:=9;x:=2*3;b:=a+x end # 输出success 输入x:=a+b*c end # 输出‘end' error 四、实验步骤 1.待分析的语言的语法(参考P90) 2.将其改为文法表示,至少包含 –语句 –条件 –表达式 3. 消除其左递归 4. 提取公共左因子 5. SELECT集计算 6. LL(1)文法判断 7. 递归下降分析程序 来源: https://www.cnblogs.com/carmen-/p/11939781.html

PL真有意思(四):控制流

旧巷老猫 提交于 2019-12-05 16:57:04
前言 对大多数计算模型而言,顺序都是基本的东西,它确定了为完成所期望的某种工作,什么事情应该最先做,什么事应该随后做,我们可以将语言规定顺序的机制分为几个类别: 顺序执行 选择 迭代 过程抽象 递归 并发 异常处理和推断 非确定性 对于不同类别的语言对不同类别的控制流的重要性也不尽相同,比如顺序执行相比于函数式对于命令式则更加重要。而命令式中更倾向用迭代,函数则更强调递归 表达式求值 在讨论控制流之前先讨论下表达式的问题,先明确两个概念:运算符通常是指那些采用特殊语法形式的内部函数(比如+-*/等),运算对象指的是运算符的参数(如2+3,2和3就是运算对象),那么运算符和运算对象的组合就是表达式。一般根据运算符出现的位置(相对于运算对象而言),可以分为3类表示形式:前缀、中缀和后缀。比如Lisp就运用前缀语法: (+ 1 3 4 6) (* (+ 1 7) 8) 大多数命令式语言对二元运算符都使用中缀记法,而对一元运算符和其它函数使用前缀激发。但是像Lisp就全部统一使用中缀记法 优先级和结合性 大多数程序设计语言都提供丰富的内部算术。在用中缀方式(没有括号)写出就可能出现歧义。所以就需要优先级和结合性来解决歧义性,但是我觉得 妈的你写括号就完事儿了 而且不同语言的优先级和结合性也不尽相同 赋值 在纯函数式语言中,程序的基本组成部分是表达式,计算也仅是对表达式求值

实验二 递归下降语法分析

橙三吉。 提交于 2019-12-05 16:46:42
老师: MissDu  提交作业 一、实验目的: 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验原理 每个非终结符都对应一个子程序。 该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端: 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理 每遇到一个非终结符,则调用相应的子程序 三、实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。 例如: 输入begin a:=9;x:=2*3;b:=a+x end # 输出success 输入x:=a+b*c end # 输出‘end' error 四、实验步骤 1.待分析的语言的语法(参考P90) 2.将其改为文法表示,至少包含 –语句 –条件 –表达式 3. 消除其左递归 4. 提取公共左因子 5. SELECT集计算 6. LL(1)文法判断 7. 递归下降分析程序 #include<iostream> #include<stdio.h> #include<string> using namespace std;

递归思路

我的梦境 提交于 2019-12-05 15:11:13
需求:计算1*2*3*....*1000的值 常规代码: def func(arg): res = 1 for i in range(1, arg): res *= i return res 递归方法: def fun(arg): if arg == 1: return 1 return arg*(fun(arg-1)) 通过此函数发现,函数最终return的是函数本身的表达式,如果计算5以内的阶乘,他的运行如下: fun(5)调用函数fun()函数,此时arg = 5,5>1,所以会return 5 * fun(4) fun(4)会调用fun()函数,此时arg=4,4>1,所以会return 4 * fun(3) fun(3)会调用fun()函数,此时arg=3,3>1,所以会return 3 * fun(2) fun(2)会调用fun()函数,此时arg=2,2>1,所以会return 2 * fun(1) fun(1)会调用fun()函数,此时arg=1,1=1,所以会return 1 当fun(1)将值返回给fun(2)之后,此时fun(2)=fun(1)*2=2,继续往上返回给fun(3) 当fun(2)将值返回给fun(3)之后,此时fun(3)=fun(2)*3=6,继续往上返回给fun(4) 当fun(3)将值返回给fun(4)之后,此时fun(4)=fun(3)

006_函数

巧了我就是萌 提交于 2019-12-05 15:08:05
return 的功能: ①返回值;②结束所在方法 return 与 break 的区别: break 是结束本层循环; return 是结束所在的整个方法,return之后的代码不会执行。 递归 递归的理解:把一个大问题拆分成一个个小问题,解决的方法相同,有固定规律,自己调用自己。 避免无穷递归使用条件: ①得有出口条件 ②自己调用自己 ③每次分解都比上一次简单,朝着出口方向递进 来源: https://www.cnblogs.com/a276665092/p/11929921.html