(完整word版)语义分析实验报告(word文档良心出品)
北邮 编译原理 语义分析实验报告

编译原理第六章语义分析目录1. 实验题目和要求 (2)2. 实验分析和思考 (3)3. 翻译方案 (4)4. LR实现自底向上分析(摘自语法分析实验) (5)4.1.构造识别所有活前缀的DFA (5)5.1. 扩充分析栈 ................................................................................................................ 7 5.2. 改造分析程序 ............................................................................................................ 7 5.3. 编程实现 .................................................................................................................... 76.运行结果截图: (13)1. 实验题目和要求题目:语义分析程序的设计与实现。
实验内容:编写语义分析程序,实现对算术表达式的类型检查和求值。
要求所分析算术表达式由如下的文法产生。
numE idF F F T F T T T T E T E E |)(||/|*||→→-+→ 实验要求:用自底向上的语法制导翻译技术实现对表达式的分析和翻译。
(1) 写出满足要求的语法制导定义或翻译方案。
(2) 编写分析程序,实现对表达式的类型进行检查和求值,并输出: ① 分析过程中所有产生式。
② 识别出的表达式的类型。
③ 识别出的表达式的值。
(3) 实验方法:可以选用以下两种方法之一。
① 自己编写分析程序。
② 利用YACC 自动生成工具。
2.实验分析和思考由于要求进行类型检查和求值,所以可以定义两个综合属性,一个记录值一个记录类型,存放在结构中,一并传入传出。
实验三-语义分析-实习报告

实验三语义分析一、实习目的通过上机实习,加深对语法制时翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法.二、实习要求采用递归下降语法制导翻译法对算术表达式、赋值语句、条件语句、循环语句进行语义分析生成四元式序列。
三、实习过程实习代码;/***JavaCC file*/options {JDK_VERSION = "1。
5”;static=false;}PARSER_BEGIN(whileParse)package whileparse;import java。
io.FileInputStream;import java。
io.FileNotFoundException;import java.util。
ArrayList;public class whileParse {public int count=0; /*四元式标号*/public static ArrayList<Sys〉sysList = new ArrayList<Sys〉();public int ncount=0;/*临时变量下标*/public static void main(String args[]) throws ParseException {FileInputStream fileStream;t ry {fileStream = new FileInputStream("data/test.c");whileParse parser = new whileParse(fileStream);System.out。
println("Reading from standard input。
.”);System。
out。
println("Enter c programe only main()with only while();\" :");try {switch (parser.start()){case 0:System。
河北工业大学语义分析实验报告

实验三语义分析程序实现一、实验设计在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法。
基本实验题目:对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。
语法制导翻译模式是在语法分析的基础上,增加语义操作来实现的,实际上是对前后文无关文法的一种扩展。
一般而言,首先需要根据进行的语义分析工作,完成对给定文法的必要拆分和语义动作的编写,从而为每一个产生式都配备相应的语义子程序,以便在进行语法分析的同时进行语义解释。
即在语法分析过程中,每当用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作之外,还要调用相应的语义子程序,以便完成生成中间代码、查填有关表格、检查并报告源程序中的语义错误等工作。
每个语义子程序需指明相应产生式中各个符号的具体含义,并规定使用该产生式进行分析时所应采取的语义动作。
这样,语法制导翻译程序在对源程序从左到右进行的一遍扫描中,既完成语法分析任务,又完成语义分析和中间代码生成方面的工作。
本实验要求从编译器的整体设计出发,重点通过对实验二中语法分析程序的扩展,完成一个编译器前端程序的编写、调试和测试工作,形成一个将源程序翻译为中间代码序列的编译系统。
二、程序代码在词法分析和语法分析的基础上,完成了语义的分析,同样采用了头文件的形式,在VC++6.0中运行#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#include<math.h>#include"cifa.h"#include"fenxibiao.h"# define PL 15 //+# define MI 16 //-# define MU 17# define DI 18#define acc 100#define MAXState 20#define NUMBER 9//表达式的个数#define MAXTEMP 10//最多临时变量的个数int State[MAXState];//状态栈int i=0;int CURRENTSTATE=0;//标识当前状态int LENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度int length;int index;//索引int Yes=0;//判断是否结束int tag=0;//判断是否需要调用词法程序//extern char * cifa();double e1,t4,f7;//整形char e12[20],t42[20],f72[20];//字符型int TEMP[MAXTEMP];int temp=0;int biaoshifu=0;FILE * fp;void REPORT_ERROR(){Yes=1;long f1=ftell(fp);char ch=fgetc(fp);fseek(fp,-1,1);printf("语法错误,第%d个字符'%C'处\n",f1,ch); }void Accept(){Yes=1;//printf("语法分析成功\n");}int INDEX(char a)//获取当前字符串对应的索引{int i;switch (a){case 'E':i=8;return(i);break;case 'T':i=9;return(i);break;case 'F':i=10;return(i);break;default: REPORT_ERROR();return(0);break;}}void Gen(int a,double i1,double i2,int t)//输出四元式{switch(a){case PL:printf("(+,%g,%g,%d)\n",i1,i2,t);break;case MI:printf("(-,%g,%g,%d)\n",i1,i2,t);break;case MU:printf("(*,%g,%g,%d)\n",i1,i2,t);break;case DI:printf("(/,%g,%g,%d)\n",i1,i2,t);break;default:break;}}void yuyi(int n)//语义子程序{switch(n){case 1:{temp++;//产生临时变量,Gen(PL,e1,t4,temp);e1=temp;break;}case 2:{temp++;//产生临时变量,TEMP[temp] Gen(MI,e1,t4,temp);e1=temp;break;}case 3:{e1=t4;break;}case 4:{temp++;Gen(MU,t4,f7,temp); t4=temp;break;}case 5:{temp++;Gen(DI,t4,f7,temp); t4=temp;break;}case 6:{t4=f7;break;}case 7:{f7=e1;break;}case 8:{f7=FCON;break;}default :printf("error\n");break;}}void Gen2(int a,char *i1,char *i2,int t)//输出四元式{switch(a){case PL:printf("(+,%s,%s,%d)\n",&i1,&i2,t);break;case MI:printf("(-,%s,%s,%d)\n",&i1,&i2,t);break;case MU:printf("(*,%s,%s,%d)\n",&i1,&i2,t);break;case DI:printf("(/,%s,%s,%d)\n",&i1,&i2,t); break;default:break;}}void fuzhi(char *a,char *b)//将数组b赋值给数组a {}void yuyi2(int n)//语义子程序{switch(n){case 1:{temp++;//产生临时变量Gen2(PL,e12,t42,temp);e12[0]=temp;break;}case 2:{temp++;//产生临时变量,TEMP[temp] Gen2(MI,e12,t42,temp);e12[0]=temp;break;}case 3:{//e12=t42;strcpy(e12,t42);break;}case 4:{temp++;Gen2(MU,t42,f72,temp); t42[0]=temp;break;}case 5:{temp++;Gen2(DI,t42,f72,temp); t42[0]=temp;break;}case 6:{//t42=f72;strcpy(t42,f72); break;}case 7:{//f72=e12;strcpy(f72,e12);break;}case 8:{//f72=TOKEN[0];strcpy(f72,TOKEN);break;}default :printf("error\n"); break;}}void INPUT(int a){index=a;int index2=0;if(Table[CURRENTSTATE][index]!=acc) {if (Table[CURRENTSTATE][index]==0)//报错{REPORT_ERROR();}elseif (Table[CURRENTSTATE][index]<20)//移近{ i++;State[i]=Table[CURRENTSTATE][index]; CURRENTSTATE=State[i];}else //规约{tag=1;length=LENGTH[Table[CURRENTSTATE][index]-20]; i=i-length;//指针回退switch(Table[CURRENTSTATE][index]-20){case 1:case 2:case 3:index2=8;break;case 4:case 5:case 6:index2=9;break;case 7:case 8:index2=10;break;default :REPORT_ERROR();break;}if (biaoshifu!=1)//不是标识符{yuyi(Table[CURRENTSTATE][index]-20);//规约调用语义子程序}else{yuyi2(Table[CURRENTSTATE][index]-20);//规约调用语义子程序}CURRENTSTATE=State[i];i++;State[i]=Table[CURRENTSTATE][index2];CURRENTSTATE=State[i];}}else{Accept();CURRENTSTATE=0;}}void main(){int res;State[0]=0;if((fp=fopen("b.txt","r"))==NULL) {printf("file open error!\n");exit(0);}else{res=cifa(fp);if(start==1)//文件以begin开始{do{res=cifa(fp);if(end==0){fseek(fp,-1,1);//文件指针回退一个*/。
编译原理语义分析实验报告 免费

编译原理综合训练语义分析实验报告指导老师:班级:学生:zeadom学号:学生:学号:2011/6/29目录语言文法的形式化描述 (3)语义规则 (3)运行环境介绍 (5)关键算法的流程图及文字解释 (5)1、本编译器的总框架 (5)2、在语义分析中的主要函数介绍 (5)3、产生布尔表达式 (7)4、While-do语句的语义分析 (8)5、词法、语法和语义分析的衔接 (8)测试报告 (8)附录 (12)语言文法的形式化描述(BNF范式)程序开始P->program i;SDn SC;定义语句SDn->SDSDn|nullSD->var int iSDTSDT -> null|,iSDT复合语句SC->begin Sn endSn->S;Sn||null单个语句S->SD|SA|SIF|SW|SC赋值语句SA->i:=E算术表达式E->cET|iET|(E)ETET->AE|CE|DE|null;C->+|-|*|/;布尔表达式B->EAEBT|NOT B|(B)BTBT->DB|nullA->>|<|=|>=|<=|<>D->AND|ORif语句SIF->if B then S SELSESELSE->null|else S2while语句SW->while B do S语义规则(属性文法)运行环境介绍运行环境是DEVC++Dev-C++是一个C&C++开发工具,它是一款自由软件,遵守GPL协议。
它集合了GCC、MinGW32等众多自由软件,并且可以取得最新版本的各种工具支持,而这一切工作都是来自全球的狂热者所做的工作,并且你拥有对这一切工具自由使用的权利,包括取得源代码等,前提是你也必须遵守GNU协议。
Dev-C++每一天都在进步着,因为它是一个自由软件。
编译原理_ 语义分析_实验报告

编译原理实验三语义分析实验报告◆学院:数学与计算机科学技术学院◆专业:计算机科学与技术◆班级:级计算机班◆小组组员:姓名:学号:姓名:学号:姓名:学号:姓名:学号:实验题目一、实验目的要求学生用与实验2相同的语言,编制语义分析程序。
二、实验准备微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL语言,或C++。
三、实验时间13学时四、实验内容要求学生用与实验2相同的语言,编制语义分析程序。
定义该语言的语义成分,将语义分析程序编制成子程序,在实验2分析出各语法单位后,分析其含义,并将可执行语句或表达式翻译为四元式输出,并将错误信息输出。
实验报告必须包括设计的思路,以及测试报告(输入测试例子,输出结果)。
五、上交文档1.实验报告(书面);2.程序文件(通过网络提交)。
<program> ::= <block> .<block> ::= <const-decl> <var-decl> <proc-decl> <statement><const-decl> ::= const <const-assignment-list> ; | ε<const-assignment-list> ::= <ident> = <number>| <const-assignment-list> , <ident> = <number><var-decl> ::= var <ident-list> ; |ε<ident-list> ::= <ident> | <ident-list> , <ident><proc-decl> ::= <proc-decl> procedure <ident> ; <block> ; |ε<statement> ::= <ident> := <expression>| call <ident>| begin <statement-list> end| if <condition> then <statement>| while <condition> do <statement>|ε<statement-list> ::= <statement> | <statement-list> ; <statement><condition> ::= odd <expression> | <expression> <relation> <expression><relation> ::= = | <> | < | > | <= | >=<expression> ::= <term> | <adding-operator> <term>| <expression> <adding-operator> <term><adding-operator> ::= + | -<term> ::= <factor> | <term> <multiplying-operator> <factor><multiplying-operator> ::= * | /<factor> ::= <ident> | <number> | ( <expression> )注意:(1) "ε" 表示空串。
(完整word版)语义分析实验报告(word文档良心出品)

软件学院实验卡和实验报告学号:xxxxxxxxxxx姓名:xxx年级专业班级:xxxxxxxxxxxxxxxxxxx xxx实验室组别:__ __ 实验日期:2xxx 年xx 月xxx 日附录1 程序功能1.1操作实例例如:对源程序begin a:=2+3*4;x:=(a+b)/c; end#进行判断;首先运行程序,程序出现提示:“请输入字符串,以#号结束:”,在光标处输入begin a:=2+3*4;x:=(a+b)/c; end#,回车,结果如图:程序给出了三地址码形式的四元式。
1.2 错误处理(1)如果用户在语句串开头处没有输入“begin ”,程序提示“缺少begin !”;如果用户没有输入“end ”,程序提示“end !错误”;(2)如果用户输入的语句串中缺少赋值符号(“:=”),程序提示“缺少赋值符号!”;(3)如果用户输入的语句串中“(”和“)”不匹配,程序提示“缺少“(”!”或“缺少“)!”。
2源程序#include<stdio.h>#include<string.h>#include <stdlib.h>char prog[80],token[8];char ch;int syn,p,m,n,sum;int kk=0,ii,N,nn=0;int k=0,t,i=0;char tt;char * keywords[6] = {"begin","if","then","while","do","end"}; //关键字表。
int scaner();int parser();int statement();int sentence();char *term();char *factor();char *expression();void emit(char *result,char *ag1,char *op,char *ag2);struct //四元式的结构。
编译原理实验报告语义分析

编译原理实验报告语义分析实验名称:语义分析实验目的:1.掌握词法分析器生成的词法单元序列的构造;2.学会设计语法分析器,实现对程序的基本语法结构检查,并生成抽象语法树;3.学习语义规约的实现,实现对程序的语义分析和错误检查;4.熟悉语义分析向语法分析的接口。
实验原理:语义分析是编译过程的一个重要环节,它的主要任务是对生成的抽象语法树进行遍历,并验证程序的类型一致性、语义规则的正确性、错误的检查和恢复等。
语义分析的输入是由语法分析生成的抽象语法树,输出是继续优化的抽象语法树或中间代码,以供后续的中间代码生成等工作使用。
实验步骤:1.设计语法分析器,包括语法规则、优先级关系等;2.生成词法单元序列;3.构建语法分析器,进行语法分析,并生成抽象语法树;4.针对不同的语义规约,设计语义动作,实现对程序的语义分析和错误检查;5.完成语义分析器的构建和测试。
实验设备:1.计算机;2. 编程语言:C++/Java/Python等;3. 开发环境:Visual Studio/ Eclipse/PyCharm等。
实验结果:通过对语法分析生成的抽象语法树进行遍历,实现了对程序的语义分析和错误检查。
具体实现包括:1.类型检查:根据语义规约,对程序中的类型进行检查,包括变量的声明及使用、函数的调用、赋值语句的一致性等;2.作用域检查:检查变量的作用域和可见性等;3.错误检查:检测语义错误,如变量未声明、函数重复定义等;4.错误恢复:当检测到错误时,采取适当的错误恢复措施,如跳过错误的部分继续分析、提示错误信息等。
实验心得:本次实验主要学习了语义分析的原理和实现方法,深入了解了编译过程中各个环节的作用和关系。
通过实践操作,加深了对语法分析和语义分析的理解,提高了编程能力和解决问题的能力。
同时,实验过程中也遇到了一些挑战和困难,例如语义规约的设计和实现、错误检查和恢复等,但通过查阅资料和与同学讨论,最终解决了这些问题。
通过本次实验,我对编译原理和语义分析有了更深入的了解,并且对以后的学习和工作有了更好的准备。
语义分析实验报告

语义分析实验报告语义分析实验报告引言语义分析是自然语言处理领域中的重要研究方向,旨在理解和解释文本中的意义。
它涉及词汇、句法和语义的分析,以便将文本转化为机器可理解的形式。
本实验报告旨在介绍我们进行的语义分析实验,并分析实验结果。
实验目的本次实验的主要目的是使用现有的语义分析工具和技术,对一组文本进行分析,以探索其在语义理解方面的效果和限制。
我们希望通过实验,深入了解语义分析的原理和应用。
实验设计我们选择了一组新闻文章作为实验对象,这些文章涵盖了不同主题和语境。
我们使用了一种基于深度学习的语义分析工具,该工具能够将文本转化为向量表示,并通过计算向量之间的相似度来衡量语义相关性。
我们将对比不同文章之间的相似度,并分析结果。
实验过程首先,我们将文本数据进行预处理,包括去除停用词、标点符号和数字,以及进行词形还原和词干提取等操作。
这样可以减少文本噪音,提高语义分析的准确性。
然后,我们使用语义分析工具对预处理后的文本进行处理,将其转化为向量表示。
这些向量表示可以捕捉到文本中的语义信息,并用于计算相似度。
接下来,我们对不同文章之间的相似度进行计算,并将结果进行可视化展示。
我们使用了一种常见的相似度度量方法,如余弦相似度等。
通过比较不同文章之间的相似度,我们可以发现它们之间的语义关联程度。
实验结果我们发现,在相同主题的新闻文章中,语义分析工具表现出较高的准确性和一致性。
相似主题的文章通常具有较高的相似度,而不同主题的文章则具有较低的相似度。
这表明语义分析工具能够有效地捕捉到文本的语义信息。
然而,在处理一些语义复杂或上下文模糊的文章时,语义分析工具的效果有所下降。
这可能是由于工具在处理复杂语义结构时存在一定的局限性。
此外,工具对于一些专业领域的术语和特定语境的理解也存在一定的困难。
讨论与展望本次实验结果表明,语义分析在理解文本意义方面具有一定的能力和局限性。
在未来的研究中,我们可以进一步改进语义分析工具,以提高其对复杂语义结构和专业领域的理解能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件学院实验卡和实验报告学号:xxxxxxxxxxx 姓名:xxx年级专业班xxx 实验室组别:__ __实验日期:2xxx 年XX 月xxx 日和关键字,词法分析阶段通常被忽略。
(2)扫描字符串,采用递归向下进行分析。
主要函数如下:a. scaner() //词法分析函数,char token[8]用来存放构成单词符号的字符串 ;b. parser() 〃语法分析,在语法分析的基础上插入相应的语义动作: 将输入串翻译成四元式序列。
只对表达式、赋值语句进行翻译。
c. emit(char *result,char *arg1,char *op,char *ag2) // 该函数功能是生成一个三地址语句返回四元式表中。
d. char *newtemp() //该函数返回一个新的临时变量名,临时变量名产生的顺序为 T1,T2,…。
四元式表的结构如下:struct {char result[8];char ag1[8]; char op[8]; char ag2[8];}quad[20];(3)输出为三地址指令形式的四元式序列。
例如:语句串 begin a:=2+3*4;x:=(a+b)/c;e nd# ,((接上页)实验步骤 方 法 关键代码记事评议综合成绩成绩评定平时成绩实验报告成绩指导教师签名:附录1 程序功能1.1 操作实例例如:对源程序begin a:=2+3*4;x:=(a+b)/c; en d# 进行判断;首先运行程序,程序出现提示:“请输入字符串,以#号结束:”,在光标处输入begin a:=2+3*4;x:=(a+b)/c; en d# ,回车,结果如图:程序给出了三地址码形式的四元式。
1.2错误处理(1)如果用户在语句串开头处没有输入“begin ”,程序提示“缺少begin !”;如果用户没有输入“ end”,程序提示“ end !错误”;(2)如果用户输入的语句串中缺少赋值符号(“:=”),程序提示“缺少赋值符号!(3)如果用户输入的语句串中“(”和“)”不匹配,程序提示“缺少“(””或“缺少“)!”2 源程序#include<stdio.h>#include<string.h>#include <stdlib.h>char prog[80],token[8];char ch;int syn,p,m,n,sum;int kk=0,ii,N,nn=0;int k=0,t,i=0;char tt;char * keywords[6] = {"begin","if","then","while","do","end"}; // 关键字表。
int scaner();int parser();int statement();int sentence();char *term();char *factor();char *expression();void emit(char *result,char *ag1,char *op,char *ag2);struct //四元式的结构。
{char resulted[8];char ag1ed[8];char oped[8];char ag2ed[8];}quad[20];void main(){p=0;printf(" 请输入字符串,以#号结束: \n");do{ scanf("%c",&ch); prog[p++]=ch;}while(ch != '#'); //没有遇到结束符,则首先调用scaner()进行词法分析,之后进行语义分析。
p=0;scaner();parser();}char * newtemp(void)//返回一个新的临时变量名,临时变量名产生的顺序为t1,t2,…。
{char * P;char M[8];P = (char *)malloc(8);k++;itoa(k,M,10);strcpy(P+1,M);P[0] = 't';return(P);}int parser() //在语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。
只对表达式、赋值语句进行翻译。
{int schain = 0;kk = 0;if(syn == 1){scaner();schain = sentence(); //调用语句串分析函数进行分析。
if(syn = 6) // “ end”。
{scaner();if(syn == 0 && (kk == 0))printf("success");}else{if(kk!=1)printf(” 缺end 错误");// 输出"end” 错误。
kk=1;}}else{printf("begin 错误");〃输出"begin” 错误。
kk=1;}return(schain);}int sentence() //语句串分析函数。
{int schain = 0;schain = statement(); // 调用语句分析函数进行分析。
while (syn == 26) // “ ; ”。
{scaner();schain = statement(); // 调用语句分析函数进行分析。
}return(schain);}int statement() // 语句分析函数。
{char tt[8],eplace[8];int schain = 0;switch(syn){case 10:strcpy(tt,token);scaner();if(syn == 18) //赋值语句。
{scaner();strcpy(eplace,expression());emit(tt,eplace,"","");schain = 0;}else{printf(" 缺少赋值号"); // 缺少“ :=”错误。
kk=1;}return(schain);break;char * expression(void){char * tp,* ep2,* eplace,* tt;tp = (char *)malloc(12); // 分配空间。
ep2 = (char *)malloc(12); eplace = (char *)malloc(12);tt = (char *)malloc(12);strcpy(eplace,term()); // 调用term 分析产生表达式计算的第一项eplace。
while(syn == 13 || syn == 14) // 加减。
}{ strcpy(tt,token); scaner();strcpy(ep2,term()); //调用term() 分析产生表达式计算的第二项ep2。
strcpy(tp,newtemp()); //调用newtemp() 产生临时变量tp 存储计算结果。
emit(tp,eplace,tt,ep2); //生成四元式送入四元式表。
strcpy(eplace,tp);} return(eplace);}char * term(void){char * tp,* ep2,* eplace,* tt; tp = (char *)malloc(12);ep2 = (char *)malloc(12); eplace = (char *)malloc(12);tt = (char *)malloc(12); strcpy(eplace,factor()); while(syn == 15 || syn == 16) // 乘除。
{ strcpy(tt,token); scaner();strcpy(ep2,factor()); strcpy(tp,newtemp());emit(tp,eplace,tt,ep2); strcpy(eplace,tp);} return(eplace);char * factor(void){char * fplace;fplace = (char *)malloc(12); strcpy(fplace," ");if(syn == 10) // 字母。
{strcpy(fplace,token);scaner();}else if (syn == 11) //数字。
{ itoa(sum,fplace,10); scaner();}else if(syn == 27) //“ ( ”。
{scaner();strcpy(fplace,expression());if(syn == 28) //有“ )”。
scaner();else{printf("')'错误”);// 只有“(”,缺少“)”。
kk=1;}}else{printf("'(' 错误");kk=1;} return(fplace);}void emit(char * result,char * ag1,char * op,char * ag2) //生成一个三地址码并返回到四元式代码中。
{strcpy(quad[nn].resulted,result); strcpy(quad[nn].ag1ed,ag1); strcpy(quad[nn].oped,op);strcpy(quad[nn].ag2ed,ag2);printf("(%d) %s=%s%s%s\n", nn+1,quad[nn].resulted,quad[nn].ag1ed,quad[nn].oped,quad[nn].ag2ed);nn++;}scaner() // 此函数为词法分析。
{for(n=0;n<8;n++) token[n]=NULL;ch=prog[p++]; m=0;while(ch==' ') ch=prog[p++] ;if((ch>='a') && (ch<='z')) // 判断是否是字母。
{ while((ch>='a') && (ch<='z') || (ch>='0') && (ch<='9')) // 判断下一个是否是字母或数字。