编译原理实习设计——词法分析程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
break; case '[': str= "$Lmid"; break; case ']': str= "$Rmid"; break; case '{': str= "$Lbig"; break; case '}': str= "$Rbig"; break; default: break; } return str; } void WriteBuffer() { char tmpch=' '; int i=0; long pos; WordEnd=0; for(int t=0; t<Max*2; t++) { Buffer[t]=NULL; } while(i<Max) { ch=fgetc(fprogram); if(ch!=EOF) { if(ch=='\n' || ch=='\t' || ch==' ') { ch=' '; } if( !(tmpch==' ' && ch==' ') )
else { pos=ftell(fprogram); fseek(fprogram, pos-1,0); break; } } } else { break; } } } } char Get_ch(int j) { return Buffer[j]; } void Output(char id[], char string[]) { fprintf(foutput,"%s %s\n", id,string); }
if(c=='>' || c=='"') { Output("$ID", string); for(int p=0; p<k; p++) { string[p]=NULL; } break; } else if( c=='.' || IsLetter(c) IsDigit(c) ) { string[k++]=c; } } break; } j++; } c=Get_ch(++j); } if(IsLetter(c) || c=='_') { k=0; string[k++]=c; j++; while(1) { c=Get_ch(j); if(IsLetter(c) || c=='_' || IsDigit(c)) { string[k++]=c; } else { if(IsKeyword(string) ) { Output("$keyword", string); }
ch=='\r') { break; } else { pos=ftell(fprogram); fseek(fprogram, pos-1,0); break; } } } else { break; } } } if(ch=='=' || ch=='+' || ch=='-' || ch=='*' || ch=='&' || ch=='^' || ch=='%' || ch=='<' || ch=='>' ) { while(1) { ch=fgetc(fprogram); if(ch!=EOF) { if(ch=='=' || ch=='+' || ch=='-' || ch=='*' || ch=='&' || ch=='^' || ch=='%' || ch=='<' || ch=='>' ) { Buffer[i]=ch; i++; WordEnd=1; } else { if(ch==' ' || ch=='\t' || ch=='\n' || ch=='\r' )
} return 0; } void Proccess() { int i,j=0; char c; char string[Max]; for(int q=0; q<Max; q++) { string[q]=NULL; } WordEnd==1 ? i=Max*2 : i=Max; while(j<i) { int k=0; c=Get_ch(j); if(c=='#') { j++; while(1) { c=Get_ch(j); if(IsLetter(c) ) { string[k++]=c; } else if(c=='<' || c=='"') { Output("$ID", string); for(int p=0; p<k; p++) { string[p]=NULL; } k=0; while(1) { c=Get_ch(++j);
if((ch=fgetc(fprogram))==EOF) { break; } } } else { break; } } Buffer[i]=ch; i++; } tmpch=ch; } else { break; } } if( IsDigit(ch) || IsLetter(ch) || ch=='.' || ch=='E' || ch=='e' || ch=='-') { while(1) { ch=fgetc(fprogram); if(ch!=EOF) { if(IsDigit(ch) || IsLetter(ch) || ch=='.' || ch=='E' || ch=='e' || ch=='-') { Buffer[i]=ch; i++; WordEnd=1; } else { if(ch==' ' || ch=='\t' || ch=='\n' ||
int IsKeyword(char string[]) { char *KeyWords[]={"auto","double","int","struct","break", "else","long","switch","case","enum","register","typedef" "char","extern","return","union","const","float","short", "unsigned","continue","for","signed","void","default","go "sizeof","volatile","do","if","while","static","main"}; for(int i=0; i<33; i++) { if(strcmp(string, KeyWords[i])==0) { return 1; }
编译原理实习设计 词法分析程序
一.实习目的 构造一个小语言的词法分析程序。 二.实习要求 设计一个包含简单算术表达式、赋值语句、IF语 句的小语言的文法。 根据此文法,构造一个词法分析程序,输入 以“#”为结束符的源程序,输出为各类单词表和 单词串文件。 源程序和输出的单词串均以文件的形式存放。
{ break; } else { pos=ftell(fprogram); fseek(fprogram, pos-1,0); break; } } } else { break; } } } if(ch=='\\') { while(1) { ch=fgetc(fprogram); if(ch!=EOF) { if(ch=='n' || ch=='t' || ch=='\\' || ch=='v' || ch=='b' || ch=='f' || ch=='r' ) { Buffer[i]=ch; i++; WordEnd=1; } else { if(ch==' ' || ch=='\t' || ch=='\n' || ch=='\r') { break; }
图三:实数的识别
} 27 { * 26 * 25 ] * 24 [ * 23 ( * 22 ) * 21 ; *
20 , * * | 19 18 非| 17 | * * 16 & 15 非& 14 & * = 13 * 12 非= 11 = * 10 # * 9 = * 8 非= 7 %
* 6 ^ * 5 = * 4 非= 3 ! * 2
{ if(ch=='/') { ch=fgetc(fprogram); if(ch!=EOF) { if( ch=='*') { char flo; while(1) { ch=fgetc(fprogram); if(ch!=EOF) { if(ch=='*') { flo=ch; ch=fgetc(fprogram); if(ch==EOF) { break; } if(ch=='/') { ch=fgetc(fprogram); break; } } } else { break; } } } else { pos=ftell(fprogram); fseek(fprogram, pos-2,0);
“双引
* 1
‘单引
空白
0
图四:界符和算符的识别(1)
2.单词符号对照表
单词符号 标志符 整数 浮点数 关键字 ‘ “ ! 助记符 $ID $Int $FLOAT $KeyWord $Syin $Yinhao $Not 内码值 字符串值 数值 数值 字符串值 百度文库 “ !
!= ^ % %= = == && & | || , ; ( ) [ ] { } + ++ += - ―― -= * *= / /=
FILE *fprogram; FILE *foutput; int WordEnd; char Buffer[Max*2]; char ch; int IsLetter(char ch) { if( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z') ) { return(1); } else { return(0); } } int IsDigit(char ch) { if(ch>='0' && ch<='9') { return(1); } else { return(0); } } char *Par(char par, char *str) { switch (par) { case '(': str="$Lpar"; break; case ')': str= "$Rpar";
$NotQU $Weiyu $GESHICONTROL $mo-EQ $EQU $ EQ $and $Wyu $Whuo $Or $douhao $fenhao $Lpar $Rpar $Lmid $Rmid $Lbig $Rbig $Plus $Plus-Plus $Plus-EQ $dec $dec-dec $dec-EQ $Mul $Mul-EQ $Div $Div-EQ
单词的自身值均为其对应的表的指针,如标识 符表的指针、常数表的指针等。 提交实习报告和程序运行结果。
三.相关图表 1.状态转换图
空白 0 字母 非字母与数字 1 2 * 图一:标志符和关键字的识
数字 空白 数字 非数字 2 * 0 1
图二:整数的识别
数字 数字 * E或D 其他 数字 E或D +或数字 * 其他 数字 数字 1 1 6 数字 7 5 4 3 2 0
!= ^ % %= = == && & | || , ; ( ) [ ] { } + ++ += - ―― -= * *= / /=
四.源程序和结果 1.分析器程序
#include <stdio.h> #include <stdlib.h> #include <string.h> #define Max 120
||
else { Output("$ID", string); } for(int i=0; i<k; i++) { string[i]=NULL; } break; } j++; } } if(IsDigit(c) ) { k=0; string[k++]=c; j++; while(1) { c=Get_ch(j); if(IsDigit(c) || c=='-' || c=='e' || c=='E' || c=='.') { string[k++]=c; } else { Output("$Digit", string); for(int i=0; i<k; i++) { string[i]=NULL; } break; } j++; } } if(c==';')