JMU软件工程编译原理实验一

该文介绍了一项实验,旨在通过手工方法实现词法分析器,理解词法分析阶段的要求。实验中,学生需要根据词法要求和状态图在C语言环境下编写代码,处理包括标识符、常量、运算符等,同时进行错误检测,当遇到错误单词时报告错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验一 手工编程实现词法分析器

1.实验目的: 熟悉词法分析阶段的要求,掌握利用状态图手工实现词法分析器的方法。

2.实验设备: 硬件:PC 机一台 软件:Windows系统,高级语言集成开发环境

3.实验内容: 根据词法要求手工实现词法分析器

4.实验要求及步骤

  1. 理解以下词法表述和状态图表示。

  1. 参考教科书3.2.4章节编写代码实现词法分析器。实现语言不限,推荐使用C语言,不可用脚本类语言;不允许使用任何语言的正规式控件实现实验要求。
  2. 提交词法分析器代码与实验报告。实验报告为word形式文档,内容是10对如下形式的输入输出。

输入语句任意自设,可包含错误单词($ERR类);若含错误单词,则词法分析器运行需报告错误,错误信息含第一个错误单词位置。

代码如下:

#include "stdlib.h"
#include "ctype.h"
#include "string.h"
#include "stdio.h"
#define _MYTEX
#define STRSIZE 1024

void init();        
void getChar();    
void getBC();     
void concat();      
int reserve();      
void retract();    
void insertID();   
void insertConst(); 
void over();        
int run();          


char ch;            
char *strToken;     
int strTokenLen;   
char *str;         
int strIndex;      
int strSize;       
char resTable[5][5] = {"DIM\0", "IF\0", "DO\0", "STOP\0", "END\0"}; 


void init() {
    ch = '\0';
    str = (char *) malloc(STRSIZE * sizeof(char));
    str[0] = '\0';
    strIndex = 0;
    strToken = (char *) malloc(STRSIZE * sizeof(char));
    strToken[0] = '\0';
    strTokenLen = 0;
} 

void getChar() {
    ch = str[strIndex++];
} 

void getBC() {
    while (isblank(ch)) {
        getChar();
    }
} 

void concat() {
    strToken[strTokenLen++] = ch;
    strToken[strTokenLen] = '\0';
} 

int reserve() {
    int i = 0;
    for (i = 0; i < 5; i++) {
        if (strcmp(strToken, resTable[i]) == 0) {
            printf("$%s\n", resTable[i]);
            return i;
        }
    }
    return -1;
} 

void retract() {
    strIndex--;
    ch = '\0';
} 

void insertID() {
    printf("$ID\t\t %-20s\n", strToken);
}

void insertConst() {
    printf("$INT\t %-20s\n", strToken);
}

void over() {
    free(strToken);
    strToken = (char *) malloc(STRSIZE * sizeof(char));
    strTokenLen = 0;
}

int run() {
    init();
    printf("\nPlease input code: ");
    fflush(stdout);
    scanf("%[^\n]", str);
    scanf("%c", &ch);
    strSize = strlen(str);
    printf("编码\t值\n---------------\n");
    int status = 1;
    while (status) {
        getChar();
        getBC();
        if (isalpha(ch)) {
            while (isalnum(ch)) {
                concat();
                getChar();
            }
            retract();
            int resCode = reserve();
            if (resCode == -1) {
                insertID();
            }
        } else if (isdigit(ch)) {
            while (isdigit(ch)) {
                concat();
                getChar();
            }
            retract();
            insertConst();
        } else if (ch == '=') {
            printf("$ASSIGN\n");
        } else if (ch == '+') {
            printf("$PLUS\n");
        } else if (ch == '*') {
            getChar();
            if (ch == '*') {
                printf("$POWER\n");
            } else {
                retract();
                printf("$STAR\n");
            }
        } else if (ch == ',') {
            printf("$COMMA\n");
        } else if (ch == '(') {
            printf("$LPAR\n");
        } else if (ch == ')') {
            printf("$RPAR\n");
        } else {
            if (strIndex > strSize) {
                status = 0;
            } else if (!isblank(ch)) {
                printf("$ERR\t %-20c\n", ch);
                status = 0;
            }
        }
        over();
    }
    return strSize;
}

int main ()
{
    while (run()) {
    	
    }
    return 0;
}
上机实习目的:理解编译程序的构造原理,掌握编译程序的构造方法与技术。通过实习,使学生既加深对编译原理基础理论的理解,又提高动手能力,特别是提高软件设计能力。 二、上机实习要求: 在理解编译原理基本思想的基础上,选择个自己熟悉的程序设计语言,完成编译程序的设计和实现过程。本实习要求学生采用递归下降分析技术,这是种自顶向下的的编译方法,其基本思想是对语言的每个(或若干个)语法成分编制个处理子程序,从处理这个语法成分的子程序开始,在分析过程中调用系列过程或函数,对源程序进行语法和语义分析,直到整个源程序处理完毕为止 本上机实习是为C语言(子集)设计个编译程序,完成词法分析、语法分析、语义分析等功能,并生成某种机器上的目标代码(汇编语言)或中间代码(四元式)。 三、上机实习步骤 1.阅读《上机实习指导书》。 2.根据设计要求写算法,画程序框图 3.根据框图编写编译程序 4.输入编译程序并上机调试 5.撰写上机实习报告 四、上机实习内容 1、题目:C语言小子集编译程序的实现 2、C语言小子集的文法规则: ::=main(){} ::=; ::= ::=int::=, ::= ::= ::= ::= ::=;| ::=||| ::== ::= ::=| ::=| ::=||() ::= ::= ::= ::= ::=+|- ::=*|/ ::=|!=|>=|<=|== ::={} ::=| ::=if()else ::=while()do ::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z ::=0|1|2|3|4|5|6|7|8|9
1.1编写目的 1.为了让网站开发更具有目的性 2.为了让客户更加清楚软件的开发过程与进度,增加与客户的交流 3.加强项目组内的管理,让工作清晰化 4.可以合理安排组织成员,有效利用时间,以确保项目进度,预见项目风险等活动。 5.项目开发成员通过此计划书明确项目目标以及各自职责 1.2参考资料 《实用软件工程》 《JAVA网络高级编程》 《软件工程》 《信息系统分析与设计》 2.项目概述 2.1工作内容 2.1.1.制作和修订项目开发计划; 2.1.2.进行计划跟踪与监控; 2.1.3.工作产品及时进行受控管理; 2.1.4.按计划提请阶段评审; 2.1.5.提交测试部门评测开发产品; 2.1.6.交付最终工作产品。 2.1.7.项目实施总结 2.1.8.项目验收 2.2条件与制约 2.2.1.能够存储大量图书和读者信息,并方便有效的进行相应的图书操作和管理,这主要包括: A.能够通过书籍基本信息查询书籍信息; B.对于每种书籍,除可查看其基本信息之外还可查看其总数以及目前在馆数量; C.可增添,删除,修改书籍信息; D.能够添加、修改、删除用户基本信息; E.用户可查看其基本信息之外,还可查看其已借的书籍列表、数量、借还日期。 2.2.2.能够对需要的统计结果提供打印输出。 2.2.3.能够提供定的安全机制,提供数据信息授权访问,防止随意删改,同时提供信息备份的服务。 2.3产品及成果 2.3.1.程序 软件名称:图书馆管理系统编程语言:JSP 存储方式:U盘,计算机 2.3.2.文件 1.用户操作手册:本手册详细描述软件的功能、性能和用户界面,使用户对如何使用该软件得到具体的了解,为操作人员提供该软件各种运行情况的有关知识,特别是操作方法的具体细节。 2.软件维护手册:主要包括软件系统说明、程序模块说明、操作环境、支持软件的说明、维护过程的说明,便于软件的维护。 2.3.3.服务 计划提供以下服务: 1.课堂培训:以讲课形式对客户进行培训,使其能够正确使用软件; 2.免费咨询:客户可以在工作时间向技术人员提出问题并获得解答; 3.技术支持:对于某些客户,采取上门指导的方式; 4.软件维护:获取软件使用中的问题,提供补丁程序; 5.升级通知:在软件新版本发布的时候,及时通知(Email或邮寄信件)注册的用户,并提供试用版本; 6.软件升级:对于注册用户,只需较少的费用即可升级到新的版本;7.培训安装、维护和运行支持从使用该系统开始,维护期限为--年。 2.4运行环境 操作系统为Window 10,使用集成开发工具Eclipse5.5.1,数据库采用SQLServer2012,项目运行环境为IIS5.0。 2.5验收标准 2.5.1.代码的验收 最后在交付客户之前进行小组内评审,代码编写符合HB6465标准,与文档说明保持致,代码书写风格统,采用标准规范,没有下列错误:由于软件缺陷造成丢失数据,不符合设计要求,响应时间太长无法接受等问题。 2.5.2.文档验收 最后在交付客户之前进行小组内评审,文档格式符合HB6465标准,功能符合与客户的合同要求,清晰易读,没有语病与歧义。 2.5.3.服务验收 服务硬件达到文档说明的要求,人员技术考核合格,定期上门维护。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hiOoo.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值