编译原理语法分析报告+代码_第1页
编译原理语法分析报告+代码_第2页
编译原理语法分析报告+代码_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理语法分析报告+代码1000字一、语法分析语法分析是编译器的重要部分,它的作用是对源程序进行分析和判断,判断源程序是否符合语法规则,把源程序划分为一个个语法单元,并建立语法树,这里介绍一种常见的语法分析方法——LR(1)分析。1.LR(1)分析LR(1)分析是一种自底向上的语法分析方法,它是以LR语法分析机为基础的。LR(1)分析是在扫描整个输入的基础上作出决策的,名字中的1表示当扫描到一个符号时,它会读下一个符号来做决策并且仅仅读一个符号。2.LR(1)分析器构建构建LR(1)分析器首先需要构建LR(1)自动机,然后对其进行分析,得到一个分析表。分析表有两个函数:action和goto。分析表的行是状态,列是终结符或非终结符,如果分析表的项中既包含action又包含goto,那么这个表就是一个LR(1)分析表。3.核心算法核心算法就是通过分析表进行分析,具体步骤如下:(1)创建一个栈,将一个状态push入栈。(2)循环扫描输入,每扫描一个符号就执行一个操作,直到栈为空。(3)在栈的顶部状态上查找action表。如果输入符号是一个终结符,那么应该执行的动作是shift。如果输入符号是一个结束符号,那么说明输入已经结束,执行acc(accept)操作。(4)如果找到了一个shift,就将其作为下一个状态push入栈,并将上次扫描到的符号作为标记push入栈。(5)否则,在栈的顶部状态上查找goto表。在状态表中查找新状态,并将其push入栈。常见的错误处理:(1)在action表中找不到适当的输入:语法错误,报错。(2)在goto表中找不到适当的输入:一个状态不能在当前符号的词法单元下产生任何变化。4.算法实现这里提供一个简单的C++代码实现。1)自动机的结构体声明:structAutomaton{intstatus;//状态编号charsymbol;//符号intgo_to;//跳转状态intmove_type;//移动类型Automaton():status(-1),symbol(0),go_to(-1),move_type(-1){}};2)分析表结构体声明:structAnalyzeTable{staticconstintROWS=100;//分析表行数staticconstintCOLS=100;//分析表列数Automatonanalyze_table[ROWS][COLS];//分析表};3)LR(1)分析器的实现:classLR1Parser{public:LR1Parser(conststd::string&grammar_file);//构造函数~LR1Parser();voidparse(conststd::string&input_file);//解析函数private:std::map<char,std::vector<std::string>>productions_;//产生式std::map<char,std::set<char>>first_;//First集合std::map<char,std::set<char>>follow_;//Follow集合AnalyzeTableanalyze_table_;//分析表};4)分析表构建函数实现:voidLR1Parser::build_analyze_table(){//对于每个项A->α.Bβ,a,把它添加到一个集合中。std::map<int,std::set<std::p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论