




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学号:201310510112 姓名:张旸 日期:2016年4月1日实验内容:词法分析实验要求:1、待分析的简单的词法(1)关键字: begin if then while do end所有的关键字都是小写。(2)运算符和界符: = + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通
2、常被忽略。2、 各种单词符号对应的种别码:单词符号种别码 单词符号种别码bgin1:17If2:=18Then3<20wile4<>21do5<=22end6>23Lettet(letter|digit)*10>=24dight dight*11=25+13;2614(27*15)28/16#03、 词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。例如:对源程序begin x:=9: if x>9 then x:=2
3、*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)状态转换图:实验代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define _KEY_WORD_END "waiting for your expanding"typedef structint typenum;char * word;WORD;char input225;char token225=""int
4、 p_input;int p_token;char ch;char * rwtab="begin","if","then","while","do","end",_KEY_WORD_END;WORD* scaner();void main()int over = 1;WORD* oneword=new WORD;printf("Enter Your words(end with #):");scanf("%#s",input);p_in
5、put=0;printf("Your words:n%sn",input);while(over<1000&&over!=-1)oneword=scaner();if(oneword->typenum<1000)printf("(%d,%s)",oneword->typenum,oneword->word);over=oneword->typenum;printf("npress # to exit:");scanf("%#s",input);char m_get
6、ch()ch=inputp_input;p_input=p_input+1;return(ch);void getbc()while(ch=' '|ch=10)ch=inputp_input;p_input=p_input+1;void concat()tokenp_token=ch;p_token=p_token+1;tokenp_token='0'int letter()if(ch>='a'&&ch<='z'|ch>='A'&&ch<='Z'
7、;)return 1;else return 0;int digit()if(ch>='0'&&ch<='9')return 1;else return 0;int reserve()int i=0;while(strcmp(rwtabi,_KEY_WORD_END)if(!strcmp(rwtabi,token)return i+1;i=i+1;return 10;void retract()p_input=p_input-1;char* dtb()return NULL;WORD*scaner()WORD*myword=new W
8、ORD;myword->typenum=10;myword->word=""p_token=0;m_getch();getbc();if(letter()while(letter()|digit()concat();m_getch();retract();myword->typenum=reserve();myword->word=token;return(myword);else if(digit()while(digit()concat();m_getch();retract();myword->typenum=20;myword->
9、word=token;return(myword);else switch(ch)case'=':m_getch();if(ch='=')myword->typenum=39;myword->word="="return(myword);retract();myword->typenum=21;myword->word="="return(myword);break;case'+':myword->typenum=22;myword->word="+"
10、return(myword);break;case'-':myword->typenum=23;myword->word="-"return(myword);break;case'*':myword->typenum=24;myword->word="*"return(myword);break;case'/':myword->typenum=25;myword->word="/"return(myword);break;case'('
11、:myword->typenum=26;myword->word="("return(myword);break;case')':myword->typenum=27;myword->word=")"return(myword);break;case'':myword->typenum=28;myword->word=""return(myword);break;case'':myword->typenum=29;myword->word=
12、""return(myword);break;case'':myword->typenum=30;myword->word=""return(myword);break;case'':myword->typenum=31;myword->word=""return(myword);break;case',':myword->typenum=32;myword->word=","return(myword);break;case
13、9;:':myword->typenum=33;myword->word=":"return(myword);break;case'':myword->typenum=34;myword->word=""return(myword);break;case'>':m_getch();if(ch='=')myword->typenum=37;myword->word=">="return(myword); retract(); mywo
14、rd->typenum=35;myword->word=">"return(myword);break;case'<':m_getch();if(ch='=')myword->typenum=38;myword->word="<="return(myword); retract(); myword->typenum=36;myword->word="<"return(myword);break;case'!':m_getch()
15、;if(ch='=')myword->typenum=40;myword->word="!="return(myword); retract(); myword->typenum=-1;myword->word="ERROR"return(myword);break;case'0':myword->typenum=1000;myword->word="OVER"return(myword);break;default:myword->typenum=-1;myw
16、ord->word="ERROR"return(myword);实验结果:学号:201310510112 姓名:张旸 日期:2016年5月12日实验内容:语法分析实验要求:利用C语言编制递归下降分析程序,并对简单语言进行语法分析。程序名称:LR分析程序 课本P88页例题4.17 表4.16实验题目:对下列文法 (1) S -> Sb (2) S -> bAa (3) A -> aSc (4) A -> aSb (5) A -> a LR(0)分析表 | | | | | | | | a | b | c | # | S | A | 0 | |
17、 S2 | | | 1 | | 1 | | S3 | | ACC | | | 2 | S5 | | | | | 4 | 3 | | R1 | R1 | R1 | | | 4 | S6 | | | | | | 5 | R5 | S2 | | | 7 | | 6 | | R2 | R2 | R2 | | | 7 | | S9 | S8 | | | | 8 | R3 | | | | | | 9 | R4 | R1 | R1 | R1 | | |实验代码:#include "stdio.h"#include "string.h"#include "st
18、dlib.h"#define size 20#define size_s 10 #define size_a 4 #define size_g 2 #define size_ge 5 #define MAXSIZE 3typedef struct Gechar head; char gen4; Generate;typedef struct Aint stsize_a; int resize_a; Action;typedef struct Gchar headsize_g; int gtsize_g; GOTO;int statussize; int sta_Index; char
19、 symbolsize; int sym_Index; char expressionsize; int exp_Index; int exp_top; int step; int IsAccept = 0; Generate genesize_ge +1; Action actsize_s; GOTO gosize_s; void GOTOTable(int sta, char symb);void Syntax(void)printf("-SLR(1) Analysis Program - n");printf(" (1)S -> Sbn (2)S -&
20、gt; bAan (3)A -> aScn (4)A-> aSbn (5)A-> an ");printf("-n");void InputExpression(void)char ch;printf("请输入分析串");printf("包括:a b c #以'#'结束:n");exp_Index = 0;do scanf("%c",&ch);if (ch!='a') &&(ch!='b') &&(c
21、h!='c')&&(ch!='#')printf("Illegal Word inside.Press any key to EXIT!n");getchar();exit(0);expressionexp_Index+=ch;while(ch!='#'); printf("-Valid Analysis String-n");getchar();void PrintStatus(void)int i = 0;for(i = 0; i <= sta_Index; i+)printf(&
22、quot;%d", statusi);printf("tt");void PrintRestExp(void)int i = 0;for(i = 0; i < exp_top; i+)printf(" ");for(i = exp_top; i <= exp_Index; i+)printf("%c", expressioni);printf("tt");void Format()printf("步骤 t 状态栈 t符号栈 t 剩余输入串 t 动作n");void Init
23、lize(void)gene1.head = 'S'strcpy(gene1.gen,"Sb");gene2.head = 'S'strcpy(gene2.gen,"bAa");gene3.head = 'A'strcpy(gene3.gen,"aSc");gene4.head = 'A'strcpy(gene4.gen,"aSb");gene5.head = 'A'strcpy(gene5.gen,"a");act
24、0.st1 = 2;act1.st1 = 3;act2.st0 = 5; act3.re1 = 1; act3.re2 = 1; act3.re3 = 1;act4.st0 = 6;act5.re0 = 5;act5.st1 = 2;act6.re1 = 2; act6.re2 = 2; act6.re3 = 2;act7.st1 = 9;act7.st2 = 8;act8.re0 = 3;act9.re0 = 4; act9.re1 = 1; act9.re2 = 1; act9.re3 = 1;go0.head0 = 'S'go0.gt0 = 1;go2.head1 = &
25、#39;A' go2.gt1 = 4;go5.head0 = 'S'go5.gt0 = 7;sta_Index = 0; statussta_Index = 0; step = 1; sym_Index = 0; symbolsym_Index = '#' IsAccept = 0; exp_top = 0; void Reduce(int sta, char symb,int col)int i = 0;for(i = 0; i < strlen(geneactsta.recol.gen); i+)symbolsym_Index- = '
26、0'symbol+sym_Index = geneactsta.recol.head;for(i = 0; i < strlen(geneactsta.recol.gen) ; i+)statussta_Index - i = '0'sta_Index -= i; GOTOTable(statussta_Index, symbolsym_Index);void ActionTable(int sta, char symb,int col)if(sta = 1 && col = 5)printf("(Accept)n");IsAc
27、cept = 1;return;if(actsta.stcol != 0)printf("Actionn");status+sta_Index = actsta.stcol;symbol+sym_Index = symb;exp_top +;else if(actsta.recol != 0)printf("Reducen");Reduce(sta, symb, col);elseprintf("(error)n");getchar();exit(1);void GOTOTable(int sta, char symb)int i =
28、 0;for(i = 0; i < size_s; i+)if(gosta.headi = symb)status+sta_Index = gosta.gti;return;void Launch(void)int s = statussta_Index;char exp = expressionexp_top;char sym = symbolsym_Index;while(IsAccept != 1)s = statussta_Index;exp = expressionexp_top;sym = symbolsym_Index;printf("%dt ",ste
29、p+);PrintStatus();printf(" %stt", symbol);PrintRestExp();switch(exp)case 'a':ActionTable(s, exp, 0); break;case 'b':ActionTable(s, exp, 1);break;case 'c':ActionTable(s, exp, 2);break;case '#':ActionTable(s, exp, 3);break;int main()Syntax();InputExpression();
30、Initlize();Format();Launch();getchar();return 1;实验结果:正确:错误:非法:学号:201310510112 姓名:张旸 日期:2016年5月27日实验内容:语义分析·中间代码生成实验要求: 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。1、在gencode函数中补充数据类型转换;2、增加double数据类型的计算。注意:(1)输入 变量定义,要求不换行输入; (2)在第(1)步输入结束后换行,再输入算法表达式的后缀表达式,换行; (3)运行后得到转换后的四元式中间代码int a,
31、b;float c;char d;实验代码:#include<process.h>#include<stdio.h>#include<string.h>typedef struct char name10; char type;sem,*ptsem;typedef structptsem* base;int utop; stack ;int i=1;int j=0;int n=0;stack list;char st10,str110,*p;ptsem yylist=new sem10;void initlist() list.base=new ptsem1
32、00; list.utop=0; void pop( ptsem &pt) pt=list.baselist.utop-; return; void push(ptsem pt) list.base+list.utop=pt; return; void gencode(ptsem top,ptsem subtop,char w) ptsem pt=new sem; if(top->type=subtop->type) else if(top->type='i'&subtop->type='r') printf("
33、(FLOAT,%s,t%d);n",top->name,i); char c=i+48; top->name0='t' top->name1=c; top->name2='0' top->type='r' i+; else if(top->type='r'&subtop->type='i') printf("(FLOAT,%s,t%d);n",subtop->name,i); char c=i+48; subtop->nam
34、e0='t' subtop->name1=c; subtop->name2='0' subtop->type='r' i+; if(top->type=subtop->type) else if(top->type='i'&subtop->type='d') printf("(DOUBLE,%s,t%d);n",top->name,i); char c=i+48; top->name0='t' top->name
35、1=c; top->name2='0' top->type='d' i+; else if(top->type='d'&subtop->type='i') printf("(DOUBLE,%s,t%d);n",subtop->name,i); char c=i+48; subtop->name0='t' subtop->name1=c; subtop->name2='0' subtop->type='d'
36、; i+; printf("(%c,%s,%s,t%d);n",w,subtop->name,top->name,i); char c=i+48; pt->type=top->type; pt->name0='t' pt->name1=c; pt->name2='0' i+; push(pt); return; void identify() while(*p>='a'&&*p<='z') stj+=*p+; stj='0'
37、j=0; int flag=0;if(!strcmp(st,"float")|!strcmp(st,"int")|!strcmp(st,"char")|!strcmp(st,"double")flag=1; if(flag=1)strcpy(str1,st);return; sem pp; if(!strcmp(str1,"float") strcpy(,st); pp.type='r' if(!strcmp(str1,"int") strcpy
38、(,st); pp.type='i' if(!strcmp(str1,"double") strcpy(,st); pp.type='d' if(!strcmp(str1,"char") strcpy(,st); pp.type='c' if(strcmp(str1,"float")&&strcmp(str1,"int")&&strcmp(str1,"char")&&
39、amp;strcmp(str1,"double") printf("the identify is not defined"); getchar(); exit(0); yylistn+=pp; void conid()ptsem pt=new sem;int flag=0,k=0;do pt->namek+=*p;if(*p+='.')flag=1;while(*p>='0'&&*p<='9'|*p='.'); pt->type=flag?'
40、r':'i' if(*p>'9'&&*p<'0') printf("the const data you inputed is wrong"); getchar(); exit(0); pt->namek='0' push(pt);void varid()ptsem pt=new sem;int flag=0,k=0;dopt->namek+=*p+;while(*p>='a'&&*p<='z'|*p&g
41、t;='A'&&*p<='Z');pt->namek='0'for(int i=0;i<n;i+)if(!strcmp(pt->name,)flag=1;pt->type=yylisti.type;push(pt); if(flag=0)printf(" " %s" is not defined!",pt->name);getchar();exit(0);void main() initlist(); printf("ni
42、nput define var:n"); char str100; gets(str); p=str; while(*p!='0') if(!(*p>='a'&&*p<='z'|*p>='A'&&*p<='Z'|*p=''|*p=' '|*p=',') printf("this define is wrong!"); getchar(); exit(0); switch(*p) ca
43、se ',':p+;break; case ' ':p+;break; case '': p+;strcpy(str1,"");break; default: identify(); char strpds100; printf("input post expression:n"); gets(strpds); printf("the gencode result:n"); p=strpds; char ch=*p,a; ptsem top,subtop; while(*p!='
44、0') if(ch>='0'&&ch<='9')a='0' else if(ch>='a'&&ch<='z'|ch>='A'&&ch<='Z')a='1' else if(ch='+'|ch='-'|ch='*'|ch='/'|ch='')a='2' else if(ch='
45、')break; else if(ch=' ')a='4' else a='3' switch(a) case'0':conid();ch=*p;break; case'1':varid();ch=*p;break; case'2':pop(top);pop(subtop);gencode(top,subtop,ch);ch=*+p;break; case'3':printf("%c is a illegal letter!n",ch);getchar();getchar();exit(0); case'4':ch=*+p; if(*p!='0') printf("this setense is illegal!&qu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中职英语课程教学计划的评估与反馈
- 2025年小学科学实验室可持续发展计划
- 幼儿园儿童诗歌朗诵计划
- 2025年特殊教育学校德育策略计划
- 2025年教育心理学读书计划
- 2024届云南省曲靖市沾益区播乐乡罗木中学中考数学模拟试题含解析
- 2024届西藏拉萨市达孜县中学初中数学毕业考试模拟冲刺卷含解析
- 八年级历史学期教学安排计划
- 体育课程新标准推广计划
- 2024-2025学年学校信息化教学计划
- 一方出资金一方出资源合作协议范本
- 中班禁毒安全《罂粟的危害》
- 教科版(2017)小学科学三年下册《物体在斜面上运动》说课(附反思、板书)课件
- 医院护理培训课件:《根本原因分析-RCA-从错误中学习》
- 合同及形式发票
- 统编版选择性必修3《逻辑与思维》背诵手册-高二政治新教材(选择性必修)
- 公共行政学:管理、政治和法律的途径
- 高龄孕妇管理
- 2023北斗全球导航卫星系统(GNSS)高精度导航型天线通用规范
- 活性炭滤池施工方案
- 木模木支撑施工方案
评论
0/150
提交评论