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

    词法分析程序构造原理与实现技术实验报告文档x

    时间:2020-09-22 12:29:31 来源:勤学考试网 本文已影响 勤学考试网手机站

    词法分析程序构造原理与实现技术

    实验报告

    变更说明

    日期

    版本

    变更位置

    变更说明

    作者

    2014/4/9

    1.0

    初稿生成

    房皓

    2014/4/9

    1.0

    完善 兀善

    截稿

    房皓

    、 实 验目的:

    本实验的目的在于在教师的引导下以问题回朔与思维启发的方式, 使学生在 不断的探究过程中掌握编译程序设计和构造的基本原理和实现技术, 启迪学生的 抽象思维、 激发学生的学习兴趣、 培养学生的探究精神和专业素养, 从而提高学 生发现问题、分析问题和解决问题的能力。

    、实验内容:

    [ 实验项目 ] 完成以下正则文法所描述的 Pascal 语言子集单词符号的词法分析 程序。

    <标识符字母丨 < 标识符〉字母丨 < 标识符〉数字

    <无符号整数 >—数字丨 < 无符号整数〉数字

    <单字符分界符> T + I- I * I; I ( I)

    <双字符分界符>f <大于>=I <小于>=I <小于>> I <冒号>=I <斜竖>* <小于>f < <等于>f = <大于>T> <冒号> T: < 斜竖> T/

    该语言的保留字: begin end if then else for do while and or not

    [设计说明](1)该语言大小写不敏感;(2)字母为a-z A-Z,数字为0-9; (3) 可以对上述文法进行扩充和改造;(4) ‘/*……*/ '为程序的注释部分。

    [设计要求] (1)给出各单词符号的类别编码;( 2)词法分析程序应能发现输

    入串中的错误;( 3)词法分析作为单独一遍编写,词法分析结果为二元式序列 组成的中间文件;( 4)设计两个测试用例(尽可能完备),并给出测试结果。

    三、实验环境:

    操作系统: Windows 7

    软件: VC++6.0

    四、程序功能描述:

    给出了各单词符号的类别编码; 词法分析程序能够对给出的文件中的输入串做出正确的词法; 词法分析程序能发现文件输入串中的错误; 词法分析结果为二元式序列组成的中间文件; 词法分析程序能兼容注释并能发现文件注释未关闭的错误

    五、数据结构设计:

    char T0KEH[20];

    FILF *fp_out=fopen("result-txf"w"); char ch;

    int i=0,c;

    int zhu5hi=0;

    ch^fgetcCFp);

    六、程序结构描述:

    设计方法:

    本程序采用从文件读取字符串,根据已有文法、词法的构成及规定对字 符串进行词法分析,其种类主要包括保留字、标识符、无符号数字、字符等, 将分析的结果写入另一个文件。程序规定的单词符号及其种别码见下表:

    单词符号及其种别码表

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    r无符号整数

    13

    end

    2

    +

    14

    If

    3

    -

    15

    the n

    4

    *

    16

    else

    5

    17

    for

    6

    (

    18

    do

    7

    )

    19

    while

    8

    =

    20

    and

    9

    >

    21

    or

    10

    >=

    22

    not

    11

    <

    23

    标识符

    12

    <=

    24

    <>

    25

    :=

    26

    /

    27

    /*

    28

    */

    29

    主要函数说明:

    -圉 cffx classes

    -臼 Globals

    lookup (char *str)

    mainQ

    scanner[FILE xfp)

    lookup():每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将 相应关键字的类别码赋给整型变量 c;否则将c置为0;

    mai n():主函数;

    scanner()扫描函数,完成程序的主要功能,包括读字符串、分析处理、分 析处理等。

    函数调用关系说明:

    main()函数调用 scanner()函数; scanner()函数调用 lookup()函数。

    执行框图:

    1)总体结构图:

    结束

    2)扫描程序结构框图:

    七、实验过程结果截图:

    测试用例一:

    jriput-txt * 记质本 | 回

    交1牛(F)需辑旧13式(0)登君〔V)降助凹

    asdf 1234T 4 <〉<》(,#+//+dfakldf j+/ >=df^~

    结果一:

    F - r?ulttxt ■记事本 [=| 回

    立弓粗F)端辑IE)瑣式【0)至看(V)帮助[冊

    U^asdf) (13, 1234)(1^, & 阪 ^"(23, <)(21,5)(25?<>X1B,(帀讥,亍(非法字符川)fl & *)(27,7F (28, /*)(汪釋鰭束,*/) (22, >=) (12, dfa)

    结果二:

    ""resulttxt-HS^ ? 回

    文件{F)彌制E]您式奁看(V)

    *

    测试用例二:

    测试用例二:

    八、实验总结:

    实验心得:

    通过本次实验我锻炼了自己的上机操作能力及编程能力, 并对理论知识有了

    进一步的了解。本实验基本思路比较清晰,用较为简单的算法就能实现;解 决实验中遇到的问题也花费了一部分时间, 我增长了处理关于文件错误的能 力;

    实验中遇到的问题:

    主要问题就是在读取文件时对文件末尾的判断预处理, 有两个问题花费了大

    部分时间,一个是在回退时要判断是否为文件末尾,若是则不需要回退;另 外一个就是要先读取一个字符再用 feof(fp)来判断是否为文件尾,且两个应 紧密相连;

    程序的自我评价:

    此程序实现了要求中的所有功能,并增加了对注释的一些操作,但因编程能 力的欠缺,其中有的地方不免有些繁杂,还有一些潜藏的问题,需要进一步 测试来时程序变得更加具有健壮性。

    九、程序清单:

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

    课题名称:词法分析程序构造原理与实现技术

    作者:房皓 进修最后修改时间:2014.4.9 19:47

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

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

    单词符号及其分类编码

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    无符号整数

    13

    end

    2

    +

    14

    if

    3

    -

    15

    then

    4 *

    16

    else

    5 ;

    17

    for

    6

    (

    18

    do

    7

    )

    19

    while

    8

    =

    20

    and

    9

    >

    21

    or

    10

    >=

    22

    not

    11

    <

    23

    标识符

    12

    <=

    24

    <>

    25

    :=

    26

    /

    27

    /*

    28

    */

    //29

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

    #include<iostream>

    #include<ctype.h>

    #include<string.h>

    #include<stdlib.h>

    using namespace std;

    /////////////////////////////////////////////////////////////////////////////////////////

    int lookup(char *str)// 每调用一次,就以 TOKEN 中的字符串查保留字表,若查到,就将相应 关键字的类别码赋给整型变量 c;否则将c置为0

    { char*letter[11]={"begin","end","if","then","else","for","do","while","and","or","not"};// 保 留

    int i; for(i=0;i<11;i++)

    {

    if(strcmp(str,letter[i])==0) //比较是否相同

    return i+1; //若相同,返回相

    应的种别码

    }

    return 0;

    }

    ////////////////////////////////////////////////////////////////////////////////////

    int scanner(FILE *fp)

    {

    char TOKEN[20];

    FILE *fp_out=fopen("result.txt","w");

    }

    }

    }

    }

    char ch;

    int i=0,c;

    int zhushi=0;

    前不是注释, zhushi=1 表示当前及以后的都是注释

    ch=fgetc(fp);

    while(!feof(fp))

    {

    if(zhushi==0)

    {

    i=0;

    if(ch==' '||ch==' ')

    {}

    else

    if(isalpha(ch))

    { ch=tolower(ch); TOKEN[0]=ch; i++; ch=fgetc(fp); while(isalnum(ch)) {

    if(isalpha(ch))

    ch=tolower(ch);

    TOKEN[i]=ch; i++;

    ch=fgetc(fp);

    } TOKEN[i]='\0'; if(ch!=EOF) 此判断,遇到文件结尾仍返回的话,则

    fseek(fp,-1L,1);

    最后一个字符

    c=lookup(TOKEN);

    if(c==0)

    {

    fprintf(fp_out,"(%d,%s)",12,TOKEN); printf("(%d,%s)\n",15,TOKEN);

    }

    else

    {

    //zhushi 等于 0 表示当

    //zhushi 等于 0 表示当

    //判断文件结束

    //是否为字母

    //转换成小写

    //数字或字母

    //经验证,若没有

    //ch 的值永远为文件

    //查找保留字

    //标识符

    //标识符

    //保留字

    //保留字

    e-se

    if(isdigif(ch)) 一一^^比濟啪 宀

    TOKENollcm

    chufgeo(fp)八

    +■+

    whi-e(isdigifoh))

    TOKEN=llcm

    +■+

    chufgeofp)八

    TOKENUII-?

    ifoh'ilEOF)

    fseek(fp 匕 LL)八

    fprinffuplouwdvgJWTOKEN)- 二耳公4謡蒲 prinff(=(%CL%s)云J6HOKEN)- 二耳公4磔蒲 e-se

    swifch(ch)

    caseA-

    if(一 feof(fp))

    chufgeofp)八

    ifohlu-)

    fprinff(fplouf=(%dy%s)=24/u=)八 prinff(=(%CL%s)云=24/u£

    e-se

    =h(chlv)

    fprinff(fplouL=(%dy%s)=25/v== prinff(=(%dy%s?=25/v== e-se 宀

    if(ch'ilEOF) fseek(fp「二)八 fprinff(fplouL=(%d-%c)=23A-=

    prinff(=(%d-%c?=23\-=

    break 八

    }

    }

    case'=':

    {

    fprintf(fp_out,"(%d,%c)",20,'='); printf("(%d,%c)\n",20,'=');

    }

    break;

    case'>':

    if(!feof(fp))

    ch=fgetc(fp);

    if(ch=='=')

    {

    fprintf(fp_out,"(%d,%s)",22,">="); printf("(%d,%s)\n",22,">=");

    }

    else

    {

    if(ch!=EOF) fseek(fp,-1,1);

    fprintf(fp_out,"(%d,%c)",21,'>'); printf("(%d,%c)\n",21,'>');

    }

    break;

    case'+':

    {

    fprintf(fp_out,"(%d,%c)",14,'+'); printf("(%d,%c)\n",14,'+');

    }

    break;

    case'-':

    {

    fprintf(fp_out,"(%d,%c)",15,'-'); printf("(%d,%c)\n",15,'-');

    }

    break;

    case'*':

    {

    fprintf(fp_out,"(%d,%c)",16,'*'); printf("(%d,%c)\n",16,'*');

    }

    break;

    case';':

    {

    fprintf(fp_out,"(%d,%c)",17,';'); printf("(%d,%c)\n",17,';');

    }

    break;

    case'(':

    {

    fprintf(fp_out,"(%d,%c)",18,'('); printf("(%d,%c)\n",18,'(');

    }

    break;

    case')':

    {

    fprintf(fp_out,"(%d,%c)",19,')'); printf("(%d,%c)\n",19,')');

    }

    break;

    case'/':

    if(!feof(fp))

    ch=fgetc(fp);

    if(ch=='*')

    {

    //zhushi=1;zhushi=1;

    //zhushi=1;

    fprintf(fp_out,"(%d,%s)",28,"/*"); printf("(%d,%s)\n",28,"/*");

    }

    else

    {

    if(ch!=EOF) fseek(fp,-1,1);

    fprintf(fp_out,"(%d,%c)",27,'/'); printf("(%d,%c)\n",27,'/');

    }

    break;

    case':':

    if(!feof(fp))

    ch=fgetc(fp);

    if(ch=='=')

    {

    fprintf(fp_out,"(%d,%s)",26,":="); printf("(%d,%s)\n",26,":=");

    }

    else

    {

    if(ch!=EOF) fseek(fp,-1,1);

    break;

    default:

    fprintf(fp_out,"(%s,%c)"," 非法字符 ",ch); printf("(%s,%c)\n"," 非法字符 ",ch); break;

    }

    }

    ch=fgetc(fp);

    if(zhushi==1) //该 部分为 检查注 释

    是否结束,若结束,则令 shuzhi=0;

    if(ch=='*')

    {

    if(!feof(fp))

    ch=fgetc(fp);

    if(ch=='/')

    {

    fprintf(fp_out,"(%s,%s)"," 注释结束 ","*/");

    printf("(%s,%s)\n"," 注释结束 ","*/");

    zhushi=0;

    ch=fgetc(fp);

    }

    else

    {

    if(ch!=EOF)

    fseek(fp,-1,1);

    ch=fgetc(fp);

    }

    }

    }

    if(zhushi==1) //没有关闭注释

    {

    fprintf(fp_out,"(%s)"," 程序有错误,注释没有关闭! ");

    printf("(%s)\n"," 程序有错误,注释没有关闭! ");

    }

    fclose(fp_out);

    return 1;

    }

    ///////////////////////////////////////////////////////////////////////////////////////

    int main()

    {

    FILE *fp=fopen("input.txt","r");

    scanner(fp);

    fclose(fp);

    return 1;

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

    推荐访问