首页 > 编程知识 正文

层次分析法简单例题,教学分析

时间:2023-05-06 00:04:09 阅读:156360 作者:520

title:简字句分析器的实现

date :2018-10-082:15:26

updated :2018-10-0823:15336026

描述:简字句分析器的实现_编译原理的实现

categories:必修

photo:

tags:

编译原理

music-id: 415793869

密码:

math:一.实验题目用C或C语言编写简单的词法分析程序,扫描C语言混蛋集的源程序,根据给定的词法规则识别单词,填写相应的表。 如果发生词法错误,则显示错误消息、位置,并尝试从错误中恢复。 简单的恢复方法是忽略该字符(或单词)并重新开始扫描。

2 .词法分析规则:标识符:=字母

标识符:=标识符字母

标识符:=标识符号

无符号整数:=数字

无符号整数:=数字序列数字

数字序列:=数字序列数字

数字序列:=数字

字母:=a|b|c|……|x|y|z

数字:=0|1|2|3|4|5|6|7|8|9

加法运算符:=|-

乘法运算符:=*|/

关系运算符:=||!=|=|=|=|=

分隔符:=,|; |(|)|{|}

保留字:3360=main|int|if|else|while|do

三.任务实现1 .根据给定的词法规则,识别单词并填写相应的表格。

2 .忽略空格并评论

3 .发生词法错误时,显示错误信息、位置,尝试从错误中恢复。

四.实现流程1 .读完空格后跳过,读下一个字; 如果阅读字母,请阅读它既不是字母,也不是数字,也不是下划线,然后将所读内容写入token数组。

2 .阅读数字时,将阅读的内容写入token数组,直至不再是数字或小数点;

3 .读取||=时,读取下一位,=时,运算符=|=|==,其他字符返回|=的类别代码; 读/时读下一位,*时说明注释内容,读*直至读完,判断下一位是否为/,注释结束时不再继续读下一位; n读取时,将行数加1,如果读取的字符与上述不一致,则报告错误,并输出错误行数。

五、类别代码:单词符号类别代码单词符号类别代码# 018 num1- 19 letter2* 20 main3/21if4=22 else 523 do6=24 while 725 for8=26 swtich 9; 27 case 10 ' 28 int 1129 double 1230 float 13/* 31 long 14 */32 void 15 { 33 } 34 (17六.代码实现# include bits/stdc.husingnamer cc char token[12]; char in[105]; FILE *fin,*fout; int cnt=0,token_num=0; int row=1; 输入标志=0; char ch; //关键字constcharkeyword [ 13 ] [ 20 ]={ ' main ',' if ',' else ',' do ',' while ',' for ',' switch ',' case ' for(I=0; i 12; I ) {token[i]=NULL; }}int judge_token () {init_token ); if(flag==0) ch=getc(fin ); ) }flag=1; while(ch==''|ch=='t'||ch=='n ' ) if ) ch=='n ' ) row; (ch=getc(fin ); }token_num=0; if(ch='a'ch='z ' )|(ch='a'ch=' z ' ) ) /标识符或变量名称while ) ) ch=' a ' ch=' z '|) ch=' a ' ch ) }token[token_num ]=' '; for(intI=0; i 13; I ) if(strcmp(Token,keyWord[i] )==0) )/3是关键字return 3; (//2是标识符return 2; (/)是数字elseif(ch='0'ch='9' ) (while ) )0'ch='9' )|| ch=='.' ) (token ) token_num ) ) ch ch=}return 1; }else{token[token_num ]=ch; sitch(ch ) ) case ) (:ch=getc(fin ); return 16 case ' ' : ch=getc (fin ); return 17 case ' { ' : ch=getc (fin ); 返回33; case'}':ch=getc(fin ); 返回34; case'':ch=getc(fin; if(ch==' ' ) ) {token[token_num ]=ch; ch=getc(fin; 返回29 } else {返回18; }case'-':ch=getc(fin ); if(ch=='-' ) {token[token_num ]=ch; ch=getc(fin; 返回30 } else {返回19; }case'*':ch=getc(fin ); if(ch=='/' ) {token[token_num ]=ch; ch=getc(fin; 返回32; }else{return 20; }case'/':ch=getc(fin ); if(ch=='*'(Token[Token_num]=ch; ch=getc(fin; 返回31; }else{ return 21; //在此重新编码case'=':ch=getc(fin )。 if(ch=='=' ) ({token[token_num ]=ch; ch=getc(fin; 返回23; }else{return 22; }case'':ch=getc(fin ); if(ch=='=' ) ({token[token_num ]=ch; ch=getc(fin; 返回24; }else{return 23; }case'':ch=getc(fin ); if(ch=='=' ) ({token[token_num ]=ch; ch=getc(fin; 返回26; }else{return 25; }case ';' :ch=getc(fin ); return 27 case'''3360ch=getc(fin ); 返回28; case '! ' 3360ch=getc(fin; if(ch=='=' ) ({token[token_num ]=ch; ch=getc(fin; 返回37; }else{return 36; }case'#':ch=getc(fin ); 返回- 2; case ',' :ch=getc(fin ); 返回35; case EOF: return -1; efault:ch=getc(fin; 返回10; }}}void getWord () {int temp; while(1) {temp=judge_token; if(temp==-1 ) {break; }switch(temp ) {case -10:cout '行' row '发生错误。 ' endl; 黑; default:cout''temp ',' token''endl; 黑; }}}int main () fin=fopen ) ' compiler.txt ',' r ' ); getWord (; 返回0; (七)样本结果样本:

结果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。