编译原理词法分析器和语法分析器(急急急)_第1页
编译原理词法分析器和语法分析器(急急急)_第2页
编译原理词法分析器和语法分析器(急急急)_第3页
编译原理词法分析器和语法分析器(急急急)_第4页
编译原理词法分析器和语法分析器(急急急)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理实验报告词法分析器实验目的熟练掌握词法分析程序的基本原理掌握词法分析程序的设计和实现实验内容针对一个简化的C语言子集完成对它的词法分析程序的设计与实现C语言子集的单词符号挤内码值程序代码:#include"stdio.h"#include"string.h"inti,j,k;chars;chara[20],token[20];intletter(){ if((s>=97)&&(s<=122)) return1; elsereturn0;}intdigit(){if((s>=48)&&(s<=57)) return1; elsereturn0;}voidget(){ s=a[i];i=i+1;}voidretract(){i=i-1;}intlookup(){ if(strcmp(token,"while")==0)return1; elseif(strcmp(token,"if")==0)return2; elseif(strcmp(token,"else")==0)return3; elseif(strcmp(token,"switch")==0)return4; elseif(strcmp(token,"case")==0)return5; elsereturn0;}voidmain(){printf("输入源程序,结束用'#':\n"); i=0; do{i++; scanf("%c",&a[i]); }while(a[i]!='#'); i=1; memset(token,0,sizeof(char)*20); j=0; get(); while(s!='#') {if(s=='') get(); else {switch(s){ case'a': case'b': case'c': case'd': case'e': case'f': case'g': case'h': case'i': case'j': case'k': case'l': case'm': case'n': case'o': case'p': case'q': case'r': case's': case't': case'u': case'v': case'w': case'x': case'y': case'z': while(letter(s)||digit(s)) {token[j]=s; j++; get(); } retract(); k=lookup(); if(k==0)printf("(%d,%s)\n",6,token); elseprintf("(%d,unll)\n",k); break; case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': while(digit(s)){ token[j]=s; j=j+1; get(); } retract(); printf("(%d,%s)\n",7,token); break; case'+':printf("(+,null)\n"); break; case'-':printf("(-,null)\n"); break; case'*':printf("(*,null)\n"); break; case'<': get(); if(s=='=') printf("(relop,LE)\n"); else{ retract(); printf("(relop,LT)\n"); } break; case'=': get(); if(s=='=')printf("(relop,EQ)\n"); else{ retract(); printf("(=,null)\n"); } break; case';':printf("(;,null)\n"); break; default:printf("(%c,error)\n",s); break; } memset(token,0,sizeof(char)*10); j=0; get(); } }}运行结果:编译原理实验报告语法分析器实验目的熟练掌握语法分析程序的基本原理掌握用算符优先分析法来构造,设计优先函数掌握语法分析程序的设计与实现实验内容针对一个简单文法完成对它的语法分析程序的设计与实现通过语法分析程序来完成多输入的算数表达式进行计算并相应得到的对应四元式程序代码:#include<stdio.h>chara[20],optr[10],s,op;inti,j,k,opnd[10],x1,x2,x3;intoperand(chars){ if((s>='0')&&(s<='9')) return1; else return0;}intf(chars){ switch(s) { case'+':return6; case'-':return8; case'*':return10; case'/':return12; case'(':return2; case')':return12; case'#':return2; default:printf("error!\n"); }}intg(chars){ switch(s) { case'+':return5; case'-':return7; case'*':return9; case'/':return11; case'(':return13; case')':return2; case'#':return2; default:printf("error!\n"); }}voidget(){ i=i+1; s=a[i]; }voidmain(){ printf("请输入算数表达式,以'#'结束:\n");i=0;do{ i=i+1; scanf("%c",&a[i]);}while(a[i]!='#');i=0;j=0;k=0;optr[j]='#';get();while((optr[j]!='#')||(s!='#')){ if(operand(s)) { opnd[k]=s-'0'; k=k+1; get(); } elseif(f(optr[j])>g(s)) { op=optr[j]; j=j-1; x2=opnd[k-1]; x1=opnd[k-2]; k=k-2; switch(op){ case'+':x3=x1+x2;break; case'-':x3=x1-x2;break; case'*':x3=x1*x2;break; case'/':x3=x1/x2;break; } opnd[k]=x3; k=k+1; printf("(%c,%d,%d,%d)\n",o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论