已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告学院(系)名称:计算机与通信工程学院姓名*学号*专业计算机科学与技术班级*实验项目实验二:语法分析课程名称编译原理课程代码0668056实验时间*实验地点计算机软件实验室7-215批改意见成绩教师签字: 实验内容: 可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法分析器:(1)EE+T | E-T | T(2)TT*F | T/F | F(3)FPF | P(4)P(E) | i实验目的:1掌握语法分析的基本概念和基本方法;2正确理解LL1分析法、算符优先分析法、LR分析法的设计与使用方法。实验要求:1按要求设计实现能识别上述文法所表示语言的语法分析器,并要求输出全部分析过程;2要求详细描述所选分析方法针对上述文法的分析表构造过程;3完成对所设计语法分析器的功能测试,并给出测试数据和实验结果;4为增加程序可读性,请在程序中进行适当注释说明;5整理上机步骤,总结经验和体会;6认真完成并按时提交实验报告。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】一、构造优先关系表使用算符优先文法:1. 构造FIRSTVT集a) 由EE+ | E-得,FIRSTVT(E)= + , - ;b) 由TT*| T/得,FIRSTVT(T)= * , / ;c) 由FP得,FIRSTVT(P)= ;d) 由P ( | i 得,FIRSTVT(P)= ( , i ;e) 由FP 得,FIRSTVT(P) FIRSTVT(F) ,即FIRSTVT(F) = , ( , i;f) 由TF 得,FIRSTVT(F) FIRSTVT(T) ,即FIRSTVT(T) = *, /, , ( , i;g) 由ET 得,FIRSTVT(T) FIRSTVT(E) ,即FIRSTVT(E) = +,-,*, /, , ( , i ;2. 构造LASTVT集a) 由E+T | -T 得,LASTVT(E)= + , - ;b) 由T*F | /F 得,LASTVT (T)= * , / ;c) 由FF 得,LASTVT (F)= ;d) 由P ) | i 得,LASTVT (P)= ( , i ;e) 由FP 得,LASTVT (P) LASTVT (F) ,即LASTVT (F) = , ( , i;f) 由TF 得,LASTVT (F) LASTVT (T) ,即LASTVT (T) = *, /, , ( , i;g) 由ET 得,LASTVT (T) LASTVT (E) ,即LASTVT (E) = +,-,*, /, , ( , i ;3. 构造优先关系表a) 由E+T | -T 得+FRISTVT(T),- FRISTVT(T)即+ *, + /,+ ,+ ( ,+ i,- *,- /,- ,- ( ,- I;b) 由T*F | /F 得*FRISTVT(F),/ FRISTVT(F)即* , * ,* (,/ i, / /, / ,/ (,/ i;c) 由FF 得FRISTVT(P),即 (, i;d) 由P(E | i得 FIRSTVT(E),即( + ,( - ,( * ,( /,( ,( (,( +, LASTVT(E)-即+ +, + -,- - ,- +,* +,/ +,* -,/ -,) +,i +,) -;f) 由TT*| T/ 得LASTVT(T)*, LASTVT(T)/即* *,* /, / *, / /, *, /,( *, ( /, i *,i /;g) 由FP, 得LASTVT(P)即( ,i ;h) 由P(E | i, 得LASTVT(E),即 + ),- ), * ),/ ), ),) ),i );i) 由#E# 得 # = #j) 由# FIRSTVT(E)即# +,# -,# *,# /,# ,# (,# )即+ #,- #,* #,/ #, #,) #,i #; 优先关系表+-*/i()#+-*/i34(67#8=注 1. 其中3、4、5、6、7、8是为错误编号 2. 0 表示 =,1表示 二、程序设计1. 语法分析程序流程图2. 语法分析流程图3. 程序结果4.源程序/*main.cpp*/#include #include #include Window.hint main(int argc, char *argv)QTextCodec *codec = QTextCodec:codecForName(GBK); /设置程序编码方式,防止中文乱码QTextCodec:setCodecForCStrings(codec); QTextCodec:setCodecForTr(codec);QApplication app(argc , argv);ccyg:Window win;win.show();app.exec();return 0;/*syntax.h*/#pragma once#include #include #include #include namespace ccygclass Syntaxpublic:enum PreRelation /定义优先关系枚举equal = 0,less = 1,greater = 2,/错误i_i = 3,i_left = 4,left_sharp = 5,right_i = 6,right_left = 7,sharp_right = 8;enum Symboladd = 0,sub = 1,mul = 2,div = 3,pow = 4,syi = 5,lef = 6,rig = 7,sha = 8,E = 9,T = 10,F = 11,P = 12;Syntax(std:string);Syntax();Syntax(void);void analysis(void);bool nextStep();void initNext();bool Init();bool reduced();/定义归约方法void movein();/定义移进方法void setSource(std:string);void printStack();int findOperator();std:string error;std:string sym;std:string input;std:string action;private:void setSym();void setInput();void setAction(int,int);void setError(int);char toChar(int);std:vector symbolStack;/ 定义符号栈std:vector inputStack; / 定义输入栈bool isSuccess;bool isInitNext;static const int preArray99;std:string source;/ 定义输入串;/*syntax.cpp*/#include Syntax.husing namespace ccyg;const int Syntax:preArray99= 2,2,1,1,1,1,1,2,2,2,2,1,1,1,1,1,2,2, 2,2,2,2,1,1,1,2,2, 2,2,2,2,1,1,1,2,2, 2,2,2,2,2,1,1,2,2, 2,2,2,2,2,3,4,2,2, 1,1,1,1,1,1,1,0,5, 2,2,2,2,2,6,7,2,2, 1,1,1,1,1,1,1,8,0;Syntax:Syntax(void)isSuccess = false;isInitNext = false;Syntax:Syntax(std:string s)source = s;Syntax();Syntax:Syntax(void)void Syntax:movein()symbolStack.push_back(inputStackinputStack.size()-1);inputStack.pop_back();bool Syntax:reduced()if (symbolStacksymbolStack.size()-1 = syi)symbolStacksymbolStack.size()-1 = P;elseswitch(symbolStacksymbolStack.size()-2 )case add:symbolStacksymbolStack.size()-3 = E;symbolStack.pop_back();symbolStack.pop_back();break;case sub:symbolStacksymbolStack.size()-3 = E;symbolStack.pop_back();symbolStack.pop_back();break;case mul:symbolStacksymbolStack.size()-3 = T;symbolStack.pop_back();symbolStack.pop_back();break;case div:symbolStacksymbolStack.size()-3 = T;symbolStack.pop_back();symbolStack.pop_back();break;case pow:symbolStacksymbolStack.size()-3 = F;symbolStack.pop_back();symbolStack.pop_back();break;case lef:symbolStacksymbolStack.size()-2 = E;symbolStack.pop_back();inputStack.pop_back();break;case sha:std:coutanalysis successstd:endl;return true;break;return false;void Syntax:analysis()symbolStack.push_back(sha);isSuccess = false;while (true)int a = findOperator();int b = inputStackinputStack.size()-1;switch (preArrayab)case less:movein();break;case greater:reduced();break;case equal:isSuccess = reduced();break;default:std:couterror:preArraysymbolStacksymbolStack.size()-1inputStackinputStack.size()-1= 0; k -)switch(sourcek)case +:inputStack.push_back(add);break;case -:inputStack.push_back(sub);break;case *:inputStack.push_back(mul);break;case /:inputStack.push_back(div);break;case :inputStack.push_back(pow);break;case i:inputStack.push_back(syi);break;case (:inputStack.push_back(lef);break;case ):inputStack.push_back(rig);break;default:std:coutsource error : undefined symbolstd:endl;return false;break;return true;void Syntax:setSource(std:string s)source = s;isSuccess = false;void Syntax:printStack()for (int i = 0;i symbolStack.size();i+)switch (symbolStacki)case add:std:cout+ ;break;case sub:std:cout- ;break;case mul:std:cout* ;break;case div:std:cout/ ;break;case pow:std:cout ;break;case syi:std:couti ;break;case lef:std:cout( ;break;case rig:std:cout) ;break;case sha:std:cout# ;break;case E:std:coutE ;break;case T:std:coutT ;break;case F:std:coutF ;break;case P:std:coutP ;break;default:std:couterror: unknown symbolstd:endl;std:cout= 0 ;i-)if (symbolStackiE)return symbolStacki;return -1;bool Syntax:nextStep()if (isSuccess = true)return true;if (!isInitNext)initNext();int a = findOperator();int b = inputStackinputStack.size()-1;setAction(a,b);switch (preArrayab)case less:movein();break;case greater:reduced();break;case equal:isSuccess = reduced();break;setSym();setInput();return isSuccess;void Syntax:initNext()if (isInitNext = false)symbolStack.clear();symbolStack.push_back(sha);isSuccess = false;isInitNext = true;void Syntax:setSym()sym.clear();for (int i = 0;i = 0;i-)input.push_back(toChar(inputStacki);void Syntax:setAction(int a,int b)action.clear();switch (preArrayab)case less:action.push_back(toChar(a);action.push_back();action.push_back(toChar(b);action.append( 归约);break;case equal:action.push_back(toChar(a);action.push_back(=);action.push_back(toChar(b);action.append( 归约);break;default:setError(preArrayab);void Syntax:setError(int e)error.clear();switch(e)case i_i:error = error 3: i and i;break;case i_left:error = error 4: i and (;break;case left_sharp:error = error 5: ( and #;break;case right_i:error = error 6: ) and i;break;case right_left:error = error 7: ) and (;break;case sharp_right:error = error 8: # and );break;char Syntax:toChar(int i)switch (i)case add:return +;case sub:return -;case mul:return *;case div:return /;case pow:return ;case syi:return i;case lef:return (;case rig:return );case sha:return #;case E:return E;case T:return T;case F:return F;case P:return P;default:std:couterror: unknown symbolstd:endl;return 0;/*/* window.h */*/#pragma once#include GeneratedFiles/ui_window.h#include #include #include #include #include Syntax.hnamespace ccygclass Window : public QWidgetQ_OBJECTpublic:Window(void);Window(void);private slots:void setTable();void testLex();bool singleStep();void allStep();bool SaveFile();private:bool isInit;int stepNumber;Ui:SyntaxDialog *ui;ccyg:Syntax syntax;QStandardItemModel *tableModel;std:vector symbolStack;std:vector inputStack;std:vector actionStack;/*window.cpp*/#include Window.h#include GeneratedFiles/Debug/moc_Window.h#include #include #include #include using namespace ccyg;Window:Window(void)stepNumber = 0;isInit = false;ui = new Ui:SyntaxDialog;ui-setupUi(this);ui-pushButton_Single-setEnabled(false);ui-pushButton_All-setEnabled(false);ui-pushButton_Save-setEnabled(false);tableModel = new QStandardItemModel(this);connect(ui-lineEdit,SIGNAL(textChanged(QString),this,SLOT(testLex();connect(ui-pushButton_Single ,SIGNAL(clicked(),this,SLOT(singleStep();connect(ui-pushButton_All ,SIGNAL(clicked(),this,SLOT(allStep();connect(ui-pushButton_Save ,SIGNAL(clicked(),this,SLOT(SaveFile();setTable();Window:Window(void)delete tableModel;delete ui;void Window:setTable()/准备数据模型tableModel-clear();tableModel-setHorizontalHeaderItem(0, new QStandardItem(QObject:tr(符号栈);tableModel-setHorizontalHeaderItem(1, new QStandardItem(QObject:tr(输入串);tableModel-setHorizontalHeaderItem(2, new QStandardItem(QObject:tr(动作);/利用setModel()方法将数据模型与QTableView绑定ui-tableView-setModel(tableModel);ui-tableView-verticalHeader()-hide();void Window:testLex()isInit = false;std:string source = ui-lineEdit-text().toStdString();if (source.size()0)syntax.setSource(source);if (syntax.Init()ui-label_Status-setText(tr(词法分析正确);ui-pushButton_Single-setEnabled(true);ui-pushButton_All-setEnabled(true);elseui-label_Status-setText(tr(词法分析错误);ui-pushButton_Single-setEnabled(false);ui-pushButton_All-setEnabled(false);elseui-pushButton_Single-setEnabled(false);ui-pushButton_All-setEnabled(false);bool Window:singleStep()if (isInit = false)symbolStack.clear();inputStack.clear();actionStack.clear();stepNumber = 0;tableModel-clear();setTable();isInit = true;ui-lineEdit-setEnabled(false);bool isSuccess = syntax.nextStep();if (syntax.error.size()0)ui-label_Status-setText(QString:fromStdString(syntax.error);ui-pushButton_Single-setEnabled(false);ui-pushButton_All-setEnabled(false);ui-pushButton_Save-setEnabled(true);ui-lineEdit-setEnabled(true);return true;tableModel-setItem(stepNumber, 0, new QStandardItem(QString:fromStdString(syntax.sym);tableModel-setItem(stepNumber, 1, new QStandardItem(QString:fromStdString(syntax.input);tableModel-setItem(stepNumber, 2, new QStandardItem(QString:fromStdString(syntax.action);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论