您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > sample词法分析与语法分析
一、实验目的根据SAMPLE文法规范,要求编写SAMPLE语言的词法分析程序以及语法分析程序二、实验内容根据SAMPLE语言文法,输出token表以(关键字、专用符号以及其它标记)及符号表。根据某一文法编写LL(1)语法预测分析程序,以便对任意输入的符号串进行分析,构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。三、实验方案设计1)、词法分析方案设计:1、设计SAMPLE语言的词法分析器A、字符集定义1.字符集→字母│数字│单界符2.字母→A│B│…│Z│a│b│…│z3.数字→0│1│2│…│94.单界符→+│-│*│/│=│││(│)│[│]│:│.│;│,│'B、单词集定义5.单词集→关键字│双界符│标识符│常数│单界符6.关键字→begin│bool│char│const│do│else│end│false│for│if│integer│program│read│real│then│to│true││var│while│write7.双界符→│=│=│:=│/*│*/│..8.标识符→字母│标识符数字│标识符字母9.常数→整数│布尔常数│字符常数10.整数→数字│整数数字11.布尔常数→true│false12.字符常数→'除{'}外的任意字符串'13.运算符→+|-|*|/||2、词法分析系统流程设计22)、LL(1)分析法实验设计思想及算法:(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。3四、实验测试对词法分析:测试文件:programexample;vara,b,c:integer;x:char;beginif(a+c*3b)and(b3)thenc:=3;x:=2+(3*a)-b*c*8;if(2+3a)and(b3)and(ac)thenc:=3;forx:=1+2to3dob:=100;whileabdo4c:=5;forx:=1+dto3dob:=15;whiletbdoc:=5;repeata:=10;untilab;end.分析结果:······················开始分析··········································analyzerow1·················[保留字]program[标识符]example·····················analyzerow2·················[保留字]var·····················analyzerow3·················[标识符]a[单界符:逗号],[标识符]b[单界符:逗号],[标识符]c[保留字]integer·····················analyzerow4·················[标识符]x[保留字]char·····················analyzerow5·················[保留字]begin·····················analyzerow6·················[保留字]if[单界符:左圆括号]([标识符]a[单界符:加号]+[标识符]c[单界符:星号]*[数字]3[标识符]b[单界符:右圆括号])5[保留字]and[单界符:左圆括号]([标识符]b[数字]3[单界符:右圆括号])·····················analyzerow7·················[保留字]then[标识符]c[双界符6]:=[数字]3·····················analyzerow8·················[标识符]x[双界符6]:=[数字]2[单界符:加号]+[单界符:左圆括号]([数字]3[单界符:星号]*[标识符]a[单界符:右圆括号])[单界符:减号]-[标识符]b[单界符:星号]*[标识符]c[单界符:星号]*[数字]8·····················analyzerow9·················[保留字]if[单界符:左圆括号]([数字]2[单界符:加号]+[数字]3[标识符]a[单界符:右圆括号])[保留字]and[单界符:左圆括号]([标识符]b[数字]3[单界符:右圆括号])[保留字]and[单界符:左圆括号]([标识符]a6[标识符]c[单界符:右圆括号])·····················analyzerow10·················[保留字]then[标识符]c[双界符6]:=[数字]3·····················analyzerow11·················[保留字]for[标识符]x[双界符6]:=[数字]1[单界符:加号]+[数字]2[保留字]to[数字]3[保留字]do·····················analyzerow12·················[标识符]b[双界符6]:=[数字]100·····················analyzerow13·················[保留字]while[标识符]a[标识符]b[保留字]do·····················analyzerow14·················[标识符]c[双界符6]:=[数字]5·····················analyzerow15·················[保留字]for[标识符]x[双界符6]:=[数字]1[单界符:加号]+[标识符]d[保留字]to[数字]37[保留字]do·····················analyzerow16·················[标识符]b[双界符6]:=[数字]15·····················analyzerow17·················[保留字]while[标识符]t[标识符]b[保留字]do·····················analyzerow18·················[标识符]c[双界符6]:=[数字]5·····················analyzerow19·················[保留字]repeat[标识符]a[双界符6]:=[数字]10·····················analyzerow20·················[保留字]end[单界符:点号].对LL(1)语法预测分析:测试LL(1)文法:S→aTT→SBlT→$B→dFF→bFF→$测试字符串:aa$db$l测试结果:8五、程序的使用手册对于词法分析:运行程序,在控制台输入指定文件的绝对路径即可(如:D:\Study\编译原理\TestFile)程序将对指定文件进行词法分析并生成token表及符号表到物理空间。对于LL(1)语法预测分析:按照格式输入LL(1)文法,并可判断是否为LL(1)文法输入想要测试的字符输入串点击输入,即可在下方进行LL(1)文法预测分析9六、心得体会在编程时,因考虑的情况不全面,造成语法错误和功能遗漏,为了避免这些问题的出现,可以先把所有的功能和思路逻辑写在纸上,然后再编写程序,可以思路清晰,还避免了一些不必要的错误。本次编译器的设计让我对编译原理的认识更加深刻,尤其是对词法分析及语法分析的理解。但是问题同样存在,那就是虽然课本知识的掌握还不错,但是编程的能力却不容乐观,在今后的学习过程中需要应该加强这方面的锻炼,通过实际敲代码和做项目来提升对编译原理的理解和运用。只要多付出努力,就可以把编译原理学好,用好。
本文标题:sample词法分析与语法分析
链接地址:https://www.777doc.com/doc-2856920 .html