开发一个简单的解释型编程语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
项目名称 开发一个简单的解释型编程语言
开发人员 目的 1、掌握综合运用所学知识解决实际问题的能力; 2、掌握灵活运用指针和指针数组解决实际问题,从中体会指针对程序设计的作用; 3、掌握编程语言的内在机理,提高对各种程序设计语言的理论认识,进而真正掌握C 语言;并为下一步学习面向对象语言打下良好的基础;
4、初步掌握编译原理的基本原理,以及编译型语言和解释型语言在执行机制上异同,特别是
为同学以后自学脚本语言打下良好的理论基础;脚本语言是非常有用的一种开发语言,特别
是在大型游戏设计是非常重要的一种编程技术;
5、在实战中提高同学的编程能力。
一、开发要求
1、 用C 或Java 开发一个简单的解释型编程语言;
2、 实现要求:解释器软件从文件或键盘上逐行接收输入的语句,一条语句是一行,所以不需要以“;”
作为语句的结束符。
解释器根据语句类型执行不同的动作,遇到输入语句则从键盘接收用户输入的一个整数或一串以回车结束的字符串;遇到输出语句则在屏幕上显示指定的变量的值。
3、 该编程语言必须支持至少以下功能:
⑴ 变量声明语句:
语法:数据类型 变量名,变量名,…
数据类型要求至少支持整数和字符串,例如:
整数 学生人数,grade
string 学生姓名
⑵ 赋制值语句:
语法: 变量名=常量/变量名
变量名=常量/变量名 + 常量/变量名
变量名=常量/变量名 - 常量/变量名
变量名=常量/变量名 * 常量/变量名
变量名=常量/变量名 / 常量/变量名
要求:常量是整数或字符串,对于整数支持加、减、乘、除运算,对于字符串则只支持加法运算,必须能检查运算或赋值的两个表达式类型是否一致。
例: 学生姓名=”独孤求败”
grade=grade*10
⑶ 输入语句:
语法:input 变量名;
例: input 学生姓名
⑷ 输出语句:
语法:print 变量名;
例: print 学生姓名
东 华 大 学 计 算 机 学 院
DongHua University
软 件 开 发 任 务 书
二、评分方法
1、基本功正确:75分
2、开发报告:25分
①封面
②对软件的总体介绍:概要功能介绍、系统的软件结构(数据结构、全局变量、程序主流程等)
③各个主要功能模块(不是每个函数,而是独立功能)的流程图,必要时附主要程序段加以说明。
④项目报告中说明程序设计过程中的难点、解决办法及编程小结或体会。
三、设计指导
解释器的实现关键是符号表,符号表实际上一个如下类型的一维数组tokenTable[100]:struct Token
{
char * pName; //指向某个变量名字符串的保存位置
void * pVal; //指向保存某个变量的值的内存地址,使用时需要强制类型转换 char type; //指示某个变量的数据类型:’i’-整数;’s’-字符串
int size; //指示某个变量所占用的内存大小
} tokenTable[100];
程序的主框架结构如下:
int nVal;
char sVal[100];
struct Token tokenTable[100];
void main()
{
memset(tokenTable,0,sizeof(tokenTable));
循环
1、从键盘上读入一串字符保存到s;
2、以空格为分割符从s中截取第一个单词;
3、如果该单词是数据类型关键字,则
循环
⑴以逗号为分割符从剩余的s中截取第一个单词;
⑵以该单词(即变量名)查tokenTable数组,检查该变量名是否与数
组中某个元素的pName所指向的字符串相等;是;提示用户变量名重复定义,
退出循环;否则,继续3;
⑶在tokenTable数组中寻找一个空的元素,找不到,提示用户系统空
间溢出,中断程序;否则,继续4;
⑷根据数据类型将相应的type设置为对应的值;
⑸调用malloc函数为变量名分配保存空间,并将malloc的返回地址保
存到pName中,然后调用strcpy函数将变量名保存到malloc分配的内
存中;
⑹如果变量是整型数据类型,则用malloc函数为变量分配保存其值的
内存空间(sizeof(int)),并将malloc的返回地址保存到pVal中;对
于字符串类型,则分配10个字节大小的空间,并将malloc的返回地址
保存到pVal中,同时,将tokenTable数组当前元素的size设置为10;
4、如果该单词是input关键字,则
⑴以剩余的s为变量名查tokenTable数组,检查该变量名是否与数组
中某个元素的pName所指向的字符串相等;否;提示用户未定义的变量名,继
续循环;否则,继续2;
⑵根据tokenTable数组中当前元素的type判断该变量是整数吗?是,
执行scanf(“%d”,&nVal);否则,scanf(“%s”,sVal);
⑶如果执行的是scanf(“%d”,&nVal)语句,则将nVal复制到tokenTable数
组中当前元素的pVal所指向的内存中,退出循环;否则,继续4;
⑷判断sVal的长度是否超过了size,否,将sVal复制到tokenTable数
组中当前元素的pVal所指向的内存中,退出循环;否则,继续5;
⑸利用free释放pVal所指向的内存,再利用malloc申请
strlen(sVal)+1的内存,返回值保存到pVal;
⑹利用strcpy()将sVal的内容复制到pVal所指向的内存中;
5、如果该单词是print关键字,则…………….
6、如果该单词是exit关键字,则程序结束.
7、⑴用该单词(即变量名)查tokenTable数组,检查该变量名是否与数组中某个元
素的pName所指向的字符串相等;否;提示用户未定义变量,继续循环;否则,下一步;
⑵如果剩余字符串中没有“+”或“-”,则说明是简单的变量赋值,继续⑶,否则,转⑹
⑶检查剩余字符串是否是以字符开头,是,该字符串首字符是双引号吗,是,说明是以字
符串常量为变量赋值,转⑷,否则,转⑸;
⑷将两个双引号之间的字符复制到sVal,然后按照inpout语句方法同样处理,
继续循环;
⑸将剩余字符串转换为整数保存到nVal,然后按照inpout语句方法同样处理,
继续循环;
⑹进行表达式运算处理,以“+”、“—”、“*”、“/”为分隔符得到两个字符串,同理,
先检查这两个字符串是否变量名,是,从符号表中得到其值,否则,转换为相应的值,
并将运算结果保存到符号表中。
}
}。