编译原理实验报告 (2)

图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为相应单词的类别码。函数根据类别码选择输出形式。

七、输出结果:


编译原理实验报告 (2).doc 将本文的Word文档下载到电脑

下一篇:自然地理

相关推荐
相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7 元

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xxxxxx QQ:xxxxxx