- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
专题四设计实验内容[实验项目]实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。G[E]:E→E+T∣E-T∣TT→T*F∣T/F∣FF→(E)∣i说明:终结符号i为用户定义的简单变量,即标识符的定义。[设计要求](1)构造该算符优先文法的优先关系矩阵或优先函数;(2)输入串应是词法分析的输出二元式序列,即某算术表达式“专题1”的输出结果。输出为输入串是否为该文法定义的算术表达式的判断结果。(3)算符优先分析过程应能发现输入串出错,并且为其改正后继续编译后面的输入符号。(4)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。程序功能描述提供了文件输入方式,且输入的内容为二元式序列;能够对输入的字符串做出正确的算符优先分析判断,并给出判断结果;能够输出算符优先分析的过程;能发现输入串中的错误,包含非法字符,输入不匹配等,并输出错误原因;能够处理一些可预见性的错误,如文件不存在。主要数据结构描述FIRSTVT集合LASTVT集根据所给文法可以求出各非终结符号的FIRSTVT集和LASTVT集,如下表所示:FIRSTVT和LASTVT集FIRSTVTLASTVTE{+,-,*,/,(,i}{+,-,*,/,),i}T{*,/,(,i}{*,/,),i}F{(,i }{),i }算符优先矩阵根据所求出的FIRSTVT和LASTVT集合求出算符优先矩阵如下:(i+-*/)#(=i+-*/)#=变量说明分析栈优先关系矩阵char stack[MAXSTACK]char prior[20][20]终结符号数组文件指针char VT[20] FILE *fpFILE *fin全局变量说明int N; 记录优先矩阵中终结符号个数int num[50]存储从文件中读入的所有二元式中的类别编号char token[50][20]存储从文件中读入的所有二元式中的符号char errorInput[20][20] 非法字符数组int errorIndex = 0 非法字符数组下标bool ERROR = false 标志读入的符号是否是非法字符程序结构描述设计方法本程序采用从文件中读取的方式,对词法分析产生的二元式序列按照算符优先分析方法进行分析判断,并输出判定结果,程序能够检测出输入串中的错误。程序规定的单词符号及其类别编码见下表:单词符号及其类别编码表单词符号类别编码非法字符0标识符1(18)19+13-14*15/39程序框图主要函数定义/************************************************函数名称:get*功能: 从文件中读入优先关系矩阵*参数: 无*返回值: 无************************************************/void get(){/************************************************函数名称:input*功能: 从文件中读二元式,将列别编码存到num数*组中,符号本身存到token二维数组中,并输*出字符串。在输入串尾加上#,然后将*所有的标识符改为i。*参数: 无*返回值: 无************************************************/void input(){/************************************************函数名称:isInVT*功能: 判断符号是否是终结符号*参数: int X需要判断的符号*返回值: int若是,则返回其在终结符号数*组中的位置;若不是,返回-1************************************************/int isInVT(int X){/************************************************函数名称:Reduce*功能: 归约函数,归约最左素短语*参数: int begin最左素短语在栈中的开始位置* int end最左素短语在栈中的结束位置* int len最左素短语的长度*返回值: char最左素短语被规约后的符号************************************************/char Reduce(int begin, int end, int len){/************************************************函数名称:parser*功能: 使用算符优先分析算法进行语法分析*参数: 无*返回值: int返回是否成功*************************
文档评论(0)