TEST语言 -语法分析,词法分析实验报告

合集下载

使用test指令时的程序流程

使用test指令时的程序流程

使用test指令时的程序流程目录• 1. 概述• 2. 程序流程– 2.1 准备工作– 2.2 执行test指令– 2.3 数据处理– 2.4 结果输出• 3. 总结1. 概述test指令是一条常用的命令,用于对条件进行测试并返回结果。

该指令广泛应用于Shell脚本和编程语言中,用于判断条件是否成立,并根据结果进行相应的操作。

本文将介绍使用test指令时的程序流程,帮助读者更好地理解和应用该指令。

2. 程序流程2.1 准备工作在使用test指令之前,需要进行一些准备工作,确保环境和数据符合要求。

具体包括以下几个步骤:1.确认操作系统是否支持test指令。

test指令是一部分Linux和Unix操作系统的基本工具集,通常是预装在系统中的。

通过在终端中输入mantest命令,可以查看该指令的帮助文档,确认是否安装。

2.确定条件和需要测试的数据。

在使用test指令时,需要明确需要测试的条件和相应的数据。

条件可以是数值比较、字符串比较、文件判断等等,而数据则是作为测试的输入。

2.2 执行test指令一旦准备工作完成,就可以开始执行test指令。

程序流程如下:1.使用test指令进行条件判断。

根据之前准备的条件和数据,使用test指令进行条件判断。

常用的条件判断包括数值比较、字符串比较和文件判断等。

根据不同的条件进行不同的判断操作。

2.根据判断结果执行相应的操作。

根据test指令的返回值,判断条件是否成立。

如果条件成立,则执行相应的操作,否则跳过该操作。

常见的操作包括输出信息、变量赋值、执行其他指令等。

3.循环执行test指令。

在实际应用中,往往需要多次执行test指令,对不同的条件进行判断和操作。

可以使用循环结构,如for循环、while循环等,反复执行test指令,直到满足退出条件为止。

2.3 数据处理在执行test指令的过程中,往往需要对数据进行相应的处理。

数据处理可以包括以下几个方面:1.数据输入。

汇编test指令用法

汇编test指令用法

汇编test指令用法一、概述汇编是一种低级语言,它可以直接控制计算机硬件,使得程序能够高效地运行。

在编写汇编语言程序时,经常需要用到测试指令,其中最常用的就是test指令。

test指令可以将两个操作数进行逻辑运算,并且不会改变操作数的值。

通过对指令的使用,可以实现各种条件判断、位运算等功能。

本文将详细介绍test指令的使用方法和示例代码。

二、语法格式test指令的语法格式如下:test 源操作数, 目的操作数其中,源操作数和目的操作数可以是寄存器、内存地址或立即数等。

test指令会将源操作数与目的操作数进行逻辑运算(按位与),结果存储在标志位中。

测试结果不会被存储到寄存器或内存中。

三、示例代码下面是几个使用test指令的示例代码:1. 判断一个数是否为偶数通过test指令可以实现判断一个数是否为偶数的功能。

如果一个数是偶数,那么它的二进制表示的最低位一定是0。

因此,可以将这个数与1进行逻辑运算,如果结果为0,则说明这个数是偶数。

如下是示例代码:```assembly mov ax, 4 ; 将4存入ax寄存器test ax, 1 ; 将ax寄存器与1进行逻辑运算 jzeven ; 如果结果为0,跳转到偶数的处理代码 ; 处理奇数的代码 jmp Done ; 跳转到程序结束 even: ; 处理偶数的代码 Done: ```2. 判断两个数是否相等通过test指令可以实现判断两个数是否相等的功能。

如果两个数相等,那么它们进行异或运算的结果为0。

因此,可以将这两个数进行异或运算,再将结果与0进行逻辑运算,如果结果为0,则说明这两个数相等。

如下是示例代码:```assembly mov ax, 10 ; 将10存入ax寄存器mov bx, 10 ; 将10存入bx寄存器 xor ax, bx ; 将ax 寄存器与bx寄存器进行异或运算 test ax, ax ; 将ax寄存器与0进行逻辑运算 jz equal ; 如果结果为0,跳转到相等的处理代码 ; 处理不相等的代码 jmp Done ; 跳转到程序结束 equal: ; 处理相等的代码 Done: ```3. 判断一个字节的某一位是否为1通过test指令可以实现判断一个字节的某一位是否为1的功能。

c语言test函数用法

c语言test函数用法

c语言test函数用法C语言中的test函数是一个非标准函数,它通常用于软件测试和调试。

test函数的作用是根据一个布尔表达式的真假情况输出一个字符串。

test函数的语法格式如下:void test(int expression, char* message);其中,expression是一个布尔表达式,message是一个字符串。

当expression为真时,test函数输出message;当expression 为假时,test函数不输出任何内容。

例如,下面的代码演示了test函数的用法:#include <stdio.h>void test(int expression, char* message);int main(){int a = 5;int b = 7;test(a > b, 'a is greater than b');test(a < b, 'a is less than b');return 0;}void test(int expression, char* message){if(expression){printf('%s', message);}}在上面的代码中,test函数被调用了两次。

第一次,由于a小于b,表达式a > b为假,test函数不输出任何内容;第二次,由于a大于b,表达式a < b为真,test函数输出字符串'a is less than b'。

值得注意的是,由于test函数不是标准函数,因此它在不同的编译器和平台上可能会有不同的实现方式和效果。

在实际开发中,应尽量避免使用非标准函数,以确保程序的可移植性和稳定性。

语言测试的的种类

语言测试的的种类

三语言测试的种类依据不同的分类标准,可以将语言测试分成不同的类别。

这些标准主要是测试的目的、测试的方式、测试语言技能的分合、测试的评分方式、测试时间的要求、测试对用户影响的大小、分数参照的标准等。

1 按照测试涉及的语言使用领域的不同普通语言测试与专项语言测试。

2 根据测试目的的不同每一种语言测试都应该具有明确的测试目的。

2.1 水平测试(proficiency test)这种测试用来测量考生的语言能力,如HSK, CPT(台湾)。

水平测试可以用来测量普通的语言能力,但也可以用来测量考生在某一领域或某些领域的语言能力,如BEC(剑桥商务英语证书)是专门测试考生在真实工作环境中英语交流能力,公司企业可用以评估员工和应聘者的英语水平。

水平测试也可以用来测量考生的某项或几项语言技能的水平,如,HSK(基础)只测试听力、语法和阅读的技能水平,HSK(初、中等)测试听力、语法、阅读、综合等技能水平,HSK(高等)测试听力、阅读、综合、作文和口语等技能水。

水平考试的特点:它是一种基于某种语言能力理论(theory-based)的测试,不与一定的课程或特定的教学内容直接关联。

水平考试一般是大规模的标准化考试,多由专门的考试机构来进行研发和实施。

参加水平考试的考生总体成绩一般呈正态分布。

水平测试多用于人才选拔。

2.2 成绩测试(achievement test)这种测试用来测量考生在某一课程或学习的某个阶段的学习进展或学习成果,如对外汉语教学活动中的单元测验、期中考试、期末考试。

也叫“学业测试”。

成绩测试本着“教什么学什么考什么”的原则,与一定的教学内容密切相关,是基于一定教学内容或教学大纲(syllabus-based)的测试。

所以,期中考试、期末考试的命题范围应该以某个阶段所学的内容为限,范围不宜过小或过大。

成绩测试一般由教学人员或教学单位负责命题、组织、实施。

对一个班的成绩测试所得的成绩不一定呈正态分布。

可能一个班上的学生学习成绩普遍较高,另一个班上的学生成绩普遍较低。

高中学业水平测试英语单项选择题内容效度分析

高中学业水平测试英语单项选择题内容效度分析

高中学业水平测试英语单项选择题内容效度分析高中学业水平测试(Senior High School Academic Level Test, SHSALT)是中国教育部为了考察高中学生的学术水平而开展的一项测试。

英语单项选择题是其中的一种题型,考查学生的语言知识和应用能力。

针对英语单项选择题的内容,可以进行如下效度分析:
1、语法知识:英语单项选择题中常包含语法知识的考查,例如动词时态、限定词、句子结构等。

这些语法知识是英语学习的基础,能够帮助学生更加准确地表达意思。

2、词汇量:英语单项选择题中也会考查学生的词汇量,例如给定一个生词,要求学生选择正确的意思。

这样的题目能够帮助学生扩大词汇量,并且能够提高学生的阅读理解能力。

3、语言运用能力:英语单项选择题还会考查学生的语言运用能力,例如给定一个句子,要求学生选择正确的补全方式。

这样的题目能够帮助学生综合运用所学知识,并且能够考察学生的灵活性和创造性。

总之,英语单项选择题的内容与效度都很高,能够全面考察学生的英语知识和运用能力。

学生在复习时应重点关注语法知识、词汇量和语言运用能力,以提高英语单项选择题的考试成绩。

此外,学生还应加强阅读能力和听力能力的训练,以进一步提高英语水平。

TTT(Test-Teach-Test)语言教学法研究-精品文档

TTT(Test-Teach-Test)语言教学法研究-精品文档

TTT(Test-Teach-Test) 语言教学法研究、TTT语言教学法概述1.教前测试(Test 1)教前测试(Test 1) 是指让学生在没有教师的帮助之下独立完成设定好的关于目标语言结构的任务或活动,其主要目的发现并诊断学生对目标语言的认知和掌握情况以及以往所学知识对新知识的迁移作用。

教师可根据教学前测试的反馈评估学生的实际情况并实时调整教学策略以适应教学对象的实际需求。

在设计教前测试的时候教师必须遵循以下原则。

(1)、预测旧有知识对目标语言的迁移作用。

在设计教前测试的时候,教师必须充分考虑教学对象的旧有知识与目标语言之间的关系,明确旧知识对新知识的影响,以及学生在完成测试时可能犯的语言错误,以利于教师根据测试结果调整教学策略。

比如,在教学现在进行时表将来用法时,教师要考虑一般将来时对现在进行时表将来这一用法的影响,以及现在进行时的一般用法对表将来用法的影响。

举例如下:根据一般情况推测,大部分学生的答案趋向于“ will+do ” 因为根据语境判断二者讨论的是将要发生的事情,而will+do ”是一般将来时的基本构成,其用法就是谈论将来发生的事情。

但是根据所给动词的性质判断,移动动词一般要用进行时表将来,所以答案只能是“ be+doing ”。

这时,学生又有可能将之与现在进行时的一般用法混淆。

在接下来的教学环节,教师就要将这三种容易混淆的用法进行对比,加以区别,以便学生掌握进行时表将来的用法。

(2)、测试的难度应该与学生的实际水平一致。

教前测试如果太难或太易都容易失去其诊断的功能,无法暴露学生的知识漏洞,不利于教师根据测试反馈调整教学策略。

因此教师必须编制适合目标学生实际水平的教前测试题目,以期达到准确诊断的效果。

(3)、测试的活动应该多种多样。

这里所说的测试不仅限于类似试卷试题的形式。

无论是何种任务、活动,只要能起到诊断作用都可以作为教前测试。

当然,为了便于教师准确及时把握问题,笔者更倾向于书面的活动。

duolingo english test评分标准

duolingo english test评分标准

duolingo english test评分标准
Duolingo的评分标准主要用于评估一个人的语言能力,尤其是他们的阅读、听力、写作和口语技能。

这个测试特别注重于词汇、语法和拼写,以及理解和创造合乎逻辑的句子和段落的能力。

在Duolingo English Test中,每位参加测试者的语言水平通过一个10-160分的分制来报告整体得分。

以下是每个分数段对应的语言能力描述:
1. 10-55分:能够理解一些基础的英语单词或短语。

能够理解直接的信息,并在熟悉的环境中表达自己。

2. 60-85分:能够理解日常事务中(如:工作、学校等)所涉及的对话或文章的主要内容。

尽管用语不太流畅自然,但能够描述自己的经历、理想、观点和计划。

3. 90-115分:即使对话题不熟悉也不会妨碍沟通。

能够理解具体或抽象文
章的主要思路。

能够轻松地与熟练使用英语者交流。

4. 分:能够理解许多有难度的文章和对话,包括专门的语言使用情景。

能够掌握语言中包含的含蓄表达、比喻、实用语和熟語。

在大多数社交、学术和专业场合都可以流畅有效地使用该语言。

以上信息仅供参考,如需了解更多关于Duolingo English Test的信息,建议查阅官网或咨询专业人士。

test指令用法

test指令用法

test指令用法test指令是许多编程语言和操作系统中常见的一个命令或程序。

它可以用来检测代码或系统是否正常运行,并且可以快速定位问题和错误。

在这篇文章中,我将讨论test指令的用法和常见用例。

1. Shell脚本中的test指令在Shell编程中,test指令被广泛使用来检查变量的值、比较字符串、检查文件是否存在以及其他一些相似的任务。

test有多个选项可以使用,这些选项可用于获取不同类型的测试结果。

例如,test指令中的"-eq"选项用于整数值比较,而"-z"选项用于检查变量值是否为空字符串。

以下是一些可能遇到的示例:1.1 检查变量是否为空以下命令可以检查变量VAR是否为空字符串:if [ -z "VAR" ]thenecho "VAR is empty"fi注意,在if语句中方括号之间必须留有空格,否则该命令将无法正常工作。

1.2 检查文件是否存在以下命令检查文件"myfile.txt"是否存在:if [ -e "myfile.txt" ]thenecho "myfile.txt exists"fi该命令中的“-e”选项用于检查文件是否存在。

如果文件确实存在,则使用echo 命令输出一条消息。

1.3 整数比较以下命令比较变量NUM是否等于42:if [ "NUM" -eq 42 ]thenecho "NUM equals 42"fi注意,该命令中的"-eq"选项用于整数比较。

如果NUM确实等于42,则输出一条消息。

2. 编程语言中的test指令在许多编程语言中,test指令也是一种常见的工具,用于检查代码是否符合给定的规则或条件。

例如,C语言中的“assert”宏可以用于检查值是否为真。

以下是一个简单的C语言示例:#include <assert.h>int square(int x) {assert(x >= 0);return x * x;}该函数返回参数x的平方。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验报告实验名称:分析调试语义分析程序TEST抽象机模拟器完整程序保证能用!!!!!一、实验目的通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。

二、实验设计程序流程图extern int TESTScan(FILE *fin,FILE *fout);FILE *fin,*fout; //用于指定输入输出文件的指针int main(){char szFinName[300];char szFoutName[300];printf("请输入源程序文件名(包括路径):");scanf("%s",szFinName);printf("请输入词法分析输出文件名(包括路径):");scanf("%s",szFoutName);if( (fin = fopen(szFinName,"r")) == NULL){printf("\n打开词法分析输入文件出错!\n");return 0;}if( (fout = fopen(szFoutName,"w")) == NULL){printf("\n创建词法分析输出文件出错!\n");return 0;}int es = TESTScan(fin,fout);fclose(fin);fclose(fout);if(es > 0)printf("词法分析有错,编译停止!共有%d个错误!\n",es);else if(es == 0){printf("词法分析成功!\n");int es = 0;es = TESTparse(szFoutName); //调语法分析if(es== true) printf("语法分析成功!\n");else printf("语法分析错误!\n");}elseprintf("词法分析出现未知错误!\n");}Parse.cpp#include<stdio.h>#include<string.h>#include<ctype.h>#include<conio.h>#include<vector>// functionbool TESTparse();bool compound_Stat();bool program();bool statement();bool expression_stat();bool expression();bool bool_expr();bool additive_expr();bool term();bool factor();bool if_stat();bool while_stat();bool for_stat();bool write_stat();bool read_stat();bool declaration_stat();bool declaration_list();bool statement_list();bool compound_stat();char token[20],token1[40]; //token保存单词符号,token1保存单词值FILE *fp; //用于指向输入文件的指针int EsLine = 0;typedef struct{int es;int line;}EsInf;std::vector<EsInf> StackEs;//语法分析程序void ProcessError(int es){EsInf temp;temp.es = es;temp.line = EsLine;StackEs.push_back(temp);}bool ReadFile(char *tok, char *tok1){if(feof(fp))return false;fscanf(fp,"%s\t%s\n",tok,tok1);printf("%s\t%s\n",tok,tok1);EsLine++;return true;}bool TESTparse(char *pFileName){bool es = true;if((fp=fopen(pFileName,"r"))==NULL){printf("\n打开%s错误!\n",pFileName);return false;}elseprogram();if(!feof(fp))ProcessError(9);fclose(fp);printf("=====语法分析结果!=====\n");if(StackEs.size() == 0){printf("语法分析成功!\n");return true;}else{int i;for(i = 0; i < StackEs.size(); i++){printf("在第%d行",StackEs[i].line);switch(StackEs[i].es){case 1:printf("缺少{!\n");break;case 2:printf("缺少}!\n");break;case 3:printf("缺少标识符!\n");break;case 4:printf("缺少分号!\n");break;case 5:printf("缺少(!\n");break;case 6:printf("缺少)!\n");break;case 7:printf("缺少操作数!\n");break;case 8:printf("文件为空!\n");break;case 9:printf("文件尾有多余字符!\n");break;case 10:printf("\n打开%s错误!\n",pFileName);break;}}return false;}}//《程序》::={<声明序列><语句序列>}//program::={<declaration_;list><statement_list>}bool program(){bool es = true;if( ReadFile(token,token1) == false ){ProcessError(8); // 文件结束return false;}if(strcmp(token,"{")) //判断是否为‘{’ProcessError(1);if( ReadFile(token,token1) == false ) // 文件中仅有{ProcessError(2);es = declaration_list();if(es == false)return false;es = statement_list();if(es == false)return false;if(strcmp(token,"}")) //判断是否为‘}’ProcessError(2);return true;}//<声明序列>::=<声明序列><声明语句>|<声明语句>//<declaration>::=//<declaration_list><declaration_stat>|ε//改成<declaration_list>::={<declaration_stat>}bool declaration_list(){bool es = true;while (strcmp(token,"int")==0){es = declaration_stat();if(es == false)return false;}return es;}//<声明语句>::=int<变量>;//<declaration_stat>::=int ID;bool declaration_stat(){bool es = true;if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}if(strcmp(token,"ID"))ProcessError(3); //不是标识符if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}if(strcmp(token,";"))ProcessError(4);if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}return(es);}//<语句序列>::=<语句序列><语句>|ε//<statement_list>::=<statement_list><statement>|ε//改成<statement_list>::={<statement>}bool statement_list(){bool es = true;if(feof(fp))return false;while(strcmp(token,"}")){es = statement();if(es == false)return(es);}return(es);}//<语句>::=<if语句>|<while语句>|<for语句>|<read语句>// |<write语句>|<复合语句>|<表达式语句>//<statement>::=<if_sttat>|<while_stat>|<for_stat>// |<compound_stat>|<expression_stat>bool statement(){bool es = true;if(strcmp(token,"if")==0 )es=if_stat(); //<if语句>else if(strcmp(token,"while")==0 )es=while_stat(); //<while语句>else if(strcmp(token,"for")==0 )es=for_stat(); //<for语句>else if(strcmp(token,"read")==0 )es=read_stat(); //<read语句>else if(strcmp(token,"write")==0 )es=write_stat(); //<write语句>else if(strcmp(token,"{")==0 )es=compound_stat(); //<复合语句>else if(strcmp(token,"ID")==0 || strcmp(token,"NUM")==0 || strcmp(token,"(")==0 ) es=expression_stat(); //<表达式语句>return(es);}//<if语句>::=if(<表达式>)<语句>[else<语句>]//<if_stat>::=if(<expressiion>)<statement>[else<statement>] bool if_stat(){bool es = true; //ifif( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}if(strcmp(token,"("))ProcessError(5); //少左括号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es = expression();if(es == false)return(es);if(strcmp(token,")"))ProcessError(6); //少右括号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=statement();if(es == false)return(es);if(strcmp(token,"else")==0) //else部分处理{if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=statement();if(es == false)return(es);}return(es);}//<while语句>::=while(<表达式>)<语句>//<while_stat>::=while<espr><statement>bool while_stat(){bool es = true;if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}if(strcmp(token,"("))ProcessError(5); //少左括号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es = expression();if(es == false)return(es);if(strcmp(token,")"))ProcessError(6); //少右括号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es = statement();if(es == false)return es;return(es);}//<for语句>::=for(<表达式>;<表达式>;<表达式>)<语句>//<for_stat>::=for(<expression>;<expression>;<expression>)<statement> bool for_stat(){bool es = true;if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}if(strcmp(token,"(")) ProcessError(5); //少左括号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=expression();if(es == false) return (es);if(strcmp(token,";")) ProcessError(4); //少分号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=expression();if(es == false) return (es);if(strcmp(token,";")) ProcessError(4); //少分号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=expression();if(es == false) return (es);if(strcmp(token,")")) ProcessError(6); //少右括号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=statement();if(es == false) return (es);return es;}//<write_语句>::=write<表达式>;//<write_stat>::=write<expression>bool write_stat(){bool es = true;if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=expression();if(es == false) return (es);if(strcmp(token,";")) ProcessError(4); //少分号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}return es;}//<read_语句>::=read<变量>//<read_stat>::=read Id;bool read_stat(){bool es = true;if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}if(strcmp(token,"ID")) ProcessError(3); //少标识符if(strcmp(token,";")) ProcessError(4); //少分号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}return es;}//<复合语句>::{<语句序列>}//<compound_stat>::={<statement_list>}bool compound_stat() //复合语句函数{bool es = true;if( ReadFile(token,token1) == false )ProcessError(2); // 缺少}return false; // 文件结束}es = statement_list();if(es == false)return es;// -------------- new----------if(strcmp(token1,"}") != 0)ProcessError(2);else{if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}}// --------------- new ----------return es;}//<表达式语句>::=<<表达式>;|;//<expression_stat>::=<expression>;|;bool expression_stat(){bool es = true;if(strcmp(token,";")==0){if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}return es;es=expression();if(es == false) return es;if(strcmp(token,";")==0){if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}return es;}else{ProcessError(4); //少分号}return es;}//<表达式>::=<标识符>=<布尔表达式>|<布尔表达式>//<expression>::=ID=<bool_expr>|<bool_expr>bool expression(){bool es = true;int fileadd;char token2[20],token3[40];if(strcmp(token,"ID")==0){fileadd=ftell(fp); //记住当前文件位置if( ReadFile(token2,token3) == false ){ProcessError(2); // 缺少}return false; // 文件结束}if(strcmp(token2,"=")==0) //'='{if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=bool_expr();if(es == false) return es;}else{fseek(fp,fileadd,0); //若非‘=’,则文件指针回到‘=’前的标识符EsLine--;es=bool_expr();if(es == false) return es;}}else{es=bool_expr();if(es == false) return es;}return es;}//<布尔表达式>::= <算术表达式>[(>|<|>=|<=|==|!=)<算数表达式>]//<bool_expr>::= <additive_expr> [(>|<|>=|<=|==|!=)<additive_expr>]bool bool_expr(){bool es = true;es=additive_expr();if(es == false) return es;if(strcmp(token,">")==0||strcmp(token,">=")==0||strcmp(token,"<")==0||strcmp(token,"<=")==0||strcmp(token,"!=")==0||strcmp(token,"==")==0){if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=additive_expr();if(es == false) return es;}return es;}//<算数表达式>::=<项>{(+|-)<项>}//<additive_expr>::=<term>{(+|-)<term>}bool additive_expr(){bool es = true;es=term();if(es == false) return es;while(strcmp(token,"+")==0||strcmp(token,"-")==0) {if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=term();if(es== false) return es;}return es;}//<项>::=<因子>{(*|/)<因子>}//<term>::=<factor>{(*|/)<factor>}bool term(){bool es = true;es=factor();if(es == false) return es;while(strcmp(token,"*")==0||strcmp(token,"/")==0){if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=factor();if(es == false) return es;}return es;}//<因子>::=(<表达式>)|<标识符>|<无符号整数>//<factor>::=(<expression>)|ID|NUMbool factor(){bool es = true;if(strcmp(token,"(")==0){if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}es=expression();if(es==false) return es;if(strcmp(token,")")) ProcessError(6); //少右括号if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}}else{if(strcmp(token,"ID")==0||strcmp(token,"NUM")==0){if( ReadFile(token,token1) == false ){ProcessError(2); // 缺少}return false; // 文件结束}return es;}else{ProcessError(7); //缺少操作数}}return es;}Scan.cpp#include<ctype.h>#include<cstring>#include<stdio.h>// 保留字#define KEYWORDNUM 8char *pKeyword[KEYWORDNUM] = {"if", "else", "for", "while", "do", "int", "read", "write"};// 单分界符char szSingleWord[50] = "+-(){};,:";// 双分界符char szDoubleWord[10] = "<>!";// 其他符char *szDivide = "/";char *szStar = "*";char *szEqual = "=";#define STATUSNUM 16 //状态个数#define DATANUM 10 // 数据流个数// 数据流类型typedef unsigned int DATA;#define OTHER 0 // wrong input#define LETTER 1 // 字母#define DIGIT 2 // 数字#define SINGLEWORD 3 // 单分界符#define DOUBLEWORD 4 // 双分界符#define DIVIDE 5 // /#define EQUAL 6 // =#define STAR 7 // *#define SPACE 8 // 空白#define FILEOVER 9// 状态类型typedef unsigned int STA TUS;#define NOSTATUS 0 // wrong input#define START 1#define CASE_ID 2#define END_ID 3#define CASE_NUM 4#define END_NUM 5#define CASE_SINGLE 6#define END_SINGLE 7#define CASE_DOUBLE 8#define CASE_DOUBLE2 9#define END_DOUBLE 10#define CASE_DIVIDE 11#define CASE_NOTE 12#define END_NOTE 13#define CASE_ERROR 14#define END_ERROR 15// 状态转换表// :到达终结状态的数据不保存在输出串中int reflect[STATUSNUM][DA TANUM] ={ //OTHER LETTER DIGIT SINGLEWORDDOUBLEWORD DIVIDE EQUAL STAR SPACE FILEOVER /*NOSTATUS*/ {NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTATUS, NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS},/*START*/ {CASE_ERROR,CASE_ID, CASE_NUM,CASE_SINGLE,CASE_DOUBLE,CASE_DIVIDE,CASE_DOUBLE,CASE_SINGLE,STA RT, START},/*CADE_ID*/ {END_ID, CASE_ID, CASE_ID, END_ID, END_ID, END_ID, END_ID, END_ID, END_ID, END_ID},/*END_ID*/ {NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTATUS, NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS},/*CASE_NUM*/ {END_NUM, END_NUM, CASE_NUM, END_NUM, END_NUM, END_NUM, END_NUM, END_NUM, END_NUM, END_NUM},/*END_NUM*/ {NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS,NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS}, /*CASE_SINGLE*/ {END_SINGLE,END_SINGLE, END_SINGLE, END_SINGLE, END_SINGLE, END_SINGLE, END_SINGLE, END_SINGLE,END_SINGLE, END_SINGLE},/*END_SINGLE*/ {NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTATUS, NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS},/*CASE_DOUBLE*/ {END_SINGLE,END_SINGLE, END_SINGLE,END_SINGLE, END_SINGLE, END_SINGLE,CASE_DOUBLE2,END_SINGLE,END_SINGLE, END_SINGLE},/*CASE_DOUBLE2*/{END_DOUBLE,END_DOUBLE, END_DOUBLE,END_DOUBLE, END_DOUBLE, END_DOUBLE, END_DOUBLE,END_DOUBLE, END_DOUBLE, END_DOUBLE},/*END_DOUBLE*/ {NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS},/*CASE_DIVIDE*/ {END_SINGLE,END_SINGLE, END_SINGLE,END_SINGLE, END_SINGLE, END_SINGLE, END_SINGLE,CASE_NOTE, E ND_SINGLE, END_SINGLE},/*CASE_NOTE*/ {END_NOTE, E ND_NOTE, END_NOTE, END_NOTE, END_NOTE, END_NOTE, END_NOTE, END_NOTE, END_NOTE, END_NOTE},/*END_NOTE*/ {NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTATUS, NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS},/*CASE_ERROR*/ {END_ERROR, END_ERROR, END_ERROR,END_ERROR, END_ERROR, END_ERROR, END_ERROR,END_ERROR, END_ERROR, END_ERROR},/*END_ERROR*/ {NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTATUS, NOSTATUS, NOSTA TUS, NOSTA TUS, NOSTA TUS, NOSTA TUS}};// 若在pString中找到word 则返回true,否则,返回falsebool SearchChar(char word,const char *pString){int n = strlen(pString);for(int i = 0; i < n; i++){if( word == pString[i])return true;}return false;}// 得到word的数据流类型DA TA GetDataByword(char word){if(word == EOF)return FILEOVER;if(isalpha(word))return LETTER;if(isdigit(word))return DIGIT;if(SearchChar(word,szSingleWord))return SINGLEWORD;if(SearchChar(word,szDoubleWord))return DOUBLEWORD;if(SearchChar(word,szDivide))return DIVIDE;if(SearchChar(word,szEqual))return EQUAL;if(SearchChar(word,szStar))return STAR;if(isspace(word))return SPACE;return OTHER;}// 得到从status状态输入word后到达的状态STA TUS GetNextStatus(STATUS status, DA TA word){return reflect[status][word];}// 返回值表示错误个数。

相关文档
最新文档