语义分析与中间代码生成天津理工大学编译原理实验3


    实验报告
    学院(系)名称:计算机通信工程学院
    姓名

    学号

    专业

    班级

    实验项目
    实验三:语义分析中间代码生成
    课程名称
    编译原理
    课程代码

    实验时间

    实验点
    计算机软件实验室
    计算机软件实验室
    批改意见
    成绩





    教师签字:
    实验容:
    选择LL1分析法算符优先分析法LR分析法实现表达式文法语法制导翻译程文法G[E]示:
    E→E+T | ET | T
    T→T*F | TF | F
    F→P^F | P
    P→(E) | i
    求构造出符合语义分析求属性文法描述完成实验二(语法分析)基础进行语义分析程序设计终输出测试例等价四元式中间代码序列
    实验目:
    1.掌握语法制导翻译基功
    2.巩固语义分析基功原理认识
    3.够基语法制导翻译知识进行语义分析
    4.掌握类高级语言中基语句应语义动作
    5.理解处理语义分析中异常错误
    实验求:
    1.实验二基础实现语法制导翻译功输出翻译四元式序列
    2.求详细描述选分析方法进行制导翻译设计程
    3.完成设计分析器功测试出测试数实验结果
    4.增加程序读性请程序中进行适注释说明
    5.整理机步骤总结验体会
    6.认真完成时提交实验报告

    实验程记录(源程序测试例测试结果心体会等)
    #include
    #include
    #define size 1024
    using namespace std

    int step0
    typedef struct variable_T
    {
    char operate操作符
    string var1变量 1
    string var2变量 2
    int num第变量
    }variable_T
    variable_T t[size]记录四元式变量变量
    int tsize1表示第tsize+1变量

    typedef struct char_stack
    {
    char content前字符
    string endchar符号代表中间变量 i t1 t2 等等
    int num该字符相关中间变量序号
    }char_stack

    string table[19][13]{ + * ^ ) # ( i E T F P
    * 0 * errerrerrerrerrerrerr s5 s6 1 2 3 4
    * 1 * s7 s8errerrerrerraccerrerrerrerrerrerr
    * 2 * r3 r3 s9s10err r3 r3errerrerrerrerrerr
    * 3 * r6 r6 r6 r6err r6 r6errerrerrerrerrerr
    * 4 * r8 r8 r8 r8s11 r8 r8errerrerrerrerrerr
    * 5 * errerrerrerrerrerrerr s5 s6 c 2 3 4
    * 6 * r10r10r10r10r10r10r10errerrerrerrerrerr
    * 7 * errerrerrerrerrerrerr s5 s6err d 3 4
    * 8 * errerrerrerrerrerrerr s5 s6err e 3 4
    * 9 * errerrerrerrerrerrerr s5 s6errerr f 4
    * 10* errerrerrerrerrerrerr s5 s6errerr g 4
    * 11* errerrerrerrerrerrerr s5 s6errerr h 4
    * 12* s7 s8errerrerrs18errerrerrerrerrerrerr
    * 13* r1 r1 s9s10err r1 r1errerrerrerrerrerr
    * 14* r2 r2 s9s10err r2 r2errerrerrerrerrerr
    * 15* r4 r4 r4 r4err r4 r4errerrerrerrerrerr
    * 16* r5 r5 r5 r5err r5 r5errerrerrerrerrerr
    * 17* r7 r7 r7 r7err r7 r7errerrerrerrerrerr
    * 18* r9 r9 r9 r9 r9 r9 r9errerrerrerrerrerr}

    int getLength(char str[size])
    {
    int i0
    while(str[i]'\0')
    i++
    return i
    }

    int getLengthc(char_stack str[size])
    {
    int i0
    while(str[i]content'\0')
    i++
    return i
    }

    int getstringLength(string str)
    {
    int i0
    while(str[i]'\0')
    i++
    return i
    }

    char gettop(char stack[size]int top)
    {
    if(stack[top]'\0')
    return stack[top]
    else
    return '#'
    }

    void popstack(char *stackint *pointerint times)
    {
    int p
    for(int i1i {
    p*pointer
    stack[p]'\0'
    (*pointer)
    }
    }

    void popstackc(char_stack *stackint *pointerint times)
    {
    int p
    for(int i1i {
    p*pointer
    stack[p]content'\0'
    (*pointer)
    }
    }

    void pushstack(char_stack *stackint *pointerchar *stack_stateint *pointer_statechar strchar sxint x)
    {
    int i0
    if(x0)
    cout<<\t\t\t状态 < else if(x1)
    cout<< 状态 < if(str'#')
    {
    cout< (*pointer)++
    stack[(*pointer)]contentstr
    }
    (*pointer_state)++
    stack_state[(*pointer_state)]sx
    }

    int getcol(char top)
    {
    switch(top)
    {
    case '+'
    return 0
    case ''
    return 1
    case '*'
    return 2
    case ''
    return 3
    case '^'
    return 4
    case ')'
    return 5
    case '#'
    return 6
    case '('
    return 7
    case 'i'
    return 8
    case 'E'
    return 9
    case 'T'
    return 10
    case 'F'
    return 11
    case 'P'
    return 12
    default
    cout< return 1
    }
    }

    int getraw(char raw)
    {
    switch(raw)
    {
    case '0'
    return 0
    case '1'
    return 1
    case '2'
    return 2
    case '3'
    return 3
    case '4'
    return 4
    case '5'
    return 5
    case '6'
    return 6
    case '7'
    return 7
    case '8'
    return 8
    case '9'
    return 9
    case 'a'
    return 10
    case 'b'
    return 11
    case 'c'
    return 12
    case 'd'
    return 13
    case 'e'
    return 14
    case 'f'
    return 15
    case 'g'
    return 16
    case 'h'
    return 17
    case 'i'
    return 18
    default
    cout< return 1
    }
    }

    char getraw_content(string str)
    {
    if(str1)
    return '1'
    else if(str2)
    return '2'
    else if(str3)
    return '3'
    else if(str4)
    return '4'
    else if(strc)
    return 'c'
    else if(strd)
    return 'd'
    else if(stre)
    return 'e'
    else if(strf)
    return 'f'
    else if(strg)
    return 'g'
    else if(strh)
    return 'h'
    else if(stri)
    return 'i'
    }

    string get_tx(int num)
    {
    switch(num)
    {
    case 1
    return t1
    case 2
    return t2
    case 3
    return t3
    case 4
    return t4
    case 5
    return t5
    case 6
    return t6
    case 7
    return t7
    case 8
    return t8
    case 9
    return t9
    case 10
    return t10
    case 11
    return t11
    case 12
    return t12
    case 13
    return t13
    case 14
    return t14
    case 15
    return t15
    case 16
    return t16
    程序暂时等时间编写合适数字转换字符串函数时更改函数
    }
    }

    void show(char str[size]int index)
    {
    int lengthgetLength(str)
    if(index1)
    cout<<\t
    for(int iindex+1i cout<}

    void showc(char_stack str[size]int index)
    {
    int lengthgetLengthc(str)
    if(index1)
    cout<<\t
    for(int iindex+1i cout<}

    void switch_method(char_stack *stackint *pointerchar *state_stackint *pointer_statestring productionchar *strint *index)
    {
    step++
    cout<<\n< show(state_stack1)显示状态栈
    cout<<\t
    showc(stack1)显示符号站
    cout<<\t< show(str(*index))显示输入串
    char cstr[(*index)]
    if(productionerr)
    {
    cout< return
    }
    else if(productions5)
    {
    char sx'5'
    (*index)++
    pushstack(stackpointerstate_stackpointer_statecsx0)
    }
    else if(productions6)
    {
    char sx'6'
    (*index)++
    pushstack(stackpointerstate_stackpointer_statecsx0)
    }
    else if(productions7)
    {
    char sx'7'
    (*index)++
    pushstack(stackpointerstate_stackpointer_statecsx0)
    }
    else if(productions8)
    {
    char sx'8'
    (*index)++
    pushstack(stackpointerstate_stackpointer_statecsx0)
    }
    else if(productions9)
    {
    char sx'9'
    (*index)++
    pushstack(stackpointerstate_stackpointer_statecsx0)
    }
    else if(productions10)
    {
    char sx'a'
    (*index)++
    pushstack(stackpointerstate_stackpointer_statecsx0)
    }
    else if(productions11)
    {
    char sx'b'
    (*index)++
    pushstack(stackpointerstate_stackpointer_statecsx0)
    }
    else if(productions18)
    {
    char sx'i'
    (*index)++
    pushstack(stackpointerstate_stackpointer_statecsx0)
    }
    else if(productionr1)
    {
    int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
    string ststack[po]endchar应 F
    po2
    string sestack[po]endchar规约前记录规约字符代表变量应 T

    tsize++新增时变量
    t[tsize]numtsize+1面四表达式面规约式进行赋值
    t[tsize]operate'+'
    t[tsize]var1se
    t[tsize]var2st
    cout<<\t(<
    int p(*pointer_state)
    p3
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('E')
    char c_outgetraw_content(table[i][j])
    cout<<\tr1E>E+T规约
    popstack(state_stackpointer_state3)
    popstackc(stackpointer3)
    char c'E'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    string sget_tx(t[tsize]num)
    stack[(*pointer)]endchars保存E+T规约结果变量保存前字符终结符
    }
    else if(productionr2)
    {
    int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
    string ststack[po]endchar应 T
    po2
    string sestack[po]endchar规约前记录规约字符代表变量应 E

    tsize++新增时变量
    t[tsize]numtsize+1面四表达式面规约式进行赋值
    t[tsize]operate''
    t[tsize]var1se
    t[tsize]var2st
    cout<<\t(<
    int p(*pointer_state)
    p3
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('E')
    char c_outgetraw_content(table[i][j])
    cout<<\tr2E>ET规约
    popstack(state_stackpointer_state3)
    popstackc(stackpointer3)
    char c'E'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    string sget_tx(t[tsize]num)
    stack[(*pointer)]endchars保存ET规约结果变量保存前字符终结符
    }
    else if(productionr3)
    {
    string sstack[(*pointer)]endchar规约前记录规约字符代表变量

    int p(*pointer_state)
    p
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('E')
    char c_outgetraw_content(table[i][j])
    cout<<\t\t\tr3E>T规约
    popstack(state_stackpointer_state1)
    popstackc(stackpointer1)
    char c'E'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    stack[(*pointer)]endchars记录变量赋值规约字符
    }
    else if(productionr4)
    {
    int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
    string sfstack[po]endchar应 F
    po2
    string ststack[po]endchar规约前记录规约字符代表变量应 T

    tsize++新增时变量
    t[tsize]numtsize+1面四表达式面规约式进行赋值
    t[tsize]operate'*'
    t[tsize]var1st
    t[tsize]var2sf
    cout<<\t(<
    int p(*pointer_state)
    p3
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('T')
    char c_outgetraw_content(table[i][j])
    cout<<\tr4T>T*F规约
    popstack(state_stackpointer_state3)
    popstackc(stackpointer3)
    char c'T'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    string sget_tx(t[tsize]num)
    stack[(*pointer)]endchars保存T*F规约结果变量保存前字符终结符
    }
    else if(productionr5)
    {
    int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
    string sfstack[po]endchar应 F
    po2
    string ststack[po]endchar规约前记录规约字符代表变量应 T

    tsize++新增时变量
    t[tsize]numtsize+1面四表达式面规约式进行赋值
    t[tsize]operate''
    t[tsize]var1st
    t[tsize]var2sf
    cout<<\t(<
    int p(*pointer_state)
    p3
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('T')
    char c_outgetraw_content(table[i][j])
    cout<<\tr5T>TF规约
    popstack(state_stackpointer_state3)
    popstackc(stackpointer3)
    char c'T'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    string sget_tx(t[tsize]num)
    stack[(*pointer)]endchars保存TF规约结果变量保存前字符终结符
    }
    else if(productionr6)
    {
    string sstack[(*pointer)]endchar规约前记录规约字符代表变量

    int p(*pointer_state)
    p
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('T')
    char c_outgetraw_content(table[i][j])
    cout<<\t\t\tr6T>F规约
    popstack(state_stackpointer_state1)
    popstackc(stackpointer1)
    char c'T'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    stack[(*pointer)]endchars记录变量赋值规约字符
    }
    else if(productionr7)
    {
    int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
    string sfstack[po]endchar应 F
    po2
    string spstack[po]endchar规约前记录规约字符代表变量应 P

    tsize++新增时变量
    t[tsize]numtsize+1面四表达式面规约式进行赋值
    t[tsize]operate'^'
    t[tsize]var1sp
    t[tsize]var2sf
    cout<<\t(<
    int p(*pointer_state)
    p3
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('F')
    char c_outgetraw_content(table[i][j])
    cout<<\tr7F>P^F规约
    popstack(state_stackpointer_state3)
    popstackc(stackpointer3)
    char c'F'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    string sget_tx(t[tsize]num)
    stack[(*pointer)]endchars保存P^F规约结果变量保存前字符终结符
    }
    else if(productionr8)
    {
    int p(*pointer_state)
    p
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('F')
    char c_outgetraw_content(table[i][j])
    cout<<\t\t\tr8F>P规约

    string sstack[(*pointer)]endchar规约前记录规约字符代表变量

    popstack(state_stackpointer_state1)
    popstackc(stackpointer1)
    char c'F'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    stack[(*pointer)]endchars记录变量赋值规约字符
    }
    else if(productionr9)
    {
    int p(*pointer_state)
    p3
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('P')
    char c_outgetraw_content(table[i][j])
    cout<<\t\t\tr9P>(E)规约

    int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
    po
    string sstack[po]endchar规约前记录规约字符代表变量

    popstack(state_stackpointer_state3)
    popstackc(stackpointer3)
    char c'P'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)

    stack[(*pointer)]endchars记录变量赋值规约字符
    }
    else if(productionr10)
    {
    int p(*pointer_state)
    p
    char secondstate_stack[p]
    int igetraw(second)
    int jgetcol('P')
    char c_outgetraw_content(table[i][j])
    cout<<\t\t\tr10P>i规约
    popstack(state_stackpointer_state1)
    popstackc(stackpointer1)
    char c'P'str[(*index)]
    pushstack(stackpointerstate_stackpointer_statecc_out1)
    stack[(*pointer)]endchari
    }
    else if(productionacc)
    {
    cout<<\t\t\tacc 分析成功
    (*index)++
    }
    }
    int main()
    {
    char str[size]接受字符串数组
    char_stack stack[size]进行栈
    int pointer1指栈顶指针
    int length0记录字符串长度
    int index0记录输入字符串
    char top
    char state_stack[size]状态栈
    int pointer_state1状态栈指针
    int iji表示行j表示列
    string production
    bool matchfalse
    cout< cin>>str
    lengthgetLength(str)
    str[length]'#'
    str[length+1]'\0'
    pointer++
    stack[pointer]content'#'
    pointer_state++
    state_stack[pointer_state]'0'
    cout<<步骤\t状态栈\t符号栈\t前符号\t输入串\t四元式\t\t说明< while(str[index]'\0')
    {
    topgettop(state_stackpointer_state)获取状态栈栈顶元素
    igetraw(top)
    jgetcol(str[index])
    productiontable[i][j]
    switch_method(stack&pointerstate_stack&pointer_stateproductionstr&index)
    }
    return 0
    }

    面运行结果根文法产生面语法树语句

    文档香网(httpswwwxiangdangnet)户传

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

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

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

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

    下载文档

    相关文档

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

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

    2年前   
    942    0

    编译原理实验3-4预测分析表方法

    实验3-4 预测分析表方法班级:_ _ 学号:_ _ 姓名:_ _ 得分:_ _一、实验目的理解预测分析表方法的实现原理。二、实验内容: ...

    1年前   
    317    0

    编译原理实验指导书

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

    3年前   
    581    0

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

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

    3年前   
    628    0

    编译原理实验报告LR(1)分析法

    河南工业大学实验报告课 程 编译原理 实验名称 实验四 LR(1)分析法 一. 实验目的 1.掌握LR(1)分析法的基本原理; 2.掌握LR(1)分析表的构...

    2年前   
    1047    0

    编译原理实验报告(一)词法分析程序

     编译原理实验报告(一) ----词法分析程序【目的要求】 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的...

    3年前   
    768    0

    编译原理实验报告LL(1)分析法

    课 程 编译原理 实验名称 实验二 LL(1)分析法 实验目的 1.掌握LL(1)分析法的基本原理; 2.掌握LL(1)分析表的构造方法; 3.掌握LL(1...

    1年前   
    399    0

    编译原理实验报告3-LL(1)文法构造

    实验3 LL(1)文法构造一、实验目的熟悉LL(1)文法的分析条件,了解LL(1)文法的构造方法。 二、实验内容1、编制一个能够将一个非LL(1)文法转换为LL(1)文法;2、消除左递归;3...

    2年前   
    301    0

    实验2.正规式的定义与应用 编译原理实验报告

    实验2. 正规式的定义与应用一、 实验目的1. 熟悉正规式的构造方法;2. 熟悉从字符串中识别特定字符串的方法;3. 复习对文件的操作。二、 实验内容和要求已知一段C语言程序:#include...

    1年前   
    410    0

    编译原理-实验报告2-递归下降分析法

    计算机硬件实验室实验报告姓名学号班 级成 绩 设备名称及软件环境递归下降分析一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的...

    3年前   
    599    0

    天津理工大学计算机网络实验三

    实验报告学院(系)名称:计算机与通信工程学院姓名学号专业班级实验名称实验三:路由器配置课程名称计算机网络课程代码实验时间实验地点7#219批改意见成绩教师签字: ...

    1年前   
    266    0

    编译原理课后习题答案

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

    1年前   
    599    0

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

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

    2年前   
    724    0

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

     编译原理课程设计 ——简单编译器的设计与实现 班 级: 组长: 组员: 指导教师: 设计时间: ...

    5年前   
    1879    0

    成都理工大学工程地质分析原理题库

    成都理工大学工程地质分析原理题库一、术语解释 0.1 工程地质学 0.2工程地质条件 0.3工程地质问题 0.4非线性工程地质学 0.5 机制过程分析法 0.6工程地质勘察 1.1 岩体 1....

    3年前   
    604    0

    编译原理期末试题附答案

    《编译原理》期末试题(一)一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分)1.编译程序是对高级语言程序的解释执行。(× )2.一个有限状态自动机中,有且仅有一个唯一的终态...

    1年前   
    409    0

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

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

    2年前   
    399    0

    实验1指导实验环境的建立和程序的编译

    实验1指导:实验环境的建立和程序的编译、调试和运行一、实验环境的建立〔一〕 下载工具文件或者 :// tjut.edu :8080/xuebao/hbyy下载以下两个压缩文件:〔1...

    2年前   
    466    0

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

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

    11年前   
    632    0

    编译原理课后习题第三版答案

    第二章P36-6(1)是0~9组成的数字串(2)最左推导:最右推导:P36-7G(S)P36-8文法:最左推导:最右推导:语法树:/******************************...

    2年前   
    504    0

    文档贡献者

    文***品

    贡献于2022-10-29

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

    该用户的其他文档