编译原理课程设计报告 简单编译器的设计与实现


    


    编译原理课程设计
    ——简单编译器设计实现












    班 级:
    组长:
    组员:


    指导教师:
    设计时间:






    姓名
    分工
    组长:

    语法分析部分语义分析中间代码生成部分符号表理目标代码生成数结构设计总体框架设计
    组员:

    中间代码优化部分负责DAG图中获优化四元式代码中间变量填写入符号表
    组员:

    中间代码优化部分负责优化DAG图建立
    组员:

    词法分析部分词法分析部分符号表错误表记录










    摘 4
    1概述 5
    2课程设计务求 6
    21 设计务 6
    22 设计求 6
    3算法数结构 7
    31算法总体思想(流程) 7
    32词法分析模块 8
    321功 8
    322数结构 8
    323算法 10
    33语法分析(含语义分析中间代码生成)模块 11
    331功 11
    332数结构 13
    333算法 16
    34中间代码优化模块 19
    341功 19
    342数结构 20
    343算法 20
    35目标代码生成模块 23
    351功 23
    352数结构 24
    353算法 24
    4程序设计实现 26
    41程序流程图 26
    42 程序说明 26
    43实验结果 32
    5系统特色 40
    6结 41
    7参考文献 41
    8收获体会建议 41









    编译器进行工作般划分五阶段:词法分析语法分析语义分析中间代码产生中间代码优化目标代码生成
    设计实现简单类C语言编译器该编译器拥完整前端端够进行基编译功产生执行文件屏幕输出源程序运行结果
    该编译器词法分析器识绝部分标准C语言支持词法符号该词法分析器滤空格Tab回车支持注释功该词法分析器通限动机状态跳转实现根动机结束状态该单词TOKEN值该模块具词法错误位置提示功
    该编译器语法部分采递降子程序文法分析方法设计文法支持函数函数类型声明变量类型声明变量定义表达式语句if条件语句while循环语句简单输出功表达式语句方面设计支持算术运算关系运算逻辑运算位运算功语法结构语法支持维数组结构体该编译器语义分析生成四元式阶段够变量定义语法错误进行检测够识出未定义标识符重复定义标识符该阶段终实现生成中间代码——四元式
    该编译器拥中间代码优化模块采DAG优化算法基块四元式进行优化该编译器目标代码8086汇编语言代码够实现优化四元式序列转化生成执行汇编语言文件运行执行该文件屏幕输出运算结果
    该编译程序特色够终结果输出显示屏幕该编译程序够支持前置++置++种语法拥类似C语言种简便性

    关键词:编译原理词法分析语法分析四元式DAG算法









    1概述
    编译原理课程兼强理性实践性计算机专业门非常重专业基础课程系统软件中占十分重位编译原理课程设计课程重综合实践教学环节时实验补充通编译器相关子系统设计学生够更掌握编译原理基理编译程序构造基方法技巧融会贯通课程学专业理知识培养学生独立分析问题解决问题力系统软件设计力培养学生创新力团队协作精神
    编译器进行工作般划分五阶段:词法分析语法分析语义分析中间代码产生中间代码优化目标代码生成
    首先词法分析针词法分析设计识绝部分标准C语言支持词法符号该词法分析器滤空格Tab回车支持注释功滤掉注释符号面代码该词法通限动机状态跳转实现根动机结束状态该单词TOKEN值词法分析器识单词该单词记录果数会符号表相应位置记录值果标识符会先符号表进行查询没记录符号表相应TOKEN指针指表中该位置
    接进行语法分析语法分析部分会编写代码语法进行检验否合设定语法规里采递降子程序文法分析方法设计文法支持函数函数类型声明变量类型声明变量定义表达式语句if条件语句while循环语句cout简单输出功表达式语句方面设计支持算术运算关系运算逻辑运算位运算功语法结构语法支持维数组结构体
    语义分析中间代码产生阶段语法分析程序相应部分加语义动作实现输入语句转换成识中间代码——四元式形式语义分析部分做工作识数标识符时压入语义栈语法分析需生成相应四元式时执行构建四元式动作语义栈中数作四元式数组成部分符号表构建语法分析变量定义语句时需定义变量记录符号表记录前需检查符号表该符号否已定义检查重复定义错误语义分析中间代码产生语法分析时进行语法分析结束输入容语法正确获相应四元式序列
    然优化阶段优化阶段运DAG优化算法首先编译器前端生成四元式划分基块然基块执行DAG优化算法通该算法删余赋值操作中间变量减少四元式数量更简洁四元式序列
    阶段目标代码生成该阶段四元式进步翻译生成相应目标代码选定目标代码8086汇编语言代码该阶段务优化四元式序列转化生成执行汇编语言文件进步运行执行该文件屏幕输出运算结果

    2课程设计务求
    21 设计务
    设计简单文法编译器该编译器包括完整前端端该编译器划分词法分析语法分析语义动作中间代码优化目标代码生成四模块
    词法分析:
    够识标准C语言支持部分词法够进行简单词法错误判断输出错误提示具注释功够滤掉符号空格Tab回车等
    语法分析语义动作:
    够支持基类似C语言基语法语法够支持声明语句基类型变量定义整型实型字符型数够支持表达式语句包括赋值表达式算术表达式逻辑表达式关系表达式位运算表达式够支持if条件语句while循环语句
    中间代码优化:
    采DAG优化算法够四元式进行优化减少中间代码数量提高编译生成程序效率
    目标代码生成:
    中间代码生成汇编语言代码实现目标代码运行验证编译器编译结果正确性
    22 设计求
    1深入理解编译原理基原理基础选定题目组单位先确定设计方案
    2设计系统数结构程序结构设计模块处理流程求设计合理
    3编程序实现系统求运行界面应清楚反映出系统运行结果
    4确定测试方案选择测试例系统进行测试
    5运行系统通验收讲解运行结果说明系统特色创新处回答指导教师提问
    6提交课程设计报告

    3算法数结构
    31算法总体思想(流程)
    编译器设计功划分四部分通四部分实现编译器全部功图


    图31 算法总体思想图

    词法分析器输入字符流进行词法分析识单词生成相应TOKEN码记录数信息
    语法分析语义分析中间代码生成划分模块分割性某语法分析通开始产生语义动作生成相应四元式该部分词法分析产生TOKEN序列进行语法分析符号表中记录相关数信息产生中间代码
    中间代码优化模块简化中间代码设计该部分通四元式构建相应图通算法产生优化四元式序列
    目标代码生成模块产生汇编代码优化四元式进行翻译生成应汇编语言
    该编译器包含前端端基功够进行词法错误检测语法错误检测标识符定义错误检测提示错误行数编译生成直接运行汇编程序算较完整简单编译器

    32词法分析模块
    321功
    通源程序输入该模块词法分析器够进行分析检测词法否正确生成相应TOKEN码符号表中记录果遇错误词法记录错误表中
    该词法分析器识词法包括部分
    整数:TOKEN值0
    实数:TOKEN值1
    字符:TOKEN值2
    字符串:TOKEN值3
    标识符:TOKEN值4
    关键字:TOKEN值1049
    现够识关键字:
    autoshortintlongrealdoublecharstructunionenumtypedefconstunsignedsignedexternregisterstaticvolatilevoidifelseswitchcasefordowhilegotocontinuebreakdefaultsizeofreturnboolcout
    界符:TOKEN值5069
    现够识界符:
    {’}’(’)’[’]’’’’’’’>’’#’
    运算符:TOKEN值7099
    现够识运算符:
    +’’*’’’++’’’>’>’<’<’’’&&’||’’&’|’^’~’>>’<<’

    322数结构
    关键字表界符表运算符表采二维数组形式进行存储TOKEN表采结构体数结构进行存储里面包含该单词token码该单词行数会根该单词类型指相应符号表区域错误表采结构体形式中包含错误行数错误类型错误容等信息户报告源程序相关词法语法声明错误

    char KT[34][15]{autoshortintlongreal
    doublecharstructunionenumtypedef
    constunsignedsignedexternregisterstatic
    volatilevoidifelseswitchcasefor
    dowhilegotocontinuebreakdefault
    sizeofreturnboolcout
    }关键字表

    char PT[14][3]{{}()[]
    \\'>#
    }界符表

    char OT[23][3]{+*++
    >><<
    &&||
    &|^~>><<
    }运算符表

    typedef struct ERRORL{错误记录表
    int line错误行数
    char type错误类型
    char name[100]错误容
    struct ERRORL* next
    }ERRORL

    typedef struct TOKEN{TOKEN记录
    char token[3]token码
    int line行数记录系统编码标记
    struct INT* tpI整型指针
    struct REAL* tpR实型指针
    struct CHAR* tpC字符指针
    struct SYNBL* tpIT标识符表指针
    char* tpKT关键字指针
    char* tpPT界符指针
    char* tpOT运算符指针
    struct TOKEN* next
    }TOKEN

    typedef struct Identifier{标识符表
    struct SYNBL* tp
    struct Identifier* next
    }Identifier

    typedef struct INT{整数型表
    int numi
    }INT

    typedef struct REAL{实数型表
    float numf
    }REAL

    typedef struct CHAR{字符型表
    char numc
    }CHAR

    typedef struct SYNBL{标识符表
    char name[100]标识符名字
    struct TYPEL* type类型表指针
    char cat种类目前:f(函数)a(数组)d(结构)v(变量)n(换名形参)g(赋值形参)
    char L活跃信息
    struct PFINFL* pfinfl函数表指针
    struct LENL* lenl长度表指针
    struct VALL* vall活动记录表指针
    struct SYNBL* next
    }SYNBL

    323算法
    算法流程图示该词法模块读取字符首先会检验该字符否空格Tab回车等需滤字符果读果遇注释符号该行均读直遇换行符开始读取行字符执行面算法

    图32 词法分析算法

    33语法分析(含语义分析中间代码生成)模块
    331功
    该模块接收词法分析模块TOKEN序列通TOKEN序列语法分析判断该语法否合法果合法执行相应语义动作生成中间代码
    语法分析模块设计较接C语言语法结构然C语言语法灵活然够满足户基需求源程序编写C语言类似C语言户说没陌生感
    文法结构(里{}代表循环生成符号’{’外面单引号):
    函数体文法:
    Start > Function{Function}
    Function > FType i4 (’ Parameter )’ { Declaration Content }’
    类型文法:
    FType > void’|Type
    Type > int’|’real’|’char’
    Parameter > |’void’|Type Id { ’ Type Id }
    Id > i4|i4 [ i1 ]’
    结构体声明文法:
    Declaration > {|’struct’ i4 { Base_declaration }’ ’|Base_declaration }
    基类型定义文法:
    Base_declaration > |{ Type Id { ’ Id } ’ }
    语句块文法:
    Content > Structure { Structure }
    Structure > |E ’|If|While|Fun|Cout
    函数调文法:
    Fun > i4 ( )’ ’|i4 ( Assignment { ’ Assignment } )’ ’
    if条件语句文法:
    If > if’ ( Expression )’ { Content }’|
    if’ ( Expression )’ { Content }’ else’ { Content }’
    while循环语句文法:
    While > while’ ( Expression )’ { Content }’
    逗号表达式文法:
    Expression > Assignment { ’ Assignment }
    赋值表达式文法:
    Assignment > i4 ’ Id ’ Logical_or | Id ’ Logical_or | Logical_or
    逻辑表达式文法:
    Logical_or > Logical_and { ||’ Logical_and }
    Logical_and > Inclusive_or { &&’ Inclusive_or }
    Inclusive_or >Exclusive_or { |’ Exclusive_or }
    Exclusive_or >And { ^’ And }
    And > Equality { &’ Equality }
    关系表达式文法:
    Equality > Relational { w0 Relational }
    Relational > Shift { w1 Shift }
    算术表达式文法:
    Shift > Additive { w2 Additive }
    Additive > Multiplicative { w3 Multiplicative }
    Multiplicative > Unary { w4 Unary }
    前置算符文法:
    Unary > w5 Postfix | Postfix
    置算符文法:
    Postfix >Primary { w6 }
    Primary >i4|constant| ( Expression )’
    中符号表示:
    w0 > ’ | ’
    w1 > <’ | >’ | <’ | >’
    w2 > <<’ | >>’
    w3 > +’ |
    w4 > *’ | ’ | ’
    w5 > ’ | ~’ | ++’ | | sizeof’
    w6 > ++’ | | [ Expression ]’ | ’ i4
    中constant整数实数者字符类型数i4户定义标识符字母数字划线组成数字开头关键字相

    该模块执行相应语义功中间代码生成语义功包括变量定义表达式四元式生成if条件语句while循环语句四元式生成等
    变量定义需实现符号表进行信息交换功该变量定义文法通检验会符号表中查找该标识符名称果没查该变量类型相关信息写入符号表果符号表中查询该标识符说明该变量名已定义错误表中写入标识符重复定义错误信息标注错误行数
    表达式ifwhile语句相应文法检验程中会操作数进行压栈处理文法检验成功会弹出操作数生成相应四元式序列
    语句通文法检验生成相应四元式该模块会四元式中操作数进行检测果该操作数户定义标识符符号表中查询果出现符号表中查询标识符说明该标识符未定义时错误表中写入标识符未定义错误信息标注错误行数
    332数结构
    语法分析程词法分析生成token序列进行分析判断否符合语法标准需新数结构需获取token序列
    语义分析程需额外数结构语义动作相应操作进行存储中生成四元式程中需语义栈存储前token便识算符语法结束位置时语义栈中弹出token生成相应四元式序列外语法分析程中变量数组定义结构体声明语法检验通通执行相应语义动作相关信息填写入符号表
    里新增语义栈结构体存储生成四元式需操作数开辟四元式链表存储生成四元式四元式中运算符通二维数组数结构保存时符号表中需类型表数组表结构体表中类型表存储标识符类型果该标识符数组者结构体需额外数组表结构体表存储数间关系

    typedef struct SEM{语义栈
    struct TOKEN* tpToken
    struct SEM* fron
    struct SEM* next
    }SEM

    typedef struct Operand{操作数
    struct TOKEN* tpToken
    }Operand

    char OperatorL[37][5]{+*++
    >><<
    &&||
    &|^~>><<
    gtlbifeliewhdoweincdecarrsico
    }

    typedef struct Quaternary{四元式
    char* Operator操作符表
    struct Operand* operand[3]3操作数
    struct Quaternary* next
    }Quaternary

    typedef struct TYPEL{类型表
    char tval类码类型代码决定列指针选择现类码:i(整型)r(实型)c(字符型)a(数组)d(结构体)
    struct AINFL* ainfl数组表指针
    struct RINFL* rinfl结构体表指针
    }TYPEL

    typedef struct AINFL{数组表
    int low数组界
    int up数组界
    struct TYPEL* ctp成分类型指针指该维数组成分类型指针
    int clen成分类型长度成分类型数占值单元数
    }AINFL

    typedef struct RINFL{结构表
    char ID[10]结构域名
    int OFF(区距)—idk值单元首址相记录值区区头位置
    struct TYPEL* TP指针指idk域成分类型(类型表中信息)
    }RINFL

    333算法

    图33 赋值语法算法


    图34 逻辑算法


    图35 数生成部分算法


    图36 if条件语句算法


    图37 while循环语句算法

    34中间代码优化模块
    341功
    该部分功前端四元式进行优化目精简代码数量编译程序够更高效运行里采DAG算法中间代码进行优化
    首先前端输出四元式进行基块划分然基块执行DAG算法构造图该图中获取优化四元式序列清空该图基块执行相算法直基块四元式序列优化止输出优化四元式序列

    342数结构
    中间代码优化部分需建立图通相应算法实现基块优化里需图数结构该图结点左右孩子编号运算符标记前指针中单独创建标记链表数结构首标记作标记标记面连接标记作标记运算符记录四元式运算符左右孩子记录单目运算符双目运算符指操作数标记记录操作数前指针DAG算法中更方便查找删重复非户定义标识符
    外创建块链表存储分块四元式方便四元式基块进行划分保存便进行DAG算法优化

    typedef struct Block{
    struct Quaternary* qua_block分块四元式块集合
    struct Block* next块
    }Block

    typedef struct DAG{图
    int num
    char* oper
    struct Mark* mark
    struct DAG* lchild
    struct DAG* rchild
    struct DAG* next
    struct DAG* fron
    }DAG

    typedef struct Mark{标记
    struct TOKEN* name
    struct Mark* fron
    struct Mark* next
    }Mark

    343算法
    划分基块算法:

    图38 构建基块算法

    构建DAG优化图算法示:

    图39 DAG优化创建算法

    DAG中获取优化四元式算法图示:

    图310 优化四元式获取算法

    35目标代码生成模块
    351功
    该模块功通优化四元式序列生成目标代码——汇编语言该部分首先会四元式序列进行分析四元式序列中操作数进行判断果该操作数系统生成中间变量(该中间变量运算化简中舍弃)会符号表中查找符号表中否存该变量果存该变量符号表中写入该变量标注变量类型方便接目标代码生成
    基块序读取优化四元式序列根四元式运算符进行判断生成相应汇编代码基块读完汇编代码生成完毕汇编代码输出ASM文件中运行DOS编译连接运行源程序运行结果
    352数结构
    该部分需数结构存储目标语句里采链表数结构目标语句链表保存目标语句相关信息中包含存储目标代码语句该语句处位置标号前语句类型
    前语句类型目前4种种0表示语句般语句外3种分ied分代表ifelsedo四元式产生目标语句语句涉跳转需读取跳转语句时获址信息生成目标语句跳转址需回填语句类型作回填时查找该语句标志
    typedef struct Object{目标语句
    char code[30]存储目标代码
    int lab标号
    char type需回填类型0需回填iif回填eelse回填ddo回填
    struct Object* fron
    struct Object* next
    }Object

    353算法
    目标代码生成算法图示:

    图311 目标代码生成算法

    4程序设计实现
    41程序流程图

    图41 程序运行流程图
    42 程序说明
    程序编写C++语言采类封装整编译器拆分四模块分词法分析器模块语法分析(含语义分析中间代码生成)模块中间代码优化模块目标代码生成模块模块次继承实现良封装性
    面模块类设计模块含成员方法进行说明
    词法分析:
    class Scanner{词法分析器模块
    private
    char chch_before前词前词
    int statestate_before状态前状态
    int linewarn行数警告
    void CreatNewToken(TOKEN*& t)创建新Token结点
    void reset(int& statechar* codeint& iint& warn)重置动机状态
    int state_change(int stchar chint& warn)动机状态转换
    void state_to_code(TOKEN* t int state_before char code[100] int line int warn)根动机状态生成Token序列
    public
    struct TOKEN* tokentoken头指针
    struct ERRORL* error_head错误表头指针
    struct ERRORL* error_now错误表前位置
    Scanner(){tokenNULLerror_headNULLerror_nowNULL}构造函数
    void Scan()词法分析函数
    int Findexist(char* code TOKEN*& p)查询符号表函数
    void ConvertItoS(int i string& s)类型转换int to string
    void ConvertFtoS(float fstring& st)类型转换float to string
    void ConvertStoC(string stchar* c)类型转换string to char
    void ConvertStoI(string stint& i)类型转换string to int
    void ConvertStoF(string stfloat& f)类型转换string to float
    void CoutErrorL()输出错误表
    }

    语法分析语义分析中间代码生成:
    class GrammaticalAnalysispublic Scanner{语法分析语义动作
    中间代码生成模块
    private
    语法部分
    struct TOKEN* ch前词
    int Start()语法开始
    int Function()语法函数
    int Parameter()语法参数
    int FType()语法函数类型
    int Type()语法变量类型
    int Declaration()语法声明
    int Base_declaration()语法基类型声明
    int Id()语法基类型
    int Id_Expression()语法数类型
    int Content()语法容
    int Structure()语法结构
    int Expression()语法表达式
    int Cout()语法输出函数
    int Assignment()语法赋值
    int Logical_or()语法逻辑
    int Logical_and()语法逻辑
    int Inclusive_or()语法
    int Exclusive_or()语法异
    int And()语法位
    int Equality()语法相等
    int Relational()语法等
    int Shift()语法移位
    int Additive()语法加法减法
    int Multiplicative()语法法法
    int Unary()语法前置算符
    int Postfix()语法置算符
    int Primary()语法标识符常数生成
    int IF()语法if条件语句
    int While()语法while循环语句
    int Fun()语法函数语句
    语义部分
    int d结构体标记
    struct TOKEN* type类型标记
    struct TOKEN* ch_sem入语义栈词
    struct TOKEN* operand_now前操作数
    struct SEM* top栈顶
    struct SEM* base栈底
    struct Quaternary* quater_now前四元式指针
    void CreateSEM()生成语义栈
    void PushStack()入栈
    void DeStack()出栈
    int mark标明运算符位置
    int counter系统变量计数器
    void CreateQuaternary()生成四元式
    void PushQuaternary()入四元式队列
    void Bi_oper_qua()双目算符操作数生成
    void Unary_oper_qua()单目算符操作数生成
    void Assign_oper_qua()赋值操作数生成
    void If_While_qua()IF条件WHILE循环操作数生成
    void GetMark(TOKEN* ch_ope)获取运算符
    void GetMark_front(TOKEN* ch_ope)获取前置运算符
    int FindSynbl()查重
    void PushSynbl()添加进符号表
    int CoutSynbl()输出符号表
    void CheckSynbl()检查标识符否定义未定义记录错误表中

    public
    void Grammar()
    语法部分
    int result
    GrammaticalAnalysis(){tokenNULLcounter1d0error_headNULLerror_nowNULL}
    语义部分
    struct Operand* operand[3]语义操作数
    struct Quaternary* quater四元式
    struct Identifier* id户定义标识符
    struct Identifier* id_now前标识符指针
    void CoutQuaternary()输出四元式
    }

    中间代码优化:
    class Optimizationpublic GrammaticalAnalysis{中间代码优化模块
    private
    struct Quaternary* optimize_now前优化四元式
    struct Block* optimize_block_now优化前块
    struct Block* block_now前块指针
    struct Quaternary* qua四元式
    struct DAG* dag_headDAG头指针
    struct DAG* dag_tailDAG尾指针
    struct DAG* dag_nowDAG前指针
    struct Operand* find_now_num1前查找词
    struct Operand* find_now_num2前查找词
    char* find_now_ope前查找运算符
    struct Operand* add_now前需加入结点
    char* op_now前运算符
    struct DAG* find_begin查找开始处
    struct DAG* pos找位置
    struct Mark* mark_pos找标记位置
    struct DAG* temp_dag交换标记dag结点
    struct Mark* temp1交换标记1
    struct Mark* temp2交换标记2
    void CreateOptimize()创建优化四元式头部
    void CreateOptimize_Block()创建优化块头部
    void DivideBlock()块划分函数
    void CoutBlock()基块输出四元式
    void CreateDAG()创建DAG
    void DeleteDAG()删DAG
    void AddDAG()加入DAG点
    int FindDAG()检查重复DAG结点
    int FindDAG_unary()检查单目运算符重复DAG结点
    int FindDAG_Bi()检查双目运算符重复DAG结点
    int MainMark()检查该标记标记
    void SwopMark()交换两标记
    void DeleteMark()删标记
    void GetDAG()DAG生成结果
    void CoutOptimize()输出优化四元式
    public
    struct Quaternary* optimize优化四元式
    struct Block* optimize_block优化块
    struct Block* block块指针
    void Optimize()
    Optimization(){dag_headNULLdag_tailNULLdag_nowNULL}


    }

    目标代码生成:
    class ObjectCodepublic Optimization{目标代码生成模块
    private
    struct Object* obj_now前目标代码
    struct Object* obj_find回溯找目标代码位置
    struct Block* blo
    struct Quaternary* qua
    struct Operand* num前操作数
    char numType操作数类型
    int find_num需查找系统变量名称
    int lab标号
    char type_find需查找目标代码类型iifeelseddo回溯重填跳转位置
    int SystemExist()查找符号表中否必须中间变量
    void UpdateSymbol()更新符号表系统生成中间变量放入
    void GetObjCode()生成目标代码
    void AddObject()加入obj结点
    void CoutObj()输出目标代码
    void Judge(string& st)获取操作数类型存numType
    int Find_obj()前寻找相应类型首目标代码语句
    int Find_obj_head()前寻找相应类型首目标代码语句
    目标代码生成函数(代码段具体语句)
    void MOV_BX_A()
    void MOV_BX_B()
    void MOV_CX_B()
    void MOV_C_BX()
    void MOV_C_CX()
    void MOV_A_BX()
    void MOV_AX_A()
    void MOV_C_AX()
    void MOV_DX_ZERO()
    void MOV_C_DX()
    void MOV_CX_ONE()
    void MOV_CX_ZERO()
    void CMP_AX_BX()
    void CMP_AX_ZERO()
    void CMP_BX_ZERO()
    void GetHead()目标代码头部生成(含数段)
    void GetTail()目标代码尾部生成
    public
    struct Object* obj目标代码指针
    void ObjCode()目标代码函数
    ObjectCode(){lab0}构造函数
    }


    43实验结果

    测试样例1:
    void main(){
    int ab
    struct A{
    int c
    int d
    }
    a1
    b1
    while(b<5){
    if(a20){
    cout a
    }
    else{
    b++
    }
    ++a
    }
    }

    词法分析模块:
    输出结果示显示结果行数token值单词

    图42 词法分析结果

    语法分析模块:
    变量定义会保存符号表中标识符检测目标代码生成阶段符号表存储结果图

    图43 符号表显示

    该模块会执行相应语义动作生成中间代码——四元式产生四元式结果图示

    图44 四元式显示结果

    中间代码优化:
    中间代码优化采DAG算法基块进行四元式优化优化四元式结果图示

    图45 优化四元式结果
    目标代码生成:
    目标代码模块会产生相应汇编代码终生成编译ASM汇编文件生成终文件结果图示

    图46 目标代码生成结果

    该模块已配置相应环境会动调汇编编译文件生成执行文件动执行该执行文件屏幕印输出源程序结果实现完整编译程序运行结果图示

    图47 源程序结果显示

    测试样例2
    void main(){
    int abc
    a1
    b1
    c15
    while(a<5){
    cout a++
    }
    cout c
    while(b<5){
    cout ++b
    }
    }
    词法分析:

    图48 词法分析结果

    语法分析:

    图49 四元式生成结果

    中间代码优化:

    图410 中间代码优化结果

    目标代码生成:

    图411 汇编代码生成结果


    图412 程序运行结果

    程序容错性测试:
    词法错误检测:
    测试样例:
    int main(){
    real ab
    char c
    char d[10]
    a15
    b1
    c'a
    dhello
    }

    该测试样具明显词法错误实数数点直接分号结束字符数缺少右半边单引号字符串数缺少右半边双引号
    输入错误单词形式者程序法识字符时词法分析器会检测该错误单词提示错误行数测试结果图示

    图413 词法错误检测

    语法语义错误检测:
    测试样例:
    int main(){
    real a
    int c
    a15
    b123
    c3*d
    }

    该测试样例变量定义存错误变量b变量d未定义标识符测试样例存语法错误第三行分号语法模块中会进行检测未定义错误记录错误表中测试结果示

    图414 语法错误变量定义错误检测

    5系统特色
    (1)设计实现完整编译程序包括词法分析语法分析语义分析中间代码生成中间代码优化目标代码生成
    (2)通程序编译执行文件设计简单cout输出功程序运行结果显示屏幕验证编译程序正确性
    (3)语法设计前置++()置++()类C语言功i++者++i种语法运算结果C语言运算结果致
    (4)语法支持标准C语言全部算术运算逻辑运算关系运算位运算支持ifelse条件语句while循环语句
    (5)具编译错误提示功提示词法错误语法错误标识符未定义错误标识符重复定义错误等会提示错误行数方便户修改源程序实现良户体验

    6结
    总体说设计实现较完整拥前端端够生成执行文件够程序运行结果简单编译器该编译器终设计目实现
    编译器够识标准C语言支持绝部分词法符号具词法错误记录功够提示词法错误位置语法部分编译器支持变量定义数组定义函数声明类表达式语句ifelse条件语句while循环语句输出结果cout语句语义动作生成相应语句动作四元式实现编译前端样语法方面错误会记录错误表终生成错误记录提示户编译器端方面编译器生成四元式序列进行DAG算法优化简化中间代码编译器生成够执行汇编语言文件运行实现源程序结果输出显示实现真正意义完整编译运行
    时间紧务重编译器总体设计功基实现美中足没实现更功例结构体函数调等功语法结构支持语法语义动作相关实现没做算需改进努力方总说编译器设计务取较实现结果

    7参考文献
    1陈火旺程序设计语言编译原理(第3版) 北京:国防工业出版社2000
    2美 Alfred VAho Ravi Sethi Jeffrey D Ullman著李建中姜守旭译编译原理北京:机械工业出版社2003
    3美 Kenneth CLouden著冯博琴等译编译原理实践北京:机械工业出版社2002
    4金成植著编译程序构造原理实现技术 北京:高等教育出版社 2002

    8收获体会建议

    次编译原理课程设计说说挑战然学编译原理知道编译程回事想程通程序编写出实现编译器说确实挑战
    感受深张老师讲课程设计求时设计符号表结构时候设计支持功表设计语法功时先简单开始实现等整流程实现增加新功样符号表整体布局设计增添起较容易开始设计功然写完程序设计结束感份建议确实重写编译器东西新手难整体编译器模块设计整体握时候设计模块数结构时候较迷茫知道设计成什样结构够支持功等部分程序功真正写出发现结构部分进行修改头疼问题结构体方便扩展没造成太困扰
    等编译程序体框架功实现差时候编译器整体设计较清晰完整认识包括模块进行什样功实现功什时候符号表进行操作什时候进行指针连接等等问题没真正开始设计编译器前会想旦开始设计必须面问题问题解决编译器设计细节更深步解
    整编译器设计程中感觉难令头疼部分必须符号表理问题什时候填写符号表什时候进行标识符检查语义动作时应该符号表进行种数交换目标代码生成时符号表问题编程程中步步解决受益匪浅收获颇
    总次编译课设真止学期间难次课程设计付出里面时间前课设加起付出总收获次课设编译器实现流程较清晰理解更重编译原理工具更深刻认识培养浓厚兴趣受益匪浅


    完成实验收获感概颇程较艰难种问题实验总结感悟:做课设前提学门课课程设计学知识灵活运果知识没掌握清楚更说运善利搜索引擎出现问题者没头绪时利获取需信息完成代码优化功时Google搜索相关方法获取种方法拓宽思路边做边学知识永远止境知识学完更提前做实验前知识先学完样费时费力学定着边做边学动手做加强印象节省时间提高学力效率谦虚乐学长学姐老师学请教感谢老师学帮助感谢组长组员帮助希老师学合作


    刚课设题目时候感觉没头绪前编译器感觉理然轮设计时候知道难负责编译器中间代码四元式优化通查阅资料请教学弄懂DAG优化原理方法学会理知识便开始着手设计优化程中遇问题学老师帮助终完成编译器优化部分
    通次编译原理课程设计深切体会学理知识远远够算课堂老师讲知识点全部听懂真正做起会头雾水手点点试改通次课程设计编译器整运作程程需完成务更深刻理解认知纸终觉浅绝知事躬行通次课程设计理知识设计实现结合起编译原理门课程更深入认识提高力锻炼团队协作力发现问题解决问题力希学中更注重实践


    次编译原理课程设计说获益非浅学知识终做出点东西已三说实话直感觉课知识老师说基础定掌握做考8090分感种心虚实觉学应该断成中进行学知道完成务时候种成感学肯定会带限信心继续学热情觉断实践取定成果样学次课程设计次真正展现力机会通断努力终成功
    通次课程设计懂理实际相结合重理知识远远够学理知识实践相结合起理中出结真正社会服务提高实际动手力独立思考力编程程中重点回顾函数部分文件操作部分
    总体算法流程图困难问题问题纸快解决解决课程设计问题程序具体编写应该难事着手实际编程时问题接连出现什样函数函数必须设置返回值函数返回值什类型函数应该具备参数见程序需断更改完善程序变量起作反复变量严重降低程序安全性阅读性加选择循环语句嵌套判定变量应该出现具体位置件困难问题放置正确结果出现错误容易找出错原
    者课程设计报告书写需精力尤word排版细节问题需认真注意然付出换回收获观独立完成课程设计熟悉程序设计中出现问题解决方案疑加深程序设计员设计项目印象增进编程力熟悉程序设计具体流程相关作业基础掌握什编译程序编译程序工作基程阶段基务熟悉编译程序总流程框图解编译程序生成程构造工具相关技术课知识更深理解通该算法容算法执行序计算机实现原深奥书知识变更简单实验原理更深理解解设计编制调试词法分析程序加深词法分析原理理解熟悉构造词法分析程序手工方式相关原理全面系统理解编译原理程序构造般原理基实现方法死板课知识变生动趣激发学积极性学计算机编译原理知识强化够课堂学知识通设计程序表示出加深理知识理解


    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 10 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    西电编译原理上机报告DBMS的设计与实现

    编译原理上机报告《DBMS的设计与实现》学号: 姓名: 手机: 邮箱: 完成时间:2013 年X月X日目 录1. 项目概...

    2年前   
    308    0

    编译原理课程设计心得体会

    编译原理课程设计心得体会  经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计。通过该课程设计,收获颇多。  一、对实验原理有更深的理解  通过该课程设计,掌握了什么是...

    11年前   
    629    0

    计算机组成原理简单模型机设计课程设计

    计算机组成原理课程设计任务书题目: 模型机设计—1 学生姓名: 学 号: 班级:计算机科学与技术班 指导...

    2年前   
    510    0

    《编译原理》课程实验报告

    《编译原理》课程实验报告题 目: 词法分析器实验 专 业: 计算机科学与技术 班 级: 1班 学 号: ...

    3年前   
    619    0

    《化工原理课程设计》报告换热器的设计

     《化工原理课程设计》报告 换热器的设计 目录 概述 1...

    5年前   
    1633    0

    编译原理课程设计LR(0)分析器自动构造程序

    XX学院工科课程设计 -《编译原理》课程设计报告 题 目: LR(0)分析器自动构造程序的实现 学 号: ...

    2年前   
    397    0

    通信原理课程设计PAM调制与解调系统的MATLAB实现及性能分析

    PAM的调制与解调目录摘要 引言 1.1 课程设计目的 1.2 课程设计内容 2.1 PAM调制信号的频谱 2.2 PAM调制过程的波形和频谱图 3.1正弦波矩形抽样 3.2矩形波调制 ...

    11个月前   
    381    0

    自动控制原理课程设计报告

    课 题: 课题十六 专 业: 电气工程及其自动化班 级: 姓名学号: ...

    3年前   
    1206    0

    计算机组成原理课程设计报告

    课 程 设 计 报 告课程名称 计算机组成原理 课题名称 复杂模型计算机的设计 专 业 网络工程 ...

    3年前   
    783    0

    交通规划原理课程设计

     交通规划课程设计Course Exercise in Traffic Planning专业班级:交通工程姓名: 班级: 交工班 学号: ...

    1年前   
    315    0

    化工原理课程设计作业

    化工原理课程设计作业题目1、2 、3、4用水冷却煤油产品的列管式换热器设计任务书一、设计名称用水冷却煤油产品的多程列管式换热器设计二、设计条件第1、2组:使煤油从140℃冷却到40℃,压力1b...

    2年前   
    522    0

    编译原理语法分析实验报告

    编译原理语法分析实验报告软工班一、 实验内容二、 实验目的三、 实验要求四、 程序流程图l 主函数;l scanner();l irparser()函数l yucu() /*语句串分析*/l...

    2年前   
    933    0

    Ping程序的设计与实现课程设计

     计算机网络课程设计报告设计名称 Ping程序的设计与实现 专业班级 同组人姓名 ...

    3年前   
    617    0

    编译原理实验指导书

    目 录相关问题说明 1实验题 2实验1 词法分析(2课时) 3实验2 语法分析(2课时) 5实验3 语义分析(2课时) 7实验4 代码生成(2课时) 9参考书目 11相关问题说明本课程共有4个...

    3年前   
    575    0

    编译原理课后习题答案

    编译原理课后习题答案Chapter 11.解答:程序设计语言:程序设计语言是遵守一定规范的、描述“计算”(Computing)过程的形式语言。一般可以划分为低级语言和高级语言两大类。低级语言是...

    1年前   
    588    0

    《编译原理》期末试题(五)

    1.语言是A.句子的集合 B.产生式的集合 C.符号串的集合 D.句型的集合2.编译程序前三个阶段完成的工作是A.词法分析...

    2年前   
    722    0

    列管式换热器设计化工原理课程设计

    课 程 设 计设计题目 列管式换热器的设计学生姓名 学 号 专业班级 高分子材料与工程班指...

    1年前   
    362    0

    基于MATLAB的ASK调制解调实现课程设计

    大学《通信原理》课程设计报告学 院 专 业 班 级 学 号 ...

    3年前   
    724    0

    填料塔化工原理课程设计

    摘要在化工生产中,气体吸收过程是利用气体混合物中,各组分在液体中溶解度或化学反应活性的差异,在气液两相接触是发生传质,实现气液混合物的分离。在化学工业中,经常需将气体混合物中的各个组分加以分离...

    2年前   
    495    0

    数据库原理及应用课程设计

    数据库原理及应用课程设计设计报告题 目:学校人力资源管理系统 学 号: 学生姓名: 指导教师...

    3年前   
    750    0

    文档贡献者

    文***享

    贡献于2019-06-06

    下载需要 10 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档