• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 自查报告 > 正文

    递归下降语法分析设计原理与实现关键技术实验报告

    时间:2020-10-30 12:37:49 来源:勤学考试网 本文已影响 勤学考试网手机站

    递归下降语法分析设计原理和实现技术

    试验汇报

    变更说明

    日期

    版本

    变更位置

    变更说明

    作者

    20XX/4/16

    1.0

    初稿生成

    房皓

    试验目标:

    本试验目标在于在老师引导下以问题回朔和思维启发方法,使学生在不停探究过程中掌握编译程序设计和结构基础原理和实现技术,启迪学生抽象思维、激发学生学习爱好、培养学生探究精神和专业素养,从而提升学生发觉问题、分析问题和处理问题能力。

    试验内容:

    [试验项目]

    完成以下描述算术表示式LL(1)文法递归下降分析程序

    G[E]: E→TE′

    E′→ATE′|ε

    T→FT′

    T′→MFT′|ε

    F→ (E)|i

    A→+|-

    M→*|/

    [设计说明]

    终止符号i 为用户定义简单变量,即标识符定义。

    [设计要求]

    (1)输入串应是词法分析输出二元式序列,即某算术表示式“试验项目一”输出结果,输出为输入串是否为该文法定义算术表示式判定结果;

    (2)递归下降分析程序应能发觉输入串犯错;

    (3)设计两个测试用例(尽可能完备,正确和犯错),并给出测试结果。

    试验环境:

    操作系统:Windows 7

    软件: VC++6.0

    程序功效描述:

    提供了两种输入方法:键盘和文件,有文件输入时需为二元式序列;

    能够对输入字符串做出正确递归下降分析判定,并给出判定结果;

    能发觉输入串中错误,包含非法字符,输入不匹配等;

    能够处理部分可预见性错误,如文件不存在,用户输入非法等。

    五、数据结构设计:

    全局:

    局部(main()中):

    六、程序结构描述:

    设计方法:

    本程序采取从键盘输入或文件读取两种输入方法,其汉字件内容需为二元式序列,然后根据递归下降分析方法对输入字符串进行分析判定,并输出判定结果,程序经过对输入串检验能够发觉输入串中错误。程序要求单词符号及其种别码见下表:

    单词符号及其种别码表

    单词符号

    种别码

    单词符号

    种别码

    1

    *

    5

    2

    /

    6

    +

    3

    i

    7

    -

    4

    #

    8

    关键函数说明:

    advance():将下一个字符送入current;

    error():输犯错误,表示不是该文法句子;

    error1();输犯错误,输入内容不正当;

    init():初始化函数;

    justify():判定文件读取内容是否正当,包含检验非法字符和不匹配现象

    main():主函数

    函数调用关系说明:

    main()调用justify()、init()、E()、error1();

    justify()调用error1();

    A()、E()、E1()、F()、M()、F()、T()、T1()依据输入串可相互调用或递归调用,这些函数均可调用error()函数;

    A()、F()、M()调用advance()函数。

    实施框图:

    总体结构图:

    2)递归下降分析构框图:

    E():

    E1():

    T():

    T()1:

    M():

    A():

    F():

    试验过程结果截图:

    测试用例一:i+i*i/i#

    键盘:

    文件:

    测试用例二:i+i*i/#

    键盘:

    文件:

    试验总结:

    试验心得:

    经过此次试验我锻炼了自己上机操作能力及编程能力,并对理论知识有了深入了解。老师提供相对应于非终止符号函数步骤图给了我很大帮助,使得本试验基础思绪变得很清楚,用较为简单算法就能实现;处理试验中碰到问题也花费了一部分时间,我增加了处理相关文件错误能力;

    试验中碰到问题:

    问题关键有在调用某个函数时没有在之前申明或定义过此函数;还有在当用户输入选择方法非法时,提醒错误并要求重新输入,这用一个while循环实现。

    程序自我评价:

    此程序实现了要求中全部功效,并增加了对用户操作错误、输入串错误检测功效,但因编程能力欠缺,其中有地方不免有些繁杂,还有部分潜藏问题,需要深入测试来时程序变得愈加含有健壮性。

    程序清单:

    /****************************************************

    课题名称:递归下降语法分析设计原理和实现技术

    作者:房皓 进修生最终修改时间:20XX.4.16 13:52

    ***************************************************/

    /**************************************************单词符号及其分类编码

    单词符号 种别码

    ( 1

    ) 2

    + 3

    - 4

    * 5

    / 6

    i 7

    # 8

    //////////////////////////////////////////////////文法

    G[E]:

    E →TE′

    E′→ATE′|ε

    T →FT′

    T′→MFT′|ε

    F →(E)|i

    A →+|-

    M →*|/

    /***************************************************/

    #include<iostream>

    #include<conio.h>

    using namespace std;

    #define MAX 50

    char token[MAX];

    char token2[MAX];

    char current;

    int i=0;

    /****************************************************

    函数申明

    ****************************************************/

    void E();

    void E1();

    void T();

    void A();

    void F();

    void T1();

    void M();

    void error();

    void error1();

    void init() //初始化

    {

    current=token[i];

    }

    void justify(char ch,int i) //判定文件读取内容是否正当,包含检验非法字符和不匹配现象

    {

    switch(ch)

    {

    case '1':

    if(token[i]!='(')

    error1();

    break;

    case '2':

    if(token[i]!=')')

    error1();

    break;

    case '3':

    if(token[i]!='+')

    error1();

    break;

    case '4':

    if(token[i]!='-')

    error1();

    break;

    case '5':

    if(token[i]!='*')

    error1();

    break;

    case '6':

    if(token[i]!='/')

    error1();

    break;

    case '7':

    if(token[i]!='i')

    error1();

    break;

    case '8':

    if(token[i]!='#')

    error1();

    break;

    default:

    error1();

    break;

    }

    }

    void advance() //读取下一个字符

    {

    if(i==MAX)

    exit(0);

    current=token[++i];

    }

    void E()

    {

    if(current=='i' || current=='(')

    {

    T();

    E1();

    }

    else

    error();

    }

    void E1()

    {

    if(current=='+' || current=='-')

    {

    A();

    T();

    E1();

    }

    else

    if(!(current==')' || current=='#'))

    error();

    }

    void T()

    {

    if(current=='i' || current=='(')

    {

    F();

    T1();

    }

    else

    error();

    }

    void T1()

    {

    if(current=='*' || current=='/')

    {

    M();

    F();

    T1();

    }

    else

    if(!(current==')'||current=='#'||current=='+'||current=='-'))

    error();

    }

    void M()

    {

    if(current=='*')

    advance();

    else

    if(current=='/')

    advance();

    else

    error();

    }

    void A()

    {

    if(current=='+')

    advance();

    else

    if(current=='-')

    advance();

    else

    error();

    }

    void F()

    {

    if(current=='(')

    {

    advance();

    E();

    if(current==')')

    advance();

    }

    else

    if(current=='i')

    advance();

    else

    error();

    }

    void error()

    {

    cout<<"ERROR!"<<endl;

    exit(0);

    }

    void error1()

    {

    cout<<"输入错误!"<<endl;

    exit(0);

    }

    int main()

    {

    int flag; //提供输入和文件两种方法

    int j=1;

    int i=0;

    char token1[MAX]; //用于检测文件输入是否匹配

    FILE *fp;

    cout<<"输入方法:键盘(1)/文件(2):";

    while(!(cin>>flag) || (flag!=1 && flag!=2))

    {

    cout<<"\nError!Re-enter:";

    cin.clear();

    cin.ignore(200,'\n');

    }

    if(flag==1)

    {

    cout<<"请输入长度不超出50且以#结束字符串:"<<endl;

    cin>>token;

    }

    else

    {

    if((fp=fopen("input.txt","r"))==NULL)

    {

    cout<<"文件打开失败!"<<endl;

    exit(0);

    }

    token1[0]=fgetc(fp);

    while(!feof(fp))

    {

    token1[j++]=fgetc(fp);

    if((j%5)==0)

    {

    token2[i]=token1[j-4];

    token[i]=token1[j-2];

    justify(token2[i],i);

    i++;

    }

    }

    if((j-1)%5 != 0)

    error1();

    cout<<"读入字符串为:"<<token<<endl;

    }

    init();

    E();

    if(current=='#')

    cout<<"SUCCESS!"<<endl;

    return 1;

    }

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问