slr_分析报告表地生成以及分析报告程序

slr_分析报告表地生成以及分析报告程序

ID:36447479

大小:54.50 KB

页数:9页

时间:2019-05-10

slr_分析报告表地生成以及分析报告程序_第1页
slr_分析报告表地生成以及分析报告程序_第2页
slr_分析报告表地生成以及分析报告程序_第3页
slr_分析报告表地生成以及分析报告程序_第4页
slr_分析报告表地生成以及分析报告程序_第5页
资源描述:

《slr_分析报告表地生成以及分析报告程序》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、实用文案SLR分析表的生成以及分析程序SLR语法分析自动生成程序实验文档  1.在程序中表示文法1.1文法的输入和读取为了程序读取的方便,非/终结符相互间以空格分开。  例如  应该输入:  E->E+T  T->T*F

2、T  F->(E)

3、id  E->T  而不是输入:  E->E+T

4、T  ……    文法先保存到文件中然后程序读取文件。  1.2文法的拓展为了在LR分析时能够指示分析器正确停止并接受输入,一般在所有输入文法前加上一个新的产生式,以上面文法为例,我们要保存的文法应该是如此:  E’->E+T  E->T*F

5、T  ……  1.3文法的保存格式设计一个类Grammar来对

6、文法进行各种处理。  首先把文件中的文法保存到一个序偶表中,以上面的文法为例子,我们保存的格式类似于下面的表  非终结符  产生试右部  E  E+T  T  T  T*F  T  F  (E)标准文档实用文案  id  也就是说,每一个项是一个2元组,记录了终结符,和产生式右部。其中非终结符可以用字符串(string)类型表示,产生式右部可用字符串数组(vector)表示。而在保存的同时又可记录下文法的所有非终结符(因为文法的产生式左部会出现所有的非终结符),然后再对已经记录的文法的产生式右部再扫描一遍,记录下所有的终结符。  在本程序中,我虽然记录了原始的符号串,但是在具

7、体过程处理时使用的是符号串对应的下标来进行的,因此再对原始形式的文法再扫描一遍,生成对应的以下标形式保存的文法。同时我对终结符号和非终结符号的保存位于不同的数组中,于是下标就会产生冲突,我采用方式是建立一个下标数据结构Index来保存下标  structIndex  {  intindex;//[非终结符或者终结符的下标]  boolteminal;//[为真表示该下标保存的是终结符]  boolis_nonteminal();//[返回!terminal]  }  现在往类Grammar中加入数据成员为:  vector>>m_str_

8、grammar;//[记录以字符串形式保存的文法]  vector>>m_idx_grammar;//[记录以下标保存的文法]  MyCollectionm_str_nonteminals;//[记录原始的非终结符号串]  MyCollectionm_str_terminals;//[记录原始的终结符号串]    接下来要对文法进行相关处理了。  2.LR(0)项目规范集的生成2.1LR(0)项目如果有产生式  E->A

9、B  则其对应的所有项目为  E->。A  E–>A。  E->。BZ  E->B。  其实就是多了一个插在符号之间的点。  项目

10、的数据结构为  structItem  {  intindex_of_nont;//[该项目所在的非终结符位置]标准文档实用文案  intindex_of_pro;//[该项目对应该非终结符的产生式位置]  intindex_of_dot;//[记录点的位置]  }  基于方便(不考虑优化存储),我把所有的项目保存到一个数组中。  Item_0{0,0,0}数据项  Item_1{0,0,1}  Item_2{0,0,2}  ……  Item_i{0,m,n}  ……  其中数据类型为  vectorm_items;//[记录所有的项目]  2.2项目集合及其相关运算一个项目集合

11、包含了多个项目,也等价于后面要建立的自动机的一个状态。  本程序中对项目集合中存储的项目,我采取的也是下标形式存储。因此项目集合的数据结构为:  /*  *[项目集合]  **/  structItem_c  {  intoperator[](intindex)const;  size_tsize()const;  voidclear();  voidpush_back(intidx);  booloperator==(constItem_c&item)const;  Item_c&operator=(constItem_c&item);  operatorstring()const;  p

12、rivate:  vectorindex_c;  hash_setunique_checker;//[用于快速的消重]  };  之所以为项目集合新建一个类来封装一个数组,是为了能够支持相等的语义。因为在之后要建立自动机时会对状态进行等价判断,而状态的类型估计我会直接这样表示:标准文档实用文案  下面我定义一下项目集合的闭包函数,在此之前我先定义一个辅助函数:  //[返回项目的类型,如果

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。