图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
#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下载服务。
相关推荐: