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

    合肥工业大学编译原理实验报告(完整代码版)x

    时间:2020-10-13 12:44:38 来源:勤学考试网 本文已影响 勤学考试网手机站

    计算机与信息学院

    编译原理 实验报告

    专业班级

    学生姓名及学号 课程教学班号 任课教师 实验指导教师 实验地点

    信息安全13-1班

    马骏69

    实验楼机房

    2015?2016 学年第 二 学期

    = (4

    = (4 ,=)

    实验1词法分析设计

    、实验目的

    通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设 计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和 清楚的

    理解,并能正确地、熟练地运用

    、实验要求

    1 、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

    2、 将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。

    3、 根据测试数据进行测试。测试实例应包括以下三个部分 :

    全部合法的输入。

    各种组合的非法输入。

    由记号组成的句子。

    4、词法分析程序设计要求输出形式

    例:输入VC+语言的实例程序:

    If i=0 the n n++;

    a< = 3b %);

    输出形式为:

    类型

    位置(行,列)

    关键字

    (1,

    标识符

    (1,

    关系运算符

    (1,

    单词 二元序列

    (单词种别,单词属性)

    for (1,for )

    1)

    i ( 6,i )

    2)

    3) 12

    0

    (

    5,0 )

    常数

    (1,4)

    then

    (

    1 , then)

    关键字

    (1,5)

    n

    (6,n

    )

    标识符

    ( 1,6)

    ++

    Error

    Error

    (1,7)

    ?

    ( 2, ; )

    分界符

    (1,

    8)

    a

    (6,a )

    标识符

    (2,

    1)

    V =

    (4,<=

    )

    关系运算符

    ( 2,2)

    3b

    Error

    Error

    (2,4)

    %

    Error

    Error

    (2,4)

    )

    (

    2, ) )

    分界符

    (2,

    5)

    ?

    (

    2, ; )

    分界符

    (2,

    6)

    、 实验内容

    用 VC++/VB/JAVA 语言实现对 C 语言子集的源程序进行词法分析。通过

    入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编 码及单

    词符号自身值;若遇到错误则显示“ Error”,然后跳过错误部分继续显示 ;

    同时

    进行标识符登记符号表的管理。

    以下是实现词法分析设计的主要工作:

    1) 从源程序文件中读入字符。

    2) 统计行数和列数用于错误单词的定位。

    3)删除空格类字符,包括回车、制表符空格

    (4) 按拼写单词,并用(内码,属性)二元式表示。(属性值——token的机内 表示)

    (5) 如果发现错误则报告出错 7

    (6) 根据需要是否填写标识符表供以后各阶段使用。

    四、 实验步骤

    1、 根据流程图编写出各个模块的源程序代码上机调试。

    2、 编制好源程序后,设计若干用例对系统进行全面的上机测试, 并通过所设计 的词法分析程序;直至能够得到完全满意的结果。

    3、 书写实验报告;实验报告正文的内容:

    功能描述:该程序具有什么功能

    程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数 之间的调用关系图。

    详细的算法描述(程序总体执行流程图) 。

    给出软件的测试方法和测试结果。

    实验总结(设计的特点、不足、收获与体会)。

    五、 实验截图

    先创建文件

    输入

    If i=0 the n n++;

    a<= 3b %);

    六、核心代码

    #in clude<iostream>

    #in clude<stri ng>

    #in clude<fstream>

    #i nclude <sstream>

    using n amespace std;

    const char* salaryfile="";

    const int max=40;

    stri ng

    id[max]={"do","e nd","for","if","pri ntf","sca nf","the n" ,"while"};

    *D

    *D sc- + documentz\§T^lS^^\DeD-Ljg\bisnyi2w2.ezce'

    0

    he

    l+i*i4

    1

    HE

    i+i*i4

    E->TG

    POP,PUSH(Gr>

    2

    nci

    T->FS

    pop,push(sp>

    3

    HN38F

    F->i

    POP,PUSH(i>

    4

    1*±*±1

    GETNEXT(l)

    b

    flGG

    s->$

    POP,PUSHC$>

    6

    flG

    G->+TG

    POP,PUSH(Gr+>

    BGI +

    GETNEXTCI>

    flGI

    i*itt

    T-JFS

    POP,PUSHCGF>

    ttCSF

    i*itt

    F->1

    POP,PUSHCi>

    19

    ttGSi

    GETNEXTCI>

    11

    ttGS

    *itt

    S->*FS

    POP,PU£ll<SI^>

    12

    #GSF*

    *itt

    GETNEXTCI>

    13

    #GSF

    iU

    F->i

    POPFPUSH<i>

    14

    ttGSi

    m

    GETNEXTCI>

    1S

    ttGS

    t

    s->5

    FOP. PUSH

    ttG

    t

    G->$

    POP.PUSH<?>

    17

    tt

    t

    suces?ed! f!?

    over!f!?

    to cvntiiu?

    SetDlgltemText(IDC_EDIT2,s2);

    */

    入栈

    入栈"<<e ndl;

    ctype;umber<<",状态"<<smarttable[i][j].number<<"

    pp=pp+"ACTION[";

    char buffer[max];

    sprintf(buffer,"%d",i);

    string s=buffer;

    pp=pp+s;

    pp=pp+",";

    pp=pp+fu;

    pp=pp+"]=S";

    char buf[max];

    sprintf(buf,"%d",smarttable[i][j].number); s=buf;

    pp=pp+s;

    pp=pp+", 状态 ";

    pp=pp+s+"入栈"+hh;

    }

    if(checkstyle==3)

    {

    umbervv"入栈"<<e ndl;

    char bf[max];

    sprintf(bf,"%d",i);

    string s=bf;

    pp=pp+s;

    pp=pp+","+endfureal[j]+")=";

    char bfff[max];

    sprintf(bfff,"%d",smarttable[i][j].number);

    s=bfff;

    pp=pp+s+" 入栈 "+hh;

    }

    (fu);

    (smarttable[i][j].number);

    umber];

    umber+1<<": "<<l<<" 归约 ,GOTO("; pp=pp+"r";

    int dd=smarttable[i][j].number+1;

    char bfc[max];

    sprintf(bfc,"%d",dd);

    string ss=bfc;

    pp=pp+ss+": "+l+" 归约 ,GOTO(";

    char n;ction(0,5);

    smarttable[0][3].action(0,4);

    smarttable[0][6].action(3,1);

    smarttable[0][7].action(3,2);

    smarttable[0][8].action(3,3);

    smarttable[1][1].action(0,6);

    smarttable[1][5].action(2,0);

    smarttable[2][1].action(1,1);

    smarttable[2][2].action(0,7);

    smarttable[2][4].action(1,1);

    smarttable[2][5].action(1,1);

    smarttable[3][1].action(1,3);

    smarttable[3][2].action(1,3);

    smarttable[3][4].action(1,3);

    smarttable[3][5].action(1,3);

    smarttable[4][0].action(0,5);

    smarttable[4][3].action(0,4);

    smarttable[4][6].action(3,8);

    smarttable[4][7].action(3,2);

    smarttable[4][8].action(3,3);

    smarttable[5][1].action(1,5);

    smarttable[5][2].action(1,5);

    smarttable[5][4].action(1,5);

    smarttable[5][5].action(1,5);

    smarttable[6][0].action(0,5);

    smarttable[6][3].action(0,4);

    smarttable[6][7].action(3,9);

    smarttable[6][8].action(3,3);

    smarttable[7][0].action(0,5);

    smarttable[7][3].action(0,4); smarttable[7][8].action(3,10); smarttable[8][1].action(0,6);

    smarttable[8][4].action(0,11);

    smarttable[9][1].action(1,0);

    smarttable[9][2].action(0,7);

    smarttable[9][4].action(1,0);

    smarttable[9][5].action(1,0);

    smarttable[10][1].action(1,2);

    smarttable[10][2].action(1,2);

    smarttable[10][4].action(1,2);

    smarttable[10][5].action(1,2);

    smarttable[11][1].action(1,4);

    smarttable[11][2].action(1,4);

    smarttable[11][4].action(1,4);

    smarttable[11][5].action(1,4);

    string enter=str;

    int i;

    int x;

    stylebox st;

    readybox ready;

    for(i=0;i<();)

    {

    // cout<<" enter: "<<enter[i]<<"

    "<<endl;

    x=program(st,ready,enter[i],i,enter,1);

    if(x==1)i++;

    if(x==2)

    {

    // cout<<"Acc: 分析成功 "<<endl;

    pp=pp+"Acc: 分析成功 "+hh; break;

    }

    if(x==4) break;

    // cout<<endl;

    // cout<<endl;

    // pp=pp+hh;

    }

    cout<<pp;

    // CDialog::OnOK();

    }

    七、实验总结

    而且提高了编程能通过本次试验使我不仅对 LR(1) 分析法有了更深的了解, 力,希望在以后的学习中可以解决 LR(1) 中确定化的问题。

    而且提高了编程能

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

    推荐访问