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


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

    实验容求
    根某文法编制调试LL(1)分析程序便意输入符号串进行分析次实验目加深预测分析LL(1)分析法理解
    列文法LL(1)分析法意输入符号串进行分析:
    (1)E>TG
    (2)G>+TG
    (3)G>ε
    (4)T>FS
    (5)S>*FS
    (6)S>ε
    (7)F>(E)
    (8)F>i
    程序输入#结束符号串(包括+*()i#):i+i*i#输出程:
    步骤
    分析栈
    剩余输入串
    产生式
    1
    E
    i+i*i#
    E>TG






    二 实验程结果
    代码:
    #include
    #include edgeh
    using namespace std

    edgeedge()
    {
    cin>>left>>right
    rlenrightlength()
    if(NODEfind(left)>NODElength())
    NODE+left
    }

    string edgegetlf()
    {
    return left
    }

    string edgegetrg()
    {
    return right
    }

    string edgegetfirst()
    {
    return first
    }

    string edgegetfollow()
    {
    return follow
    }

    string edgegetselect()
    {
    return select
    }

    string edgegetro()
    {
    string str
    str+right[0]
    return str
    }

    int edgegetrlen()
    {
    return rightlength()
    }

    void edgenewfirst(string w)
    {
    int i
    for(i0i if(firstfind(w[i])>firstlength())
    first+w[i]
    }

    void edgenewfollow(string w)
    {
    int i
    for(i0i if(followfind(w[i])>followlength()&&w[i]'@')
    follow+w[i]
    }

    void edgenewselect(string w)
    {
    int i
    for(i0i if(selectfind(w[i])>selectlength()&&w[i]'@')
    select+w[i]
    }

    void edgedelfirst()
    {
    int ifirstfind('@')
    firsterase(i1)
    }
    int SUM
    string NODEENODE

    计算first
    void first(edge niedge *nint x)
    {
    int ij
    for(j0j {
    if(nigetlf()n[j]getlf())
    {
    if(NODEfind(n[j]getro()) {
    for(i0i if(n[i]getlf()n[j]getro())
    first(n[i]nx)
    }
    else
    n[x]newfirst(n[j]getro())
    }
    }
    }

    计算follow
    void follow(edge niedge *nint x)
    {
    int ijks
    string str
    for(i0i {
    sNODEfind(nigetrg()[i])
    if(s1) 非终结符
    if(i for(j0j if(n[j]getlf()find(nigetrg()[i])0)
    {
    if(NODEfind(nigetrg()[i+1]) {
    for(k0k if(n[k]getlf()find(nigetrg()[i+1])0)
    {
    n[j]newfollow(n[k]getfirst())
    if(n[k]getfirst()find(@) n[j]newfollow(nigetfollow())
    }
    }
    else
    {
    strerase()
    str+nigetrg()[i+1]
    n[j]newfollow(str)
    }
    }
    }
    }

    计算select
    void select(edge &niedge *n)
    {
    int ij
    if(ENODEfind(nigetro()) {
    ninewselect(nigetro())
    if(nigetro()@)
    ninewselect(nigetfollow())
    }
    else
    for(i0i {
    for(j0j if(nigetrg()[i]n[j]getlf()[0])
    {
    ninewselect(n[j]getfirst())
    if(n[j]getfirst()find('@')>n[j]getfirst()length())
    return
    }
    }
    }

    输出集合
    void out(string p)
    {
    int i
    if(plength()0)
    return
    cout<<{
    for(i0i {
    cout< }
    cout<}

    连续输出符号
    void outfu(int astring c)
    {
    int i
    for(i0i cout<}


    输出预测分析表
    void outgraph(edge *nstring (*yc)[50])
    {
    int ijk
    bool flag
    for(i0i {
    if(ENODE[i]'@')
    {
    outfu(10 )
    cout< }
    }
    outfu(10 )
    cout<<#< int x
    for(i0i {
    outfu(4 )
    cout< outfu(5 )
    for(k0k {
    flag1
    for(j0j {
    if(NODE[i]n[j]getlf()[0])
    {
    xn[j]getselect()find(ENODE[k])
    if(x1)
    {
    cout<<>< yc[i][k]n[j]getrg()
    outfu(9n[j]getrlen() )
    flag0
    }
    xn[j]getselect()find('#')
    if(kENODElength()1&&x1)
    {
    cout<<>< yc[i][j]n[j]getrg()
    }
    }
    }
    if(flag&&ENODE[k]'@')
    outfu(11 )
    }
    cout< }
    }

    分析符号串
    int pipei(string &chuanstring &fenxistring (*yc)[50]int &b)
    {
    char cha
    int xijk
    b++
    cout< if(b>9)
    outfu(8 )
    else
    outfu(9 )
    cout< outfu(26chuanlength()fenxilength() )
    cout< outfu(10 )
    achuan[0]
    chfenxi[fenxilength()1]
    xENODEfind(ch)
    if(x1)
    {
    if(cha)
    {
    fenxierase(fenxilength()11)
    chuanerase(01)
    cout<<'< if(pipei(chuanfenxiycb))
    return 1
    else
    return 0
    }
    else
    return 0
    }
    else
    {
    if(ch'#')
    {
    if(cha)
    {
    cout<<分析成功< return 1
    }
    else
    return 0
    }
    else
    if(ch'@')
    {
    fenxierase(fenxilength()11)
    if(pipei(chuanfenxiycb))
    return 1
    else
    return 0
    }
    else
    {
    iNODEfind(ch)
    if(a'#')
    {
    xENODEfind('@')
    if(x1)
    jENODElength()1
    else
    jENODElength()
    }
    else
    jENODEfind(a)
    if(yc[i][j]length())
    {
    cout<< fenxierase(fenxilength()11)
    for(kyc[i][j]length()1k>1k)
    if(yc[i][j][k]'@')
    fenxi+yc[i][j][k]
    if(pipei(chuanfenxiycb))
    return 1
    else
    return 0
    }
    else
    return 0
    }
    }
    }


    void main()
    {
    edge *n
    string str(*yc)[50]
    int ijk
    bool flag0
    cout<<请输入文关文法总规数:< cin>>SUM
    cout<<请输入具体规(格式:左部 右部@空):< nnew edge[SUM]
    for(i0i for(j0j {
    strn[i]getrg()
    if(NODEfind(str[j])>NODElength()&&ENODEfind(str[j])>ENODElength())
    ENODE+str[j]
    }
    计算first集合
    for(i0i {
    first(n[i]ni)
    }
    outfu(10~*~)cout< for(i0i if(n[i]getfirst()find(@) {
    if(NODEfind(n[i]getro()) {
    for(k1k {
    if(NODEfind(n[i]getrg()[k]) {
    for(j0j {
    if(n[i]getrg()[k]n[j]getlf()[0])
    {
    n[i]newfirst(n[j]getfirst())
    break
    }
    }
    if(n[j]getfirst()find(@)>n[j]getfirst()length())
    {
    n[i]delfirst()
    break
    }
    }
    }
    }
    }
    计算follow集合
    for(k0k {
    for(i0i {
    if(n[i]getlf()n[0]getlf())
    n[i]newfollow(#)
    follow(n[i]ni)
    }
    for(i0i {
    for(j0j if(n[j]getrg()find(n[i]getlf())n[j]getrlen()1)
    n[i]newfollow(n[j]getfollow())
    }
    }
    计算select集合
    for(i0i {
    select(n[i]n)
    }
    for(i0i {
    strerase()
    for(j0j if(n[j]getlf()[0]NODE[i])
    {
    if(strlength())
    strn[j]getselect()
    else
    {
    for(k0k if(strfind(n[j]getselect()[k]) {
    flag1
    break
    }
    }
    }
    }
    输出
    cout< outfu(SUM )
    cout< outfu(SUM )
    cout< outfu(5+SUM*)
    cout< for(i0i {
    for(j0j if(NODE[i]n[j]getlf()[0])
    {
    outfu(3 )
    cout< outfu(SUM+4 )
    out(n[j]getfirst())
    outfu(SUM+42*n[j]getfirst()length() )
    out(n[j]getfollow())
    cout< break
    }
    }
    outfu(5+SUM*)
    cout< if(flag)
    {
    cout<<该文法LL(1)文法< return
    }
    else
    {
    cout<<该文法LL(1)文法<
    }
    输出预测分析表
    cout< ycnew string[NODElength()][50]
    outgraph(nyc)
    string chuanfenxifchuan
    cout< cin>>chuan
    fchuanchuan
    fenxi#
    fenxi+NODE[0]
    i0
    cout< cout<<步骤
    outfu(7 )
    cout<<分析栈
    outfu(10 )
    cout<<剩余输入串
    outfu(8 )
    cout<<推导产生式匹配
    if(pipei(chuanfenxiyci))
    cout< else
    cout<}

    截屏:

    三 实验中问题心
    次实验更加熟悉LL(1)工作流程LL(1)分析表构造方法前课堂搞懂算法流程通实验进步解

    文档香网(httpswwwxiangdangnet)户传

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

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

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

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

    下载文档

    相关文档

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

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

    2年前   
    298    0

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

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

    2年前   
    1044    0

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

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

    3年前   
    627    0

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

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

    3年前   
    597    0

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

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

    2年前   
    940    0

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

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

    3年前   
    767    0

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

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

    1年前   
    410    0

    编译原理实验指导书

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

    3年前   
    580    0

    编译原理课后习题答案

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

    1年前   
    597    0

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

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

    2年前   
    724    0

    计算机组成原理实验报告 (1)

    郑州航空工业管理学院计算机科学与应用系实验报告课 程 名: 计算机组成原理 学 号: 姓 名: ...

    1年前   
    386    0

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

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

    5年前   
    1876    0

    编译原理期末试题附答案

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

    1年前   
    407    0

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

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

    1年前   
    316    0

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

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

    11年前   
    631    0

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

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

    2年前   
    503    0

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

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

    2年前   
    309    0

    广东海洋大学编译原理期末复习资料

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

    5年前   
    1759    0

    《数据库原理及应用》实验报告

     数据库原理及应用 实验报告 实验课程: 学 号: 学生姓名: ...

    5年前   
    4470    0

    计算机组成原理实验报告 (2)

    计 算 机 组 成 原 理 实 验 报 告Computer Organization Lab Reports__________________________________________...

    1年前   
    474    0

    文档贡献者

    文***享

    贡献于2022-12-13

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

    该用户的其他文档