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


    实验34 预测分析表方法
    班级:_ _ 学号:_ _ 姓名_ _ 分:_ _
    实验目
    理解预测分析表方法实现原理
    二实验容:
    编写通预测法分析程序求定错误处理力出错够程序继续运行直分析程结束通文法(通数表现)进行测试

    二实验容提示
    1.算法数构造:
    构造终结符数组:char Vt[10][5]{id+……}
    构造非终结符数组:char Vn[10]{ }
    构造follow集数组:char *follow[10][10]{ } (follow集预测分析表合存放)
    数构造示例(预测分析表构造方法1):
    *data1h简单算术表达式数*
    char VN[10][5]{EE'TT'F} 非终结符表
    int length_vn5 非终结符数

    char VT[15][5]{id+*()#} 终结符表
    int length_vt6 终结符数

    char Fa[15][10]{TE'+TE'FT'*FT'(E)id}
    产生式表0E>TE' 1E'>+TE' 2E'>空
    3T>FT' 4T'>*FT' 5T'>空 6F>(E) 7F>id

    int analysis_table[10][11]{02201100000
    21222200000
    31231100000
    25 425 500000
    71161100000}
    预测分析表2表示出错属终结符follow集合1表示该行终结符follow集合错误处理正数表示产生式数组Fa中编号右部五列0表示余列

    (1) 预测分析表构造方法1
    文法正规式编号:存放字符数组中0开始编号正规式编号该正规式数组中应标述Fa数组表示存储产生式
    构造产生式数组:char P[10][10]{E>TE’E’>+TE’……} (产生式存储右半部分E>TE’存储TE’ 正规式中符号换E’改M )
    构造预测分析表:int analyze_table[10][10]{ } 数组元素值存放产生式编号12表示出错
    (2)预测分析表构造方法2
    三维数组
    Char analyze_table[10][10][10]{ }

    Char *analyze_table[10][10]{ }

    2.针预测分析表构造方法1查预测分析表方法提示:
    (1) 查非终结符表非终结符序号no1
    (2) 查终结符表终结符序号no2
    (3) 根no1no2查预测分析表应正规式序号no3analyze_table[no1][no2] 果no31 表示出错
    (4) 根no3查找应正规式Fa[no3]
    (5) 正规式进行处理
    3.错误处理机制
    紧急方式错误恢复方法(抛弃某符号继续分析)
    (1)栈顶非终结符A串中前单词属FOLLOW(A)栈中弹出A(时认输入串中缺少A表示结构)继续分析 错误编号1
    (2)栈顶非终结符A串中前单词属FOLLOW(A)串指针移位置(认输入串中前单词余)继续分析错误编号2
    (3)栈顶终结符等串中前单词栈中弹出终结符(认输入串中缺少前单词)者串指针移位置(认串中前单词余)程序中选择述两种 观点中种进行处理错误编号3
    error()函数编写方式方式处理
    Error(int errornum)
    {
    If(errornum1)………………
    Else if(errornum2)……………
    Else ………………
    者choose case语句处理
    }
    4.增加错误处理预测分析程序预测分析程序算法:

    #文法开始符次压入栈中
    第输入符号读入a
    do{
    栈顶符号弹出放入x中
    if(x∈VT)
    {
    if(x==a) 输入符号读入a
    else error(3)
    }
    else
    if(M[xa]=x→y1y2…yk)
    {
    逆序次ykyk−1…y1压入栈中
    输出x→y1y2…yk
    }
    else if aÎfollow(x)error(1) else error(2)
    前述数定义中查表1表示aÎfollow(x)
    }while(x#)

    三.实验求
    定算术表达式文法编写程序
    测试数:
    1.算术表达式文法
    E→TE’
    E’ → +TE’| TE’|ε
    T→FT’
    T’ →*FT’ | FT’ |FT’|ε
    F→(E) |id|num

    定符合该文法句子id+id*id输入二元式序列(词法分析结果预测分析程序二元式中第元值):(id0)(+)(id1)(*)(id2)运行预测分析程序出分析程步分析结果
    输出形式参考图(结束符):




    2. 作业310 文法
    四 实验程
    源程序:
    #include
    #include
    #include
    #include
    using namespace std
    #define MAXSIZE 100
    typedef char DataType
    typedef struct 定义栈
    {
    DataType data[MAXSIZE]
    int top
    }SeqStack
    SeqStack *s

    int sign0
    int num1num2num3

    char VN[10][5]{EMTNF}非终结符表
    int length_vn5非终结符数

    char VT[15][5]{+*()in#}终结符表
    int length_vt10 终结符数

    char Fa[15][5]{TM+TMTMFN*FNFNFN(E)in}产生式表 1E>TM2M>+TM3M>TM4M> 5E>FN6N> 7N>*FN8F>FN9F>FN10F>(E)11F>i12f>n

    Char Pa[15][10]{E>TMM>+TMM>TMM>空T>FNN>空N>*FNF>FNF>FNF>(E)F>idF>num}


    int analysis_table[10][11]{ {11111121110}
    {23111141140}
    {22111525510}
    {66789161160}
    {22222102111210}
    }预测分析表

    SeqStack *Init_SeqSTACK()栈初始化
    {
    SeqStack *s
    snew SeqStack
    if(s)
    {
    printf(空间足\n)
    return NULL
    }
    else
    {
    s>top1
    return s
    }
    }
    void Push_SeqStack(SeqStack *schar x)入栈
    {
    if (s>topMAXSIZE1)
    printf(栈满入栈)return 0
    else
    {
    s>top++
    s>data[s>top]x
    return 1
    }

    }
    char Pop_SeqStack(SeqStack *s)出栈
    {
    if(s>top1)
    {
    printf(栈空出栈) return 0
    exit(0)
    }
    else
    {
    char xs>data[s>top]
    s>top
    return x
    }
    }
    DataType Top_SeqStack(SeqStack *s) 取栈顶元素
    {
    if(s>top1)
    return 0
    else
    return s>data [s>top ]
    }
    int BufVT(char s) 接收终结符保存VT[]数组中
    {
    int i0
    while(i<15&&s'\n')
    {
    if(VT[i][0]s)
    return 1
    else
    i++
    }
    return 0
    }
    int BufVN(char s) 接收非终结符保存VN[]数组中
    {
    int i0
    while(i<10&&s'\n')
    {
    if(VN[i][0]s)
    return 1
    else
    i++
    }
    return 0
    }
    int VTT(char s) 终结符匹配
    {
    int i0
    while((VT[i][0]s))
    i++
    return i
    }
    int VNN(char s) 非终结符匹配
    {
    int i0
    while(VN[i][0]s&&i {
    i++
    }
    if(ilength_vn)
    return 1
    return i

    }


    void Error(int errornumchar x)
    {
    if(errornum1)
    {
    printf(第种错误弹出栈顶元素\n)
    Pop_SeqStack(s)
    }
    else if(errornum2)
    printf(第二种错误跳c\nx)
    else
    {
    if(x'#')
    {
    printf(第三种错误弹出栈顶元素\n)
    Pop_SeqStack(s)
    }
    else
    {
    printf(第三种错误指针移弹出栈顶元素\n)
    Pop_SeqStack(s)
    sign++
    }
    }
    }


    void main()
    {
    char str1[20]str2[20]
    int i0
    printf(请输入分析文件名:)
    scanf(sstr1)
    FILE *fp
    if((fpfopen(str1r))NULL)
    {
    printf(没文件\n)
    exit(0)
    }
    while(feof(fp))
    {

    str2[i]fgetc(fp)
    i++

    }
    str2[i]'\0'
    fclose(fp)
    Init_SeqSTACK()
    s>top1
    Push_SeqStack(s'#')
    Push_SeqStack(s'E')
    char x
    printf(语法分析程:\n)
    printf(栈顶元素\t\t前单词记号\t\t动作\n)
    printf(\n)
    do
    {
    xTop_SeqStack(s)
    if(x'#')
    goto loop
    else
    {
    if(BufVT(str2[sign])&&BufVN(x))
    {
    printf(c\t\t\ts\t\t\tsxstr2[sign])
    printf(前字符合法\n)
    }

    else if(BufVT(str2[sign]))
    {
    if(xstr2[sign])
    {
    printf(c\t\t\tc\t\t\txstr2[sign])
    printf(匹配终结符c\nstr2[sign])
    Pop_SeqStack(s)
    sign++
    }
    else
    {
    BufVN(x)
    num1VTT(str2[sign])
    num2VNN(x)
    char arr[10]
    if(num21)
    {
    num3analysis_table[num2][num1]
    if(num31)
    {
    printf(c\t\t\tc\t\t\txstr2[sign])
    Error(1x)
    }
    if(num32)
    {
    printf(c\t\t\tc\t\t\txstr2[sign])
    Error(2str2[sign])
    sign++
    }
    else
    {
    printf(c\t\t\tc\t\t\txstr2[sign])
    printf(展开非终结符s继续\nPa[num31])
    Pop_SeqStack(s)
    int j
    for(j0j<5&&Fa[num31][j]'\0'j++)
    {
    arr[j]Fa[num31][j]
    }
    int k
    kj1
    for(k>0k)
    {
    Push_SeqStack(sarr[k])
    }
    }
    }
    else
    {
    printf(c\t\t\tc\t\t\txstr2[sign])
    Error(3str2[sign])
    Pop_SeqStack(s)
    }
    }
    }
    }
    }while(x'#')
    loop printf(c\t\t\tc\t\t\txstr2[sign])
    printf(结束\n)
    exit(0)
    }
    五. 实验结果
    存入:i*(i+i)#

    310文法



    六. 心体会
    次实验中学会预测表分析法基方法栈数结构进行复时学会预测表分析中follow集等方法创建语法分析进步掌握

    文档香网(httpswwwxiangdangnet)户传

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

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

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

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

    下载文档

    相关文档

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

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

    2年前   
    940    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年前   
    1044    0

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

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

    1年前   
    399    0

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

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

    3年前   
    767    0

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

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

    1年前   
    410    0

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

    实验报告学院(系)名称:计算机与通信工程学院姓名学号专业班级实验项目实验三:语义分析与中间代码生成课程名称编译原理课程代码实验时间实验地点计算机软件实验室计算机软件实验室批改意见成绩教师签字:...

    1年前   
    237    0

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

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

    3年前   
    599    0

    语法分析预测分析方法

    实验2-1 语法分析—预测分析方法一、实验目的使用预测分析方法编制分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。了解预测分析法和递归子程序法的区别和联系,培养动手实践的能力...

    11个月前   
    287    0

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

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

    2年前   
    300    0

    编译原理课后习题答案

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

    1年前   
    598    0

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

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

    2年前   
    724    0

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

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

    5年前   
    1876    0

    编译原理期末试题附答案

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

    1年前   
    407    0

    物流预测方法汇编

    (事实上,需求预测必须将短期需求预测或生产进度安排与长期战略性需求预测有机结合起来,才会真正地起作用。短期预测是根据存储单位(SKU)水平做出的,它与销售、客户关系,以及依据预订库存或安排运输...

    11年前   
    682    0

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

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

    2年前   
    398    0

    产品产销状况预测分析表

    产品产销状况预测分析表 日期 月预计 月预计 月预计 月预计 客户名称 产品种类 期末 初期 生产量 交货量 期末 初期 生产量 交货量 ...

    10年前   
    21677    0

    团队管理原理及方法

    团队管理原理及方法【摘要】:本文以团队管理原理为指导,指出了团队建设和管理在现代企业管理中的地位和作用,挖掘了我国国有企业目前在团队建设和管理上存在的几种不良现象,提出了在企业单位中为什么要建...

    12年前   
    896    0

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

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

    2年前   
    465    0

    文档贡献者

    z***u

    贡献于2022-11-12

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