编译原理课程设计---LL(1)递归下降分析器
编译原理 递归下降词法分析
![编译原理 递归下降词法分析](https://img.taocdn.com/s3/m/fba7a94133687e21af45a9eb.png)
编译原理实验报告—递归下降分析法程序实验2.1 递归下降分析法一、实验目的1. 根据某一文法编制递归下降分析程序,以便对任意输入的符号串进行分析。
2. 本次实验的目的是加深对递归下降分析法的理解。
二、实验平台Windows + VC++6.0范例程序: “递归下降分析法.cpp ”三、实验内容对下列文法,用递归下降分析法对任意输入的符号串进行分析:(1)E→TG(2)G→+TG|-TG(3)G→ε(4)T→FS(5)S→*FS|/FS(6)S→ε(7)F→(E)(8)F→i1.程序功能:输入: 一个以# 结束的符号串(包括+ - * / ()i # ):例如:i+i*i-i/i#输出:(1) 详细的分析步骤,每一步使用的产生式、已分析过的串、当前分析字符、剩余串,第一步, 产生式E->TG的第一个为非终结字符,所以不输出分析串,此时分析字符为i,剩余字符i+i*i-i/i#;第二步,由第一步的E->TG的第一个为非终结字符T,可进行对产生式T->FS 分析,此时第一个仍为非终结字符F,所以不输出分析串,分析字符仍为i, 剩余字符i+i*i-i/i#;第三步,使用产生式F->i,此时的分析串为i,,分析字符为i,匹配成功,剩余字符串+i*i-i/i#;第四步,因为使用了产生式T->FS,F->i,第一个字符i匹配成功,接着分析字符+,使用产生式S->ε,进行下步;第五步,使用产生式G->+TG,此时的分析串包含i+,分析字符为+,剩余字符串+i*i-i/i#;第六步,重复对产生式T->FS,F->i的使用,对第二个i进行匹配,此时分析串i+i,分析字符为i,剩余串*i-i/i#;第七步,分析字符*,使用产生式S->*FS, 分析串i+i*,剩余串i-i/i#;第八步,字符*匹配成功后,使用产生式F->i,匹配第三个字符i,,此时剩余串-i/i#;第九步,分析字符-,只有产生式G->-TG可以产生字符-。
递归下降分析法课程设计
![递归下降分析法课程设计](https://img.taocdn.com/s3/m/279f4f635627a5e9856a561252d380eb6394237e.png)
递归下降分析法课程设计一、课程目标知识目标:1. 学生能理解递归下降分析法的概念和原理;2. 学生能掌握递归下降分析法在语法分析中的应用;3. 学生能了解递归下降分析法与其它语法分析方法的区别和联系。
技能目标:1. 学生能运用递归下降分析法对简单程序设计语言的语法进行分析;2. 学生能通过递归下降分析法编写简单的语法分析程序;3. 学生能通过案例分析和团队合作,解决递归下降分析过程中的问题。
情感态度价值观目标:1. 学生对程序设计语言的学习产生兴趣,增强学习积极性;2. 学生在递归下降分析法的实践过程中,培养解决问题的能力和团队协作精神;3. 学生通过递归下降分析法的学习,认识到程序设计语言在计算机科学中的重要性。
课程性质:本课程为计算机科学领域的一门专业课程,旨在让学生掌握递归下降分析法的基本原理和应用。
学生特点:学生具备一定的程序设计基础,对语法分析有一定了解,但可能对递归下降分析法较为陌生。
教学要求:结合学生的特点,采用案例教学、团队合作等方式,使学生能够将递归下降分析法应用于实际语法分析中,提高学生的实践能力和理论知识水平。
在教学过程中,注重引导学生积极思考,培养学生的问题解决能力和创新意识。
通过本课程的学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。
二、教学内容1. 引言:介绍语法分析在程序设计语言中的作用,引出递归下降分析法的重要性。
2. 递归下降分析法基本原理:- 语法分析的基本概念;- 递归下降分析法的定义;- 递归下降分析法的工作流程。
3. 递归下降分析法的应用:- 简单程序设计语言的语法分析;- 递归下降分析法的具体实现步骤;- 递归下降分析法在实际案例中的应用。
4. 递归下降分析法与其它语法分析方法的比较:- LL分析法;- LR分析法;- 与递归下降分析法的区别和联系。
5. 实践环节:- 编写简单的递归下降分析程序;- 分析和讨论递归下降分析过程中的问题;- 团队合作完成复杂语法分析任务。
(完整)编译原理课程设计 LL(1)递归下降分析器
![(完整)编译原理课程设计 LL(1)递归下降分析器](https://img.taocdn.com/s3/m/6a3e79f7af45b307e9719729.png)
(完整)编译原理课程设计 LL(1)递归下降分析器编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)编译原理课程设计LL(1)递归下降分析器)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)编译原理课程设计 LL(1)递归下降分析器的全部内容。
仲恺农业技术学院编译原理课程设计课程设计题目:LL(1)递归下降分析器姓名:院(系):专业班级:学号 :指导教师:设计日期:目录1、需求分析 (1)2、概要设计 (2)3、详细设计 (3)4、测试分析 (8)5、用户手册 (9)6、课程总结 (9)7、参考文献 (10)题目:LL(1)递归下降分析器1、需求分析语法分析是编译过程的核心部分。
语法分析器的任务是识别和处理比单词更大的语法单位。
如:程序设计语言中的表达式,各种说明和语句乃至全部源程序,指我们知道,语言的语法结构是用上下文无关文法描述的.按照语法分析树的建立方法,我们可以粗略地把语法分析办法分成两类,一类是自上而下分析,另一类是自下而上分析法。
而自上而下这种方法是带“回溯”的,且存在许多困难和缺点.首先,是文法的左递归性问题。
一个文法是含有左递归的,如果存在非终结符P 且,含有左递归的文法使上述的自上而下的分析过程陷入无限循环。
即,当试图用P 去匹配输入串时,我们会发现,在没有识别任何输入符号的情况下,有得重新要求P 去进行新的匹配。
因此,使用自上而下分析法必须消除文法的左递归性.其次,由于回溯,就碰到一大堆麻烦问题。
如果我们走了一大段错路,最后必须回头,那么,就应把已经做的一大堆语义工作(指中间代码产生工作和各种表格的簿记工作)推倒重来.这些事情既麻烦又费时间,所以,最好应设法消除回溯.第三,在自上而下分析过程中,当一个非终结符用某一候选匹配成功时,这种成功可能仅是暂时的。
编译原理_实验二_语法分析_递归下降分析器设计_实验报告
![编译原理_实验二_语法分析_递归下降分析器设计_实验报告](https://img.taocdn.com/s3/m/31317dcad5bbfd0a78567304.png)
递归下降分析器设计一、实验/实习过程内容:利用JavaCC生成一个MiniC的语法分析器;要求:1. 用流的形式读入要分析的C语言程序,或者通过命令行输入源程序。
2. 具有错误检查的能力,如果有能力可以输出错误所在的行号,并简单提示3. 如果输入的源程序符合MiniC的语法规范,输出该程序的层次结构的语法树具体实施步骤如下:1.把MiniC转换为文法如下<程序〉→ main()〈语句块〉〈语句块〉→{〈语句串〉}〈语句串〉→〈语句〉〈语句串〉|〈语句〉〈语句〉→〈赋值语句〉|〈条件语句〉|〈循环语句〉〈赋值语句〉→ ID =〈表达式〉;〈条件语句〉→ if〈条件〉〈语句块〉〈循环语句〉→ while〈条件〉〈语句块〉〈条件〉→(〈表达式〉〈关系符〉〈表达式〉)〈表达式〉→〈表达式〉〈运算符〉〈表达式〉|(〈表达式〉)|ID|NUM〈运算符〉→+|-|*|/〈关系符〉→<|<=|>|>=|==|!=2.消除语句中的回溯与左递归3.在eclipse环境下完成JavaCC的插件安装后,写一个JavaCC文法规范文件(扩展名为jj)4.完成的功能包括词法分析,语法分析二、代码:options {JDK_VERSION = "1.5";}PARSER_BEGIN(eg1)public class eg1 {public static void main(String args[]) throws ParseException { eg1 parser = new eg1(System.in);parser.start();}}PARSER_END(eg1)SKIP :{" "| "\r"| "\t"| "\n"}TOKEN : /* OPERATORS */{< PLUS: "+" >| < MINUS: "-" >| < MULTIPLY: "*" >| < DIVIDE: "/" >}TOKEN :{<BIGGER:">"> |<SMALLER:"<"> |<NOTVOLUTION:"!="> |<SMALLEREQDD:"<="> |<BIGGEREE:">=" > |<DOUBLE:"==">TOKEN: //关键字{<MAIN:"main"> |<VOID:"void"> |<IF:"if"> |<INT:"int"> | <WHILE:"while"> |<CHAR:"char"> | <VOLUTION:"="> }TOKEN : //定义整型数{< INTEGER: ["0" - "9"]( <DIGIT> )+ >| < #DIGIT: ["0" - "9"] >}TOKEN : //数字{<NUMBER:(<DIGIT>)+ | (<DIGIT>)+"."| (<DIGIT>)+"."(<DIGIT>)+| "."(<DIGIT>)+>}TOKEN : //标记{<COMMA:","> | <SEMICOLON:";"> | <COLON:":"> | <LEFTPARENTHESES:"("> |<RIGHTPARENTHESES:")"> | <LEFTBRACE:"{"> | <RIGHTBRACE:"}"> }TOKEN : //标识符{<IDENTIFIER:<LETTER> |<LETTER>(<LETTER> | <DIGIT> )* >|<#LETTER:["a"-"z", "A"-"Z"]>}void start():{}{<MAIN> <LEFTPARENTHESES> <RIGHTPARENTHESES> block() }void block():{}{<LEFTBRACE> string() <RIGHTBRACE>}void string():{}{yuju() (string())?}void yuju():{}{fuzhiyuju() | tiaojianyuju() | xunhuanyuju()}void fuzhiyuju():{}{<IDENTIFIER> <VOLUTION> biaodashi() <SEMICOLON>}void tiaojianyuju():{}{<IF> tiaojian() block()}void xunhuanyuju():{}<WHILE> tiaojian() block()}void tiaojian():{}{<LEFTPARENTHESES> biaodashi() guanxifu() biaodashi()<RIGHTPARENTHESES>}void biaodashi():{}{( <LEFTPARENTHESES> biaodashi() <RIGHTPARENTHESES> biaodashi2()) |(<IDENTIFIER> biaodashi2() ) | ( <NUMBER> biaodashi2() )}void biaodashi2():{}{(yunsuanfu() biaodashi() biaodashi2() )?}void yunsuanfu():{}{< PLUS > | < MINUS > |< MULTIPLY> | < DIVIDE >}void guanxifu() :{}{<BIGGER> | <SMALLER> | <NOTVOLUTION><SMALLEREQDD> | <BIGGEREE> | <DOUBLE>}三、实验/实习总结本次实习,我使用javacc完成了包括词法分析,语法分析(输出语法树),能够读文件的功能,总的来说比较满意,通过本次实习掌握了javacc基本的使用。
编译原理-实验报告2-递归下降分析法
![编译原理-实验报告2-递归下降分析法](https://img.taocdn.com/s3/m/02578797ba1aa8114531d91b.png)
计算机硬件实验室实验报告一、实验目的:根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。
本次实验的目的主要是加深对递归下降分析法的理解。
二、实验要求:对下列文法,用递归下降分析法对任意输入的符号串进行分析:(1)E->TG(2)G->+TG|—TG(3)G->ε(4)T->FS(5)S->*FS|/FS(6)S->ε(7)F->(E)(8)F->i输出的格式如下:(1)递归下降分析程序,编制人:姓名,学号,班级(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#(3)输出结果:i+i*i#为合法符号串备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。
注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);三、实验过程:程序设计:1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。
2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。
程序编写:1.定义部分:定义常量、变量、数据结构。
2.初始化:从文件将输入符号串输入到字符缓冲区中。
3.利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
四、实验结果(1)程序流程图(2)运行结果示例程序:#include <>#include<>#include<>#include<>char a[50] ,b[50],d[500],e[10];char ch;int n1,i1=0,flag=1,n=5;int E();int E1();int T();int G();int S();int F();void input();void input1();void output();void main() /*递归分析*/{int f,p,j=0;char x;d[0]='E';d[1]='=';d[2]='>';d[3]='T';d[4]='G';d[5]='#';printf("递归下降分析程序,编制人:武普泉,20号,1020562班\n");printf("输入一以#结束的符号串(包括+ - * / ( ) i #,且长度小于50):");do{scanf("%c",&ch);a[j]=ch;j++;}while(ch!='#');n1=j;ch=b[0]=a[0];printf("文法\t分析串\t\t\t分析字符\t\t剩余串\n");f=E1();if(f==0) return ;if (ch=='#'){ printf("accept\n");p=0;x=d[p];// {// printf("%c",x);p=p+1;x=d[p]; /*输出推导式*/ // }while(a[p]!='#')printf("%c",a[p++]);printf("为合法字符!\n");}else {// printf("error\n");j=0;while(a[j]!='#')printf("%c",a[j++]);printf("非法字符!\n");printf("回车返回\n");getchar();getchar();return;}printf("\n");printf("回车返回\n");getchar();getchar();}int E1(){ int f,t;printf("E-->TG\t");flag=1;input();input1();f=T();if (f==0) return(0);t=G();if (t==0) return(0);else return(1);}int E(){ int f,t;printf("E-->TG\t");e[0]='E';e[1]='=';e[2]='>';e[3]='T';e[4]='G';e[5]='#';output();flag=1;input();input1();f=T();if (f==0)return(0);t=G();if (t==0) return(0);else return(1);}int T(){ int f,t;printf("T-->FS\t");e[0]='T';e[1]='=';e[2]='>';e[3]='F';e[4]='S';e[5]='#';output();flag=1;input();input1();f=F();if (f==0)return(0);t=S();if (t==0) return(0);else return(1);}int G(){int f;if(ch=='+'){b[i1]=ch;printf("G-->+TG\t");e[0]='G';e[1]='=';e[2]='>';e[3]='+';e[4]='T';e[5]='G';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=T();if (f==0)return(0);f=G();if(f==0)return 0;else return 1;}else if(ch=='-'){b[i1]=ch;printf("G-->-TG\t");e[0]='G';e[1]='=';e[2]='>';e[3]='-';e[4]='T';e[5]='G';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=T();if (f==0){// printf("G=%d\n",f);return(0);}f=G();if(f==0)return 0;else return 1;}else{printf("G-->^\t");e[0]='G';e[1]='=';e[2]='>';e[3]='^';e[4]='#';output();flag=1;input();input1();return(1);}}int S(){int f,t;if(ch=='*'){b[i1]=ch;printf("S-->*FS\t");e[0]='S';e[1]='=';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=F();if (f==0)return(0);t=S();if (t==0)return(0);else return(1);}else if(ch=='/'){b[i1]=ch;printf("S-->/FS\t");e[0]='S';e[1]='=';e[2]='>';e[3]='/';e[4]='F';e[5]='S';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=F();if (f==0)return(0);t=S();if (t==0)return(0);else return(1);}else{printf("S-->^\t");e[0]='S';e[1]='=';e[2]='>';e[3]='^';e[4]='#';output();flag=1;a[i1]=ch;input();input1();return(1);}}int F(){ int f;int j;if(ch=='('){b[i1]=ch;printf("F-->(E)\t");e[0]='F';e[1]='=';e[2]='>';e[3]='(';e[4]='E';e[5]=')';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=E();if (f==0) return(0);if(ch==')'){b[i1]=ch;printf("F-->(E)\t");flag=0;input();input1();ch=a[++i1];}else{printf("error\n");j=0;while(a[j]!='#')printf("%c",a[j++]);printf("非法字符!\n");return(0);}}else if(ch=='i'){b[i1]=ch;printf("F-->i\t");e[0]='F';e[1]='=';e[2]='>';e[3]='i';e[4]='#';output();flag=0;input();input1();ch=a[++i1];}else {printf("error\n");j=0;while(a[j]!='#')printf("%c",a[j++]);printf("非法字符!\n");return(0);}return(1);}void input(){int j=0;for (;j<=i1-flag;j++)printf("%c",b[j]); /*输出分析串*/printf("\t\t\t");printf("%c\t\t\t",ch); /*输出分析字符*/ }void input1(){int j;for (j=i1+1-flag;j<n1;j++)printf("%c",a[j]); /*输出剩余字符*/printf("\n");}void output(){ /*推导式计算*/ int m,k,j,q;int i=0;m=0;k=0;q=0;i=n;d[n]='=';d[n+1]='>';d[n+2]='#';n=n+2;i=n;i=i-2;while(d[i]!='>'&&i!=0) i=i-1;i=i+1;while(d[i]!=e[0]) i=i+1;q=i;m=q;k=q;while(d[m]!='>') m=m-1;m=m+1;while(m!=q) {d[n]=d[m];m=m+1;n=n+1;}d[n]='#';for(j=3;e[j]!='#';j++){d[n]=e[j];n=n+1;}k=k+1;while(d[k]!='=') {d[n]=d[k];n=n+1;k=k+1;}d[n]='#';}。
递归下降分析器的设计
![递归下降分析器的设计](https://img.taocdn.com/s3/m/434d2fc5d5bbfd0a79567397.png)
河北大学工商学院编译原理实验报告年级09级学号姓名成绩专业计算机科学与技术实验地点B3-216 指导教师李凯实验项目递归下降分析器的设计实验日期2012/5/14实验报告要求:一、实验目的1. 实验目的使用递归子程序法设计一个语法分析程序,理解自顶向下分析方法的原理,掌握手工编写语法分析程序的方法。
2.了解什么是LL(1)文法的,以及如何把一个非ll(1)的文法转化为非ll(1)型文法,深入了解如何根据ll(1)文法编写递归子程序,实现语法的检查。
3.深入了解编译程序语法分析的过程。
二、实验原理1. 基本原理递归下降法是语法分析中最易懂的一种方法。
它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。
因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。
其中子程序的结构与产生式结构几乎是一致的。
2. 文法要求递归下降法要满足的条件:假设 A 的全部产生式为A α1|α2|……|αn ,则必须满足如下条件才能保证可以唯一的选择合适的产生式Select(A-> αi)∩select(A ->αj)=Φ,当i≠j,即要求文法必需满足ll(1)文法。
3.开发工具要求本程序使用C语言写的,要求掌握C语言的基本语法和语义,特别是关于程序递归调用的要求。
4.文法的BNF式:E->EaT|T;T->TbF|FF->(E)|da:=+|-b:=*|/消除左递归之后的文法E->TE’E’->aTE’|εT->bFT’|εT’->bFT’F->(E)|da:=+|-b:=*|/三、实验要求【目的】使用递归子程序法设计一个语法分析程序,理解自顶向下分析方法的原理,掌握手工编写语法分析程序的方法。
【要求】1、使用递归下降分析算法分析表达式文法:exp ::= exp addop term | termaddop ::= + | -term ::= term mulop factor | factormulop ::= * | /factor ::= (exp) | number其中number可以是多位的十进制数字串(整数即可),因此这里还需要一个小的词法分析器来得到number的值。
编译原理---递归下降分析法
![编译原理---递归下降分析法](https://img.taocdn.com/s3/m/d148d3d509a1284ac850ad02de80d4d8d15a01e0.png)
编译原理---递归下降分析法所谓递归下降法 (recursive descent method),是指对⽂法的每⼀⾮终结符号,都根据相应产⽣式各候选式的结构,为其编写⼀个⼦程序 (或函数),⽤来识别该⾮终结符号所表⽰的语法范畴。
例如,对于产⽣式E′→+TE′,可写出相应的⼦程序如下:exprprime( ){if (match (PLUS)){advance( );term( );exprprime( );}}其中:函数match()的功能是,以其实参与当前正扫视的符号 (单词)进⾏匹配,若成功则回送true,否则回送false;函数advance()是⼀个读单词⼦程序,其功能是从输⼊单词串中读取下⼀个单词,并将它赋给变量Lookahead;term则是与⾮终结符号T相对应的⼦程序。
诸如上述这类⼦程序的全体,便组成了所需的⾃顶向下的语法分析程序。
应当指出,由于⼀个语⾔的各个语法范畴 (⾮终结符号)常常是按某种递归⽅式来定义的,此种特点也就决定了这组⼦程序必然以相互递归的⽅式进⾏调⽤,因此,在实现递归下降分析法时,应使⽤⽀持递归调⽤的语⾔来编写程序。
所以,通常也将上述⽅法称为递归⼦程序法。
例4 2对于如下的⽂法G[statements]:statements→expression; statements |εexpression→term expression′expression′→+term expression′ |εterm→factor term′term′→*factor term′ |εfactor→numorid | (expression)通过对其中各⾮终结符号求出相应的FIRST集和FOLLOW集 (计算FIRST集和FOLLOW集的⽅法后⾯再做介绍),可以验证,此⽂法为⼀LL(1)⽂法,故可写出递归下降语法分析程序如程序41所⽰(其中,在⽂件lex.h⾥,将分号、加号、乘号、左括号、右括号、输⼊结束符及运算对象分别命名为SEMI,PLUS,TIMES,LP,RP,EOI及NUMORID,并指定了它们的内部码;此外,还对外部变量yytext,yyleng及yylineno进⾏了说明)。
编译原理实验报告二递归下降语法分析程序 (1)
![编译原理实验报告二递归下降语法分析程序 (1)](https://img.taocdn.com/s3/m/2278efa02cc58bd63186bd72.png)
编译原理实验报告实验名称:编写递归下降语法分析程序实验类型:验证型实验指导教师:专业班级:姓名:学号:电子邮件:实验地点:实验成绩:日期:201 年 5 月 25 日一、实验目的通过设计、调试递归下降语法分析程序,实现用词法分析从源程序中分出各种单词并对词法分析程序提供的单词序列进行语法检查和结构分析,熟悉并掌握常用的语法分析方法。
明确语法分析器的功能,在词法分析的基础上进一步分析程序;加深对课堂教学的理解;提高语法分析方法的实践能力;通过本实验,应达到以下目标:1、掌握递归下降的结构模型。
2、掌握语法分析的实现方法。
3、上机调试编出的语法分析程序。
二、实验过程有了第一次的经验,这次还是先画出流程图。
流程图如下:三、实验结果语法分析实验成功。
赋值时少写数字:缺少括号时:附(txt文档内容):程序运行后写入的:四、讨论与分析这个程序是在实验一的基础上写的,用的递归下降的方法。
不止能识别,还能判断一些语法的正误。
刚看书上附录的代码时,头都大了,觉得自己完成不了。
但是真正一步一步看下去,画出了流程图,就很清晰明白了。
一个函数嵌套一个函数,一步一步往细处走,刚开始是大体轮廓,然后就深入,直到最低层的判断。
书上的程序还是有一些漏洞,比如要写多个语句时,if,for,while在语句内不能加括号,不然只能分析至第一个,遇到“}”就结束了,所以在txt文件里写程序代码的时候要注意不能加{},这样才可以全部printf出来。
五、附录:关键代码(给出适当注释,可读性高)全部代码附vc++,这里粘贴主程序,以及各类函数。
int TESTparse();int TESTscan();int program();int compound_stat();int statement();int expression_stat();int expression();int bool_expr();int additive_expr();int term();int factor();int if_stat();int while_stat();int for_stat();int write_stat();int read_stat();int declaration_stat();int declaration_list();int statement_list();int compound_stat();#include<stdio.h>#include<ctype.h>int TESTscan();int TESTparse();FILE *fin,*fout;void main(){int es=0;es=TESTscan();if(es>0)printf("词法分析有错!编译停止!\n");else{printf("词法分析成功!\n");}if(es==0){es=TESTparse();if(es==0)printf("语法分析成功!\n");elseprintf("语法分析错误!\n");}}六、实验者自评这个实验比第一个有难度,是在第一个完成的基础上进行的。
编译原理实验(递归向下语法分析法实验)
![编译原理实验(递归向下语法分析法实验)](https://img.taocdn.com/s3/m/5c4f2568561252d380eb6eac.png)
//定义一个数组大小常量
char string[N];
//定义一个用于存储算式字符串的数组
char *p;
//定义一个全局字符指针变量
函数说明:
1) 非终结符函数 E()
函数功能描述:根据以上文法要求 E->TG,所以从主函数开始调入第一个非终结符函数
执行,显示调用产生式,依次嵌套调用非终结符函数 T()和 G(),进行递归向下分析。
void E(){printf("E--->TG..............%c\n",ch);
T();
G();}
2) 非终结符函数 T()
函数功能描述:根据以上文法要求 T->FS,首先显示算式匹配所用的显示调用的产生式,
依次嵌套调用非终结符函数 F()和 S(),进行递归向下分析。
void T(){
(3)G->ε
(4)T->FS
(5)S->*FS| / FS
(6)S->ε
(7)F->(E)
(8)F->i
输入出的格式如下:
(1)E 盘建立一个文本文档" 222.txt"存储一个以#结束的符号串(包括+—*/()i#),在此
位置输入符号串例如:i+i*i#
(2)输出结果:i+i*i#为合法符号串
备注:输入一符号串如 i+i*#,要求输出为“非法的符号串”
此法分析,通过实验我对本章的语法分析也有了深刻的认识。同时通过本次编程,让我深刻
认识编程应该注重细节,编程之前首先要做好分析准备。
五、程序源代码
#include<stdio.h>
#include<stdlib.h>
递归下降分析课程设计
![递归下降分析课程设计](https://img.taocdn.com/s3/m/99099b527dd184254b35eefdc8d376eeaeaa172a.png)
递归下降分析课程设计一、课程目标知识目标:1. 理解递归下降分析的基本概念,掌握其工作原理和应用场景。
2. 学会运用递归下降分析法对简单程序代码进行语法分析,识别语法错误。
3. 了解递归下降分析在编译原理中的应用,明确其在编程语言处理中的重要性。
技能目标:1. 能够运用递归下降分析法编写简单的语法分析程序,对给定程序进行语法检查。
2. 能够通过递归下降分析,识别并修复程序中的语法错误。
3. 能够运用所学知识,对实际编程问题进行递归下降分析,提高编程能力。
情感态度价值观目标:1. 培养学生对编译原理学科的兴趣,激发学习热情。
2. 培养学生的团队协作意识,学会与他人共同解决问题。
3. 培养学生的批判性思维,敢于质疑、勇于探索,形成积极向上的学习态度。
本课程针对高年级学生,课程性质为理论联系实际,注重培养学生的实际操作能力。
根据学生特点,课程设计力求深入浅出,通过实例分析,帮助学生更好地理解和掌握递归下降分析法的应用。
在教学过程中,关注学生的学习反馈,及时调整教学策略,确保课程目标的实现。
将课程目标分解为具体的学习成果,为后续教学设计和评估提供依据。
本章节教学内容主要包括以下三个方面:1. 递归下降分析基本概念:- 介绍语法分析的基本任务和递归下降分析法的原理。
- 解释递归下降分析在编译原理中的作用。
2. 递归下降分析法的应用:- 分析简单程序代码的语法结构,识别语法错误。
- 通过实例讲解递归下降分析法在实际编程中的应用。
教学大纲安排:- 第一节课:语法分析基本概念,递归下降分析法原理。
- 第二节课:简单程序代码的递归下降分析实例。
3. 编写递归下降分析程序:- 指导学生编写简单的递归下降分析程序,进行语法检查。
- 分析实际编程中遇到的语法问题,运用递归下降分析法进行解决。
教学大纲安排:- 第三节课:递归下降分析程序编写方法。
- 第四节课:递归下降分析在编程实践中的应用。
教材章节关联:本教学内容与教材中关于编译原理、语法分析以及递归下降分析的相关章节紧密关联。
编译原理语法分析器
![编译原理语法分析器](https://img.taocdn.com/s3/m/835adc365bcfa1c7aa00b52acfc789eb172d9e0f.png)
编译原理语法分析器编译原理语法分析器是编译器中的重要组成部分,它负责将源代码解析成抽象语法树,为后续的语义分析和代码生成做准备。
本文将介绍语法分析器的原理、分类和常用算法。
一、语法分析器的原理语法分析器的主要任务是根据给定的文法定义,将源代码解析成一个个语法单元,并构建出一棵抽象语法树。
它通过递归下降、预测分析和LR分析等算法来实现。
1. 递归下降法递归下降法是一种基于产生式的自顶向下分析方法。
它从文法的开始符号出发,通过不断地推导和回溯,逐步地构建抽象语法树。
递归下降法易于理解和实现,但对左递归和回溯有一定的局限性。
2. 预测分析法预测分析法也是自顶向下的分析方法,它通过预测下一个输入符号来选择适当的产生式进行推导。
为了提高效率,预测分析法使用预测分析表来存储各个非终结符和终结符的关系。
3. LR分析法LR分析法是一种自底向上的分析方法,它使用LR自动机和LR分析表来进行分析。
LR自动机是一个有限状态控制器,通过状态转移和规约动作来解析源代码。
LR分析表存储了状态转移和规约的规则。
二、语法分析器的分类根据语法分析器的特性和实现方式,可以将其分为LL分析器和LR 分析器。
1. LL分析器LL分析器是基于递归下降法和预测分析法的一类分析器。
它从左到右、从左到右地扫描源代码,并根据预测分析表进行推导。
常见的LL分析器有LL(1)分析器和LL(k)分析器。
2. LR分析器LR分析器是基于LR分析法的一类分析器。
它先通过移进-归约的方式建立一棵语法树,然后再进行规约操作。
LR分析器具有强大的语法处理能力,常见的LR分析器有LR(0)、SLR(1)、LR(1)和LALR(1)分析器。
三、常用的语法分析算法除了递归下降法、预测分析法和LR分析法,还有一些其他的语法分析算法。
1. LL算法LL算法是一种递归下降法的改进算法,它通过构造LL表和预测分析表实现分析过程。
LL算法具有很好的可读性和易于理解的特点。
2. LR算法LR算法是一种自底向上的分析方法,它通过建立LR自动机和构造LR分析表来进行分析。
编译原理实验二:LL(1)语法分析器
![编译原理实验二:LL(1)语法分析器](https://img.taocdn.com/s3/m/c625d5e6b9f67c1cfad6195f312b3169a451ea8c.png)
编译原理实验⼆:LL(1)语法分析器⼀、实验要求 1. 提取左公因⼦或消除左递归(实现了消除左递归) 2. 递归求First集和Follow集 其它的只要按照课本上的步骤顺序写下来就好(但是代码量超多...),下⾯我贴出实验的⼀些关键代码和算法思想。
⼆、基于预测分析表法的语法分析 2.1 代码结构 2.1.1 Grammar类 功能:主要⽤来处理输⼊的⽂法,包括将⽂法中的终结符和⾮终结符分别存储,检测直接左递归和左公因⼦,消除直接左递归,获得所有⾮终结符的First集,Follow集以及产⽣式的Select集。
#ifndef GRAMMAR_H#define GRAMMAR_H#include <string>#include <cstring>#include <iostream>#include <vector>#include <set>#include <iomanip>#include <algorithm>using namespace std;const int maxn = 110;//产⽣式结构体struct EXP{char left; //左部string right; //右部};class Grammar{public:Grammar(); //构造函数bool isNotTer(char x); //判断是否是终结符int getTer(char x); //获取终结符下标int getNonTer(char x); //获取⾮终结符下标void getFirst(char x); //获取某个⾮终结符的First集void getFollow(char x); //获取某个⾮终结符的Follow集void getSelect(char x); //获取产⽣式的Select集void input(); //输⼊⽂法void scanExp(); //扫描输⼊的产⽣式,检测是否有左递归和左公因⼦void remove(); //消除左递归void solve(); //处理⽂法,获得所有First集,Follow集以及Select集void display(); //打印First集,Follow集,Select集void debug(); //⽤于debug的函数~Grammar(); //析构函数protected:int cnt; //产⽣式数⽬EXP exp[maxn]; //产⽣式集合set<char> First[maxn]; //First集set<char> Follow[maxn]; //Follow集set<char> Select[maxn]; //select集vector<char> ter_copy; //去掉$的终结符vector<char> ter; //终结符vector<char> not_ter; //⾮终结符};#endif 2.1.2 AnalyzTable类 功能:得到预测分析表,判断输⼊的⽂法是否是LL(1)⽂法,⽤预测分析表法判断输⼊的符号串是否符合刚才输⼊的⽂法,并打印出分析过程。
递归下降分析课程设计
![递归下降分析课程设计](https://img.taocdn.com/s3/m/14fa3d998ad63186bceb19e8b8f67c1cfad6eeca.png)
递归下降分析课程设计一、教学目标本课程的教学目标是使学生掌握递归下降分析的基本概念、原理和方法,能够运用递归下降分析解决简单的语言处理问题。
具体来说,知识目标包括:了解递归下降分析的基本原理,掌握递归下降分析的方法和技巧,理解递归下降分析在语言处理中的应用。
技能目标包括:能够运用递归下降分析方法设计和实现简单的语法分析器,能够运用递归下降分析方法解决简单的语言处理问题。
情感态度价值观目标包括:培养学生的创新意识和团队合作精神,提高学生对计算机科学和语言处理的兴趣和热情。
二、教学内容本课程的教学内容主要包括递归下降分析的基本概念、原理和方法。
具体来说,教学大纲如下:第1周:递归下降分析简介,递归下降分析的基本概念和原理。
第2周:递归下降分析的方法和技巧,递归下降分析的应用实例。
第3周:递归下降分析的设计和实现,递归下降分析在语言处理中的应用。
三、教学方法为了实现教学目标,我们将采用多种教学方法,包括讲授法、讨论法、案例分析法、实验法等。
通过多样化的教学方法,激发学生的学习兴趣和主动性,帮助学生更好地理解和掌握递归下降分析的知识和技能。
四、教学资源为了支持教学内容和教学方法的实施,我们将选择和准备适当的教学资源,包括教材、参考书、多媒体资料、实验设备等。
教学资源将能够丰富学生的学习体验,帮助学生更好地理解和掌握递归下降分析的知识和技能。
五、教学评估为了全面、客观地评估学生的学习成果,我们将采用多元化的评估方式。
评估内容包括平时表现、作业、考试等。
平时表现将根据学生在课堂上的参与度、提问和回答问题的表现来评估。
作业将包括练习题和项目任务,以考察学生对递归下降分析的理解和应用能力。
考试将包括笔试和上机考试,以考察学生的理论知识和实际操作能力。
评估方式将公正、客观,能够全面反映学生的学习成果。
六、教学安排本课程的教学安排将紧凑、合理,确保在有限的时间内完成教学任务。
教学进度将根据教学大纲进行,教学时间将安排在课堂上,教学地点将选择适合教学的环境。
编译原理实验递归下降分析器的设计(含源代码和运行结果)
![编译原理实验递归下降分析器的设计(含源代码和运行结果)](https://img.taocdn.com/s3/m/4f68a82bf18583d04964599c.png)
《编译原理》实验报告实验3 递归下降分析器的设计姓名学号班级计科1001班时间: 2012/4/15 地点:文波同组人:无指导教师:朱少林实验目的使用递归子程序法设计一个语法分析程序,理解自顶向下分析方法的原理,掌握手工编写递归下降语法分析程序的方法。
实验内容a.运用所学知识,编程实现递归下降语法分析程序。
使用递归下降分析算法分析表达式是否符合下文法:exp → exp addop term | termAddop →+ | -term→ term mulop factor | factormulop → * | /factor → (exp) | id | number其中number可以是多位的十进制数字串(整数即可),因此这里还需要一个小的词法分析器来得到id 和number的值。
b.从数据文件中读出符号串,输出表达式并给出其正误评判。
实验数据文件中应该有多个表达式,可能有正确的也应该有错误的表达式;表达式有形式简单的也应该有复杂的。
每个表达式写在一行,以回车结束。
实验环境软件:VC++6.0实验前准备1、方案设计:①准备模拟数据:本实验中使用“work..cpp”②程序思想:为了使用递归向下的分析,为每个非终结符根据其产生式写一个分析程序,由于写入读出的操作频繁。
所以程序中还有一个match(char t)函数,该函数是将字符写入文件打印输出同时从文件中读取下一个字符,而由于id和number可能是多个字符构成,故写了number()和id()来分析数字和标识符,它们的功能仅仅是把整个number或id完整的读取出来并写入文件,打印输出。
由于分析的文件中可能出现非法字符,而一旦发现非法字符就无需再接着分析,所以在每次读取一个字符时调用islegal函数判断是否是合法字符,并返回0或1.在main()函数中,while((lookahead=='\n'||lookahead==' ')&&lookahead!=EOF) fscanf(resource,"%c",&lookahead);是为了忽略分析文件中的换行或空格,之后进入分析阶段,根据返回值判断是否是合法的表达式。
编译原理课程设计-LL(1)语法分析器的构造
![编译原理课程设计-LL(1)语法分析器的构造](https://img.taocdn.com/s3/m/32df6bce0066f5335a8121ed.png)
LL(1)语法分析器的构造摘要语法分析的主要任务是接收词法分析程序识别出来的单词符由某种号串,判断它们是否语言的文法产生,即判断被识别的符号串是否为某语法部分。
一般语法分析常用自顶向下方法中的LL分析法,采用种方法时,语法分程序将按自左向右的顺序扫描输入的的符号串,并在此过程中产生一个句子的最左推导,即LL是指自左向右扫描,自左向右分析和匹配输入串。
经过分析,我们使用VC++作为前端开发工具,在分析语法成分时比较方便直观,更便于操作。
运行程序的同时不断修正改进程序,直至的到最优源程序。
关键字语法分析文法自顶向下分析 LL(1)分析最左推导AbstractGrammatical analysis of the main tasks was to receive lexical analysis procedure to identify the words from a website, string, and judge whether they have a grammar of the language, that is, judging by the series of symbols to identify whether a grammar part. General syntax analysis commonly used top-down methods of LL analysis, using methods, Grammar hours will be from the procedures of the order left-to-right scanning input string of symbols, and in the process produced one of the most left the sentence is derived, LL is scanned from left to right, From left to right analysis and matching input strings. After analysis, we use VC + + as a front-end development tool for the analysis of syntax ingredients more convenient visual, more easy to operate. Operational procedures at the same time constantly improving procedures, until the source of optimal .Key WordsGrammatical analysis grammar Top-down analysis LL (1) AnalysisMost left Derivation目录摘要 (1)引言 (3)第一章设计目的 (4)第二章设计的内容和要求 (5)2.1 设计内容 (5)2.2 设计要求 (5)2.3 设计实现的功能 (5)第三章设计任务的组织和分工 (6)3.1 小组的任务分工 (6)3.2 本人主要工作 (6)第四章系统设计 (9)4.1 总体设计 (9)4.2 详细设计 (9)第五章运行与测试结果 (22)5.1 一组测试数据 (22)5.2 界面实现情况 (23)第六章结论 (27)课程设计心得 (28)参考文献 (29)致谢 (30)附录(核心代码清单) (31)引言编译器的构造工具是根据用户输入的语言的文法,编译器的构造工具可以生成程序来处理以用户输入的文法书写的文本。
编译原理编写递归下降语法分析器
![编译原理编写递归下降语法分析器](https://img.taocdn.com/s3/m/722e532159fb770bf78a6529647d27284b733737.png)
降语法分析器学院:信息与控制工程学院专业:计算机科学与技术班级:计算机1401班姓名:叶达成2016年10月31日一、上机目的通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查与结构分析,掌握常用的语法分析方法。
通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法与产生源程序的内部表示文件的方法。
2、掌握词法分析的实现方法。
3、上机调试编出的词法分析程序。
二、基本原理与上机步骤递归下降分析程序实现思想简单易懂。
程序结构与语法产生式有直接的对应关系。
因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。
递归下降分析程序的实现思想是:识别程序由一组子程序组成。
每个子程序对应于一个非终结符号。
每一个子程序的功能是:选择正确的右部,扫描完相应的字。
在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。
自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。
分析速度慢。
而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。
无回溯的自上向下分析技术可用的先决条件是:无左递归与无回溯。
无左递归:既没有直接左递归,也没有间接左递归。
无回溯:对于任一非终结符号U的产生式右部x1|x2|…|x n,其对应的字的首终结符号两两不相交。
如果一个文法不含回路(形如P⇒+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。
三、上机结果测试数据:(1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#(2)输出结果:i+i*i#为合法符号串(3)输入一符号串如i+i*#,要求输出为“非法的符号串”。
程序清单:#include<stdio.h>#include<string>char str[50];int index=0;void E(); //E->TX;void X(); //X->+TX | evoid T(); //T->FYvoid Y(); //Y->*FY | evoid F(); //F->(E) | iint main() /*递归分析*/int len;int m;printf("请输入要测试的次数:");scanf("%d",&m);while(m--)printf("请输入字符串(长度<50>):\n");scanf("%s",str);len=strlen(str);//str[len]='#';str[len+1]='\0';E();printf("%s为合法符号串!\n",str);strcpy(str,"");index=0;} return 0;void E(){ T(); X();}void X()if(str[index]=='+'){ index++;T();X();void T(){ F(); Y(); }void Y(){ i f(str[index]=='*') {index++;F();Y();void F()if(str[index]=='i'){ index++; }else if (str[index]=='(')index++;E();if(str[index]==')'){ index++; }elseprintf("\n非法的符号串!\n");exit (0);elseprintf("非法的符号串!\n");exit(0);屏幕截图:四、讨论与分析通过本次实验对递归下降词法分析器的结构,过程有了更进一步的了解,通过学习书本与试验原理书上的内容,对它的工作原理,具体实行步骤有了进一步的掌握,由于本次试验是测试性试验,所以要求输出的结果是成功与否,输入一个句型,进过分析,判断它是否合法,主要内容在于其判断过程中。
实验三递归下降分析器设计与实现编译原理实验报告
![实验三递归下降分析器设计与实现编译原理实验报告](https://img.taocdn.com/s3/m/5802827766ec102de2bd960590c69ec3d5bbdbf0.png)
实验三递归下降分析器设计与实现编译原理实验报告一、引言递归下降分析器是编译原理中常用的一种语法分析方法。
它根据文法规则和输入的源代码,递归地进行语法分析,判断源代码是否符合给定的文法规则。
本实验旨在通过设计与实现一个简单的递归下降分析器,加深对编译原理中语法分析的理解。
二、实验目的1.学习递归下降分析器的原理和设计方法;2.掌握使用递归下降分析器进行简单语法分析的过程;3.加深对编译原理中文法规则和语法分析的理解。
三、实验过程1.设计文法规则:根据实验要求,设计一个简单的算术表达式文法规则。
例如,我们可以采用以下文法规则:```E->E+T,E-T,TT->T*F,T/F,FF -> ( E ) , num```2.设计分析器:根据设计的文法规则,设计递归下降分析器的结构和算法。
我们可以使用编程语言实现一个类,其中包含递归下降分析器所需要的方法和数据结构。
3. 实现分析器:根据设计的分析器结构和算法,使用编程语言实现递归下降分析器的代码。
可以选择常用的编程语言,如C++、Java、Python等。
4.进行语法分析:编写测试代码,使用实现的递归下降分析器对输入的算术表达式进行语法分析。
根据分析结果,判断输入的算术表达式是否符合给定的文法规则。
五、实验结果实验结果根据设计的分析器的实现和测试代码的编写而定。
例如,对于以下输入的算术表达式:(3+4)*5-2,经过递归下降分析器的分析,应该能正确判断其是否符合给定的文法规则。
六、实验总结递归下降分析器是编译原理中常用的一种语法分析方法。
通过实验三,我深入理解了递归下降分析器的原理和设计方法,并通过实现一个简单的递归下降分析器,加深了我对编译原理中文法规则和语法分析的理解。
在实验过程中,我学会了如何根据设计的文法规则来设计递归下降分析器的结构和算法。
我使用了编程语言实现了递归下降分析器的代码,并编写了相应的测试代码进行语法分析。
通过测试,我验证了递归下降分析器的正确性。
编译原理——递归下降语法分析
![编译原理——递归下降语法分析](https://img.taocdn.com/s3/m/4a4eaffcf18583d048645963.png)
《编译原理》课程实验陈述之南宫帮珍创作实验名称:递归下降分析法姓名:彭国保学号:540907010130院系:计算机与通信工程学院专业:计算机科学与技术班级:09-1班教师:韩丽2012年4月22日一.实验目的根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。
本次实验的目的主要是加深对递归下降分析法的理解。
程序开始变得复杂起来,需要利用到程序设计语言的知识和大量编程技巧,递归下降分析法是一种较实用的分析法,通过这个练习可大大提高软件开发能力。
通过练习,掌握函数间相互调用的方法。
二.实验内容递归下降分析法是确定的自上而下分析法,它要求文法是LL(1)文法。
它的基本思想是:对文法中的每个非终结符编写一个函数或子程序,每个函数或子程序的功能是识别由该非终结符所暗示的语法成分。
程序算法描述词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。
改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法,为G的每个非终结符号U构造一个递归过程。
U的发生式的右边指出这个过程的代码结构:(1)若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。
(2)若是非终结符号,则调用与此非终结符对应的过程。
当A的右部有多个发生式时,可用选择结构实现。
最后编写程序以实现上述功能。
三.实验步调根据上述算法描述,编写程序以实现相应的功能,该程序由C语言编写,然后在VC运行环境下进行调试,其实不竭完善,直到能正确的实现递归下降分析功能,判断输入的字符串是否是一个文法的句子。
源程序代码如下:#include<stdio.h>void S();void T();void error();void scaner();char sym;int main(){scaner();S();if(sym=='$') printf("是该文法的句子");else printf("不是该文法的句子");return 0;}void S(){if(sym=='a'||sym=='^') scaner();else if(sym=='('){scaner(); T();if(sym==')') scaner();else error();}else error();}void T(){T1();}void T1(){if(sym==','){scaner();S();T1();}else if(sym !=')')error();}void scaner(){scanf("%c",&sym);}void error(){printf("不是该文法的句子");}调试程序的结果:四.总结与回顾通过本次实验,我掌握了递归下降分析程序的构造过程,将一个文法编写为对应的子程序,如有左递归先消除左递归,再改写为相应的程序。
递归下降分析法 编译原理 LL1文法
![递归下降分析法 编译原理 LL1文法](https://img.taocdn.com/s3/m/4e0d8e88cc22bcd126ff0ceb.png)
归下降分析法实现LL1文法产生式:(《编译原理》第二版P95)E->TPP->+TP|nullT->FQQ->*FQ|nullF->i|(E)代码:public class Accept2 {public static StringBuffer stack=new StringBuffer("#E");public static StringBuffer stack2=new StringBuffer("i+i*i+i#");public static void main(String arts[]){//stack2.deleteCharAt(0);System.out.print(accept(stack,stack2));}public static boolean accept(StringBufferstack,StringBuffer stack2){//判断识别与否boolean result=true;outer:while (true) {System.out.format("%-9s",stack+"");System.out.format("%9s",stack2+"\n");char c1 = stack.charAt(stack.length() - 1);char c2 = stack2.charAt(0);if(c1=='#'&&c2=='#')return true;switch (c1) {case 'E':if(!E(c2)) {result=false;break outer;}break;case 'P':if(!P(c2)) {result=false;break outer;}break;case 'T':if(!T(c2)) {result=false;break outer;}break;case 'Q':if(!Q(c2)) {result=false;break outer;}break;case 'F':if(!F(c2)) {result=false;break outer;}break;default: {//终结符的时候if(c2==c1){stack.deleteCharAt(stack.length()-1);stack2.deleteCharAt(0);//System.out.println();}else{return false;}}}if(result=false)break outer;}return result;}public static boolean E(char c) {//语法分析子程序 E boolean result=true;if(c=='i') {stack.deleteCharAt(stack.length()-1);stack.append("PT");}else if(c=='('){stack.deleteCharAt(stack.length()-1);stack.append("PT");}else{System.err.println("E 推导时错误!不能匹配!");result=false;}return result;}public static boolean P(char c){//语法分析子程序P boolean result=true;if(c=='+') {stack.deleteCharAt(stack.length()-1);}else if(c==')') {stack.deleteCharAt(stack.length()-1);//stack.append("");}else if(c=='#') {stack.deleteCharAt(stack.length()-1);//stack.append("");}else{System.err.println("P 推导时错误!不能匹配!");result=false;}return result;}public static boolean T(char c) {//语法分析子程序T boolean result=true;if(c=='i') {stack.deleteCharAt(stack.length()-1);stack.append("QF");}else if(c=='(') {stack.deleteCharAt(stack.length()-1);stack.append("QF");}else{result=false;System.err.println("T 推导时错误!不能匹配!"); }return result;}public static boolean Q(char c){//语法分析子程序Q boolean result=true;if(c=='+') {stack.deleteCharAt(stack.length()-1);//stack.append("");}else if(c=='*') {stack.deleteCharAt(stack.length()-1);stack.append("QF*");}else if(c==')') {stack.deleteCharAt(stack.length()-1);}else if(c=='#') {stack.deleteCharAt(stack.length()-1);//stack.append("");}else{result=false;System.err.println("Q 推导时错误!不能匹配!");}return result;}public static boolean F(char c) {//语法分析子程序 Fboolean result=true;if(c=='i') {stack.deleteCharAt(stack.length()-1);stack.append("i");}else if(c=='(') {stack.deleteCharAt(stack.length()-1);stack.append(")E(");}else{result=false;System.err.println("F 推导时错误!不能匹配!");}return result;}/* public static StringBufferchangeOrder(String s){//左右交换顺序StringBuffersb=new StringBuffer();for(inti=0;i<s.length();i++){sb.append(s.charAt(s.length()-1-i));}returnsb;}*/}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理课程设计课程设计题目:LL(1)递归下降分析器姓名:院(系):专业班级:学号:指导教师:设计日期:目录1、需求分析 (1)2、概要设计 (2)3、详细设计 (3)4、测试分析 (8)5、用户手册 (9)6、课程总结 (9)7、参考文献 (10)题目:LL (1)递归下降分析器1、需求分析语法分析是编译过程的核心部分。
语法分析器的任务是识别和处理比单词更大的语法单位。
如:程序设计语言中的表达式,各种说明和语句乃至全部源程序,指出其中的语法错误;必要时,可生成内部形式,便于下一阶段处理。
我们知道,语言的语法结构是用上下文无关文法描述的。
按照语法分析树的建立方法,我们可以粗略地把语法分析办法分成两类,一类是自上而下分析,另一类是自下而上分析法。
而自上而下这种方法是带“回溯”的,且存在许多困难和缺点。
首先,是文法的左递归性问题。
一个文法是含有左递归的,如果存在非终结符P 且αP P +⇒,含有左递归的文法使上述的自上而下的分析过程陷入无限循环。
即,当试图用P 去匹配输入串时,我们会发现,在没有识别任何输入符号的情况下,有得重新要求P 去进行新的匹配。
因此,使用自上而下分析法必须消除文法的左递归性。
其次,由于回溯,就碰到一大堆麻烦问题。
如果我们走了一大段错路,最后必须回头,那么,就应把已经做的一大堆语义工作(指中间代码产生工作和各种表格的簿记工作)推倒重来。
这些事情既麻烦又费时间,所以,最好应设法消除回溯。
第三,在自上而下分析过程中,当一个非终结符用某一候选匹配成功时,这种成功可能仅是暂时的。
第四,当最终报告分析不成功时,我们难于知道输入串中出错的确切位置。
最后,由于带回溯的自上而下分析实际上采用了一种穷尽一切可能的试探法,因此,效率很低,代价极高。
严重的低效使得这种分析法只有理论意义,而在实践上价值不大。
由于上述原因,我们需要把原算术表达式改写为LL(1)文法,LL(1)文法的文法条件如下: 文法不含左递归。
对于文法中每一个非终结符A 的各个产生式的候选首集符两两不相交。
即,若n A ααα|||21 →,则()()φαα=⋂j i FIRST FIRST ()j i ≠对文法中的每个非终结符A ,若它存在某个候选首符集包含ε,则()()φ=⋂A F O L L O WA F I R S T LL(1)中的第一个L 表示从左到右扫描输入串,第二个L 表示最左推导,1表示分析时每一步只需向前查看一个符号。
当一个文法满足LL(1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。
这样的一个分析程序称为递归下降分析器。
2、概要设计编程实现给定算术表达式的递归下降分析器。
算术表达式文法如下:E-->E+T|E-T|TT-->T*F|T/F|FF-->(E)| i首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。
上述算法表达式文法属于比较典型的递归下降语法分析。
需要先将原算术表达式方法改写为LL(1)文法为:E-->TE’E’-->+TE’|-TE’| εT-->FT’T’-->*FT’|/FT’| εF-->(E)| i然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。
具体方法为:(1)当遇到终结符a时,则编写语句If(当前读到的输入符号==a)读入下一个输入符号(2)当遇到非终结符A时,则编写语句调用A()。
(3)当遇到A-->ε规则时,则编写语句If(当前读到的输入符号不属于Follow(A)) error()(4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导.递归下降子程序流程图:图1递归下降子程序流程图3、详细设计#include<iostream.h>char inputstream[50]; //存储输入句子int temp=0; //数组下标int right; //判断输出信息void e();void e1();void t();void t1();void f();void main(){right=1;cout<<"---------------------------------------------------"<<endl;cout<<"请输入您要分析的字符串以#结束(^为空字符):"<<endl;cin>>inputstream;cout<<"---------------------------------------------------"<<endl;cout<<endl;cout<<"开始进行语法分析"<<endl;e();if((inputstream[temp]=='#')&&right)cout<<"分析成功"<<endl;elsecout<<"分析失败"<<endl;}void e(){cout<<"E->TE'"<<endl;t();e1();}void e1(){if(inputstream[temp]=='+'){cout<<"E'->+TE'"<<endl;temp++;t();e1();}else if(inputstream[temp]=='-'){cout<<"E'->-TE'"<<endl;temp++;t();e1();}else if(inputstream[temp]!='#'||inputstream[temp]!=')') {cout<<"T'->^"<<endl;return;}elseright=0;}void t(){cout<<"T->FT'"<<endl;f();t1();}void t1(){if(inputstream[temp]=='*'){cout<<"T'->*FT'"<<endl;temp++;f();t1();}else if(inputstream[temp]=='/'){cout<<"T'->/FT'"<<endl;temp++;f();t1();}elseif(inputstream[temp]!='#'&&inputstream[temp]!=')'&&inputstream[temp]!='+'&&input stream[temp]!='-'){cout<<"T'->^"<<endl;right=0;}}void f(){if(inputstream[temp]=='i'){cout<<"F->i"<<endl;temp++;}elseif(inputstream[temp]=='('){cout<<"F->(E)"<<endl;temp++;e();if(inputstream[temp]==')'){cout<<"F->(E)"<<endl;temp++;}elseright=0;}else right=0;}4、测试分析图2 测试分析成功图3 测试分析失败5、用户手册开发工具:visual c++ 6.0开发环境:windows XP操作系统运行环境:windows 9x,windows NT,Windows 2000,windows XP注意:输入时,程序最多只能接受50个字符,输入完算术表达式后要以“#”号结束。
6、课程总结通过一个星期的努力,终于把编译原理课程设计给完成了。
我觉得编译原理这门课是一门非常难学的课程,它涉及文法、词法分析、语法分析属性文法和语义分析等等一系列内容,课本里的内容和定义也非常的抽象且枯燥。
如果上课没有好好的认真听课,自己独自学习就感到非常的吃力,而且效果也不好。
本人因为上课无法做到打醒十二分专心听课,经常会分神,所以学习的效果也不怎么好。
这也给做编译原理课程设计带来了困难。
本次课程设计,我选的课程设计题目是LL(1)递归下降分析器,这个题目涉及的内容有关课本第四章语法分析——自上而下分析里面的内容。
在开始动手对题目进行设计和编程之前,我重复的仔细认真的阅读和理解课本第四章里面的内容,弄懂自上而下分析面临的问题、何谓左递归,搞清楚如何消除左递归、如何消除回溯、提左因子,理解构造LL(1)文件需要什么条件。
虽然这花费了一定的时间和精力,但那点付出也是值得的,通过复习让我加深理解了有关自上而下语法分析的内容,而且也为用高级语言实现递归下降分析器带来便利。
在用C++编程时,基本上没有遇到什么困难,只需把所有递归过程都写出就行了。
但是要注意的是,在编写代码时,要根据LL(1)文法的工作原理去设计。
通过本次课程设计清楚地了解到递归下降分析法的优缺点,其优点是简单、直观,易于构造分析程序。
缺点是对文法要求高,必须是LL(1)文法,同时由于递归调用较多,影响分析器的效率。
课程设计虽然只有短短的一周,但让我认识到学习好编译原理,是对程序设计和编译的一个很好的进化桥梁和奠基石。
今后学习的日子还很长,希望通过这次编译原理的课程设计,不仅对编程语言的进一步复习,还是对更深层次的学习作一个简单的准备。
编程的能力不是一朝一夕能锻炼出来,坚持学习,坚持编程的学习,多看,多编是最好的学习和提高方法。