第一范文网 - 专业文章范例文档资料分享平台

编译原理实验报告 (2)

来源:用户分享 时间:2020-05-04 本文由深山夕照深秋雨 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

图1 识别表I所列语言中的部分单词的DFA及相关的语义过程

图1及程序一中所出现的语义变量及语义函数的含义和功能说明如下。

函数GETCHAR:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。

字符数组TOKEN:用来依次存放一个单词词文中的各个字符。

函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。

函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。

函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。 函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。其中,实参c为相应单词的类别码或其助记符;当所识别的单词为标识符和整数时,实参VAL为TOKEN(即词文分别为字母数字串和数字串),对于其余种类的单词,VAL均为空串。函数OUT的功能是,在送出一个单词的内部表示之后,返回到调用该词法分析程序的那个程序。

五、源程序

#include #include #include #define ID 6

#define INT 7 #define LT 8 #define LE 9 #define EQ 10 #define NE 11 #define GT 12 #define GE 13 char TOKEN[20];

char keyword[5][6]={\char ch;

extern int lookup(char *TOKEN) { int i; for(i=0;i<5;i++) { if(strcmp(keyword[i],TOKEN)==0) return(i+1); } return(0); }

extern void out(int a) { if(a==ID) printf(\ else if(a==INT) printf(\ else if(a==LE) printf(\ else if(a==NE) printf(\ else if(a==LT) printf(\ else if(a==GE) printf(\ else if(a==GT) printf(\ else printf(\}

extern report_error(void) { printf(\}

void scanner_example() { int i,c; if(isalpha(ch)) { TOKEN[0]=ch; ch=getchar();i=1; while(isalnum(ch)) { TOKEN[i]=ch;i++; ch=getchar(); } ungetc(ch,stdin); TOKEN[i]='\\0'; c=lookup(TOKEN); if(c==0) out(ID); else out(c); } else if(isdigit(ch)) { TOKEN[0]=ch; ch=getchar();i=1; while(isdigit(ch)) { TOKEN[i]=ch;i++; ch=getchar(); } TOKEN[i]='\\0'; ungetc(ch,stdin); out(INT); } else switch(ch) { case'<':ch=getchar(); if(ch=='=')out(LE); else if(ch=='>')out(NE); else { ungetc(ch,stdin); out(LT); }

break; case'>':ch=getchar(); if(ch=='=')out(GE); else{ ungetc(ch,stdin); out(GT); } break; default:report_error(); break; } return; }

void main() { printf(\ ch=getchar(); while(ch!='#') { if(ch=='\\n') { ch=getchar(); continue; } else { scanner_example(); ch=getchar(); } } }

六、源程序说明:

字符数组TOKEN:用来依次存放一个单词词文中的各个字符。 函数getchar:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。

函数lookup:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整形变量c;否则将c置为零。

函数ungetc:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。

函数out:一般仅在进入终态时调用此函数,调用的形式为out(c)。其中,实参c为相应单词的类别码。函数根据类别码选择输出形式。

七、输出结果:

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新综合文库编译原理实验报告 (2)全文阅读和word下载服务。

编译原理实验报告 (2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/995656.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top