语法制导四元式(算术表达式)生成器


    

    辽宁师范学计算机信息技术学院

    综合性实验报告









    课程名称: 编译技术
    实验题目:语法制导四元式(算术表达式)生成器
    学生姓名:
    专业: 计算机科学技术
    学号:
    实验日期: 2015






    实验目
    1 理解语法分析器原理语法制导翻译程实质
    2 学会语法分析识语法成分变换中间代码形式中逆波兰记号形式语义分析方法编程实现算术表达式进行语法分析程基础进行语义分析

    实验容
    1 输入算术表达式源语言形式输出语法分析程(输入流变化程)四元式序列
    2 定算术表达式首先通词法分析程识出类语法成分输出文件中然采预测分析方法进行分析语法检查出具体分析程包括分析步骤分析栈剩余符号产生式基础文法中插入语义动作语法分析程中遇语义动作做相应翻译工作终结果(算术表达式逆波兰式)输出源文件中

    实验程

    判断文法否LL(1)文法
    (1)E>E+E
    (2)E>E*E
    (3)E>i|E

    文法含左递消左递确定算法优先次序文法变:
    (1)E>TG
    (2)G>+TG|^
    (3)T>FS
    (4)S>*FS|^
    (5)F>i|E

    1推出^非终结符表:
    E
    G
    T
    S
    F






    2非终结符FIRST集合:
    FIRST(E){(i}
    FIRST(G){+ ∅}
    FIRST(T){(i}
    FIRST(S){* ∅}
    FIRST(F){(i}

    3非终结符FOLLOW集合:
    FOLLOW(E){)#}
    FOLLOW(G){)#}
    FOLLOW(T){+)#}
    FOLLOW(S){+)#}
    FOLLOW(F){*+)#}


    4产生式SELECT集合:
    SELECT(E>TG){(i}
    SELECT(G>+TG){+}
    SELECT(G>^){)#}
    SELECT(T>FS){(i}
    SELECT(S>*FS){*}
    SELECT(S>^){+)#}
    SELECT(F>E){(}
    SELECT(F>i){i}

    5:
    SELECT(G>+TG)∩SELECT(G>∅) {+}∩{)#} ∅
    SELECT(S>*FS)∩SELECT(S>∅) {*}∩{+)#} ∅
    SELECT(F>E)∩SELECT(F>i) {i}∩{(} ∅
    文法LL(1)文法

    二构造预测分析表

    i
    +
    *
    (
    )

    #
    E
    TG


    TG

    E

    G

    +TG


    ^

    ^
    T
    FS


    FS



    S


    *FS

    ^

    ^
    F
    i


    (E)





    三程序开始
    1预测试算术表达式:
    4+(467e10)*(789)+5#
    分析:i+(i)*(i)+i# 写入文件中
    边分析边编织逆波兰式数组stack1存放
    1 存入9文法产生式:
    E>TG
    E2>E
    G>+TG
    G2>^
    T>FS
    S>*FS
    S2>^
    F>i
    F2>(E)
    2 存入预测分析表格(二)
    3 利 终结符数组:vt非终结符数组:vn预测分析表table分析栈stack等等分析串str2进行分析分许程存入optxt中


    具体代码:
    #include
    #include
    #include
    #include
    char str2[20]{0} 存放识字符串i+(i)*(i)+i#
    FILE *op 存储算术表达式文件a+(467e10)*(789)+b#
    FILE *fp 存储分析程文件
    char vt[7]{'i''+''*''('')''''#'} 终结符
    char vn[5]{'E''G''T''S''F'} 非终结符

    typedef struct type{ 产生式类型定义
    char left 非终结符
    char right[5] 产生式右边字符
    }type
    type EE1GG1TSS1FF1 8产生式
    type table[7][7] 预分析表

    char stack[30]{0} 分析栈
    char stack1[30]{0} 存储逆波兰式
    int s1st0 s>栈顶st>前需分析字符

    void analy1(char str1[]){ 分析>i+(i)*(i)+i#
    int i0j0p0q0
    char s[30]{0} 辅助堆栈
    while(str1[i]'#'){
    switch(str1[i]){
    case 'a'str2[j++]'i'stack1[q++]'a' break
    case 'b'str2[j++]'i'
    stack1[q++]s[p2]
    stack1[q++]s[p]s[p]'\0's[p]'\0'
    stack1[q++]'b'
    break
    case '+'s[p++]'+' str2[j++]'+'break
    case '*'stack1[q++]s[p]
    s[p]'\0'
    str2[j++]'*'
    s[p++]'*'
    break
    case '('str2[j++]'('break
    case ')'stack1[q++]s[p]s[p]'\0'
    stack1[q++]'b'
    str2[j++]')'break
    case ''s[p++]'@'
    if(str2[j1]'i')break
    else str2[j++]''
    break
    case ''stack1[q++]''
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '0'stack1[q++]'0'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '1'stack1[q++]'1'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '2'stack1[q++]'2'
    if(str2[j1]'i')break
    else str2[j++]'i'

    break
    case '3' stack1[q++]'3'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '4' stack1[q++]'4'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '5' stack1[q++]'5'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '6' stack1[q++]'6'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '7'stack1[q++]'7'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '8' stack1[q++]'8'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case '9' stack1[q++]'9'
    if(str2[j1]'i')break
    else str2[j++]'i'
    break
    case 'e'stack1[q++]s[p]s[p]'\0'
    if(str2[j1]'i'){
    s[p++]'e'
    break
    }
    else str2[j++]'i'
    break
    }
    i++
    }
    stack1[q++]s[p]s[p]'\0'
    str2[j]'#'
    }
    void store(){ 8产生式存入
    printf(产生式:\n)
    Eleft'E'
    strcpy(ErightTG)
    printf(c>s\nEleftEright)

    E1left'E'
    strcpy(E1rightE)
    printf(c>s\nE1leftE1right)

    Gleft'G'
    strcpy(Gright+TG)
    printf(c>s\nGleftGright)

    G1left'G'
    strcpy(G1right^)
    printf(c>s\nG1leftG1right)

    Tleft'T'
    strcpy(TrightFS)
    printf(c>s\nTleftTright)

    Sleft'S'
    strcpy(Sright*FS)
    printf(c>s\nSleftSright)

    S1left'S'
    strcpy(S1right^)
    printf(c>s\nS1leftS1right)

    Fleft'F'
    strcpy(Frighti)
    printf(c>s\nFleftFright)

    F1left'F'
    strcpy(F1right(E))
    printf(c>s\n\nF1leftF1right)
    }

    int length(char a[]){ 求数组长度
    int il0
    for(i0i<5i++)
    if(a[i]'\0') l++
    return l
    }
    void tables(){ 建立分析表
    int ij
    for(i0i<4i++) 初始化分析表
    for(j0j<6j++)
    table[i][j]left'N' 表left置N’

    table[0][5]E1 table[0][0]table[0][3]E 存入文法
    table[1][1]G table[1][4]table[1][6]G1
    table[2][0]T table[2][3]T
    table[3][2]S table[3][1]table[3][4]table[3][6]S1
    table[4][0]F table[4][3]F1

    printf(表达式文法预测分析表:\n)
    printf( \t)
    for(i0i<7i++) printf(c\tvt[i])
    printf(\n)

    for(i0i<5i++){
    printf(c\tvn[i])
    for(j0j<7j++)
    printf(s\ttable[i][j]right)
    printf(\n)
    }
    printf(\n)
    }
    void write(char str[]){ 字符串写入文件fp
    fputs(strfp)
    }
    void fun(int hint l){ 推导产生式倒序存入分析栈中
    int ilength(table[h][l]right)1
    s
    for(i i>1 i )
    stack[++s]table[h][l]right[i] 产生式逆序入栈
    if(stack[s]'^')
    stack[s]'\0'

    fputc(table[h][l]leftfp)
    write(>)
    write(table[h][l]right)
    write(\n)
    }


    void print(int n){ 写入文件
    fprintf(fpd\t\tn++) 步骤
    fprintf(fps\t\tstack) 分析栈
    fprintf(fps\t\tstr2) 剩余输入串
    }

    void analy2(){
    int ijn0finish0hl
    char Xa
    store() 产生式
    tables() 预测分析表格
    write(********************分析********************\n)
    write(步骤\t\t分析栈\t\t剩余字符\t\t产生式\n)
    stack[++s]'#' #入栈
    stack[++s]'E' E入栈
    astr2[st] 前剩余串左字符

    while(s>1){
    Xstack[s] 栈顶字符
    print(++n)
    for(i0i<5i++){
    if(Xvn[i]){ 栈顶非终结符时E G T S F
    hi 行号
    for(j0j<7j++){
    if(avt[j]){
    lj 列号
    break
    }
    }
    if(table[h][j]left'N'){ 空时
    fun(hl)
    }
    }
    }
    for(i0i<7i++){ 栈顶终结符时i + * ( ) #
    if(Xvt[i]){
    stack[s]'\0'
    str2[st++]' '
    astr2[st] 前剩余串左字符
    fputc(Xfp)
    if(X'#') write(接受\n)
    else write(匹配\n)
    }
    }
    }
    }

    void main(){
    char str1[300]{0} 预分析算术表达式a+(467e10)*(789)+b#
    char h[]\n
    fpfopen(Hfptxtr)
    fgets(str1300fp) fgets读取行 fgetc读取字符 fread想长度
    fclose(fp)

    analy1(str1)
    fpfopen(Hfptxta) 会覆盖原数
    fwrite(hsizeof(h)1fp) 换行
    fwrite(stack1sizeof(stack1)1fp) 写入逆波兰式
    fclose(fp)

    printf(分析符号串:s\n\nstr2)
    opfopen(Hoptxtw)
    fputs(str2fp) 写入i+(i)*(i)+i#
    write(\n)
    analy2()

    fclose(op)
    }
    四运行结果截屏:
    源文件:


    屏幕输出:

    分析程:


    运行源文件:

    实验结果分析

    文档香网(httpswwwxiangdangnet)户传

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

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

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

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

    下载文档

    相关文档

    《带括号算术表达式的计算》实验报告

    四川大学数据结构与算法分析实验报告实验名称 :带括号的算术表达式求值指导老师 :_______________________学 院 :_______软件学院_______专 业 ...

    2年前   
    382    0

    初一数学 从算术到代数

    专题03 从算术到代数阅读与思考算术与代数是数学中两门不同的分科,它们之间联系紧密,代数是在算术中“数”和“运算”的基础上发展起来的.用字母表示数是代数的一个重要特征,也是代数与算术的最显...

    4年前   
    590    0

    设计专篇编制导则

    危险化学品建设项目安全设施设计专篇编制导则 ( 2013-3-8) 1适用范围 本导则适用于中华人民共和国境内新建、改建、扩建危险化学品生产、储存的建设项目以及伴有危险化学品产生的化工建...

    5年前   
    914    0

    如何编制导学案

    捷克著名的教育家夸美纽斯说过这样一句话:“找出一种教育方法,使教师因此可以少教,但是学生多学。”课堂教学中采取什么样的教学策略,才能够实现教师少教,学生多学的教育目的?就是编写高质、实用的导学案...

    4年前   
    763    0

    连锁便利物流的应变配送管理模式与管控机制导师指导

    随着经济的不断开展,连锁便利店作为一种新的零售渠道逐步在零售业中成为一个重要的角色,据安信证券研究中心的报告显示:从2003 年到2021 年,中国便利店店铺数和收入复合年均增长率分别达20%和24%。

    2年前   
    597    0

    初一数学 从算术到代数_答案

    专题03 从算术到代数例1 例2 A例3 原式= = 故其整数部分为2008例4 设图③中含有个正方形. (1) 由,得 (2) 由得,因均是正整数, 所...

    4年前   
    738    0

    浙教版(2020)信息技术八上 1.3 算术运算符和表达式 一课一练(含答案)

    1.3算术运算符和表达式一课一练一、单选题1.在Small Basic的图形窗口中画椭圆是使用DrawEllipse操作,关于DrawEllipse操作的使用格式,它的使用格式如下:Graph...

    8个月前   
    231    0

    英语语法入门

    第一讲 语序和五种基本句式He learns English every day.他每天学习英语。(中英语序不同)

    4年前   
    1352    0

    英语语法

    一、指出下面句子分别属于哪个句型。① The police arrived quickly.② In the modern city, there are some problems, such...

    2年前   
    735    0

    定语从句语法讲解

    在复合句中,修饰某一名词或代词的从句叫定语从句。被修饰的名词或代词叫先行词,定语从句一般放在先行词的后面。

    3年前   
    603    0

    日语语法总结

    日语语法小结一. 句型 句型 时态 敬    体 简    体 判断句现在时 肯定 です だ 否定 ではありません ではない、じゃない 过去时肯定 でした だった 否定 ではありませんでした ...

    2年前   
    653    0

    英语语法2

    句子的成份是指组成句子的各个部分,即:__________,___________,_____________,__________,________________,_____________...

    2年前   
    484    0

    英语语法复习

    名词(n.)是人和事物的名称,如pen(钢笔),English(英语),life(生活)。

    5年前   
    1195    0

    小学算术运算测试程序JAVA课程设计报告

    面向对象程序设计(JAVA)课程设计说明书学院名称: 计算机与信息工程学院 班级名称: 20XX级计算机科学与技术 题 目: ...

    3年前   
    699    0

    青年教师导师制导师工作总结

    为了贯彻我校青年教师导师制的落实,促进我系青年教师尽快成长,使其在短时间内,牢固树立专业思想,提高教学水平和科研能力,在2017-2018学年,本人在完成教学工作的同时,对我院青年教师XX同志进行指导培养。

    4年前   
    1580    0

    激光制导武器发展现状

    激光制导武器以激光脉冲为制导信源来探测和追踪目标,分为寻的制导和驾束制导,目前应用最为广泛的是激光寻的制导。激光寻的制导根据指示光源来源不同,分为激光半主动寻的制导和主动寻的制导[8]。激光半主...

    5年前   
    1811    0

    现代汉语“左右不过”表达式探析

    尽管“左右不过X”结构在现代汉语中非常常见,但我们在査闻相关研究资料时发现,学界对它的专口研究还相对较少。

    3年前   
    693    0

    表92 销售日报表达式

    表92 销售日报表达式 年 月 日 项次 来访 客户 访 问 时 间 备注 到 达 离 开 交款 签约 询...

    10年前   
    9367    0

    新编日语2语法汇总

    新编日语·(2)语法知识汇总第1~2课1、用言中顿:动词连用形+、;形容词词尾变为く+、形容动词的中顿法与连接形式相同。动词谓语句在连续使用几个中顿法后,最后一个中顿法往往改成て的连接式,起承...

    4年前   
    1163    0

    PHP语法练习题

    1、PHP语言标记是(B )。 A、<……> B、<?php……?> C、?............? D、/*………*/2、PHP代码要想以“<?”为开头,以“?>”为结束...

    1年前   
    527    0

    文档贡献者

    文***享

    贡献于2023-08-28

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

    该用户的其他文档