华科编译原理实验报告 下载本文

或二进制浮点数(FCON)的内部形式,方法见教材第56页。(注:考虑能否采用C语言的库函数实现此语义处理工作。)

表II 包含语义处理过程的识别无符号数的状态矩阵

图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 char prog[80],token[6]; char ch;

int syn,p,m,n,sum;

char * rwtab[6]={\,\,\,\,\,\}; main() { p=0;

printf(\); do {

ch=getchar(); prog[p++]=ch; }while(ch!='#'); p=0; do {

scaner(); switch(syn) {

case 11:printf(\,syn,sum);break; case -1:printf(\); break; default:printf(\,syn,token); }

}while(syn!=0); getch(); }

/*词法扫描程序:*/ scaner() {

for(n=0;n<8;n++) token[n]=NULL; m=0;

ch=prog[p++];

while(ch==' ')ch=prog[p++];

if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')) {

while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0')) {

token[m++]=ch; ch=prog[p++]; }

token[m++]='\\0'; ch=prog[--p]; syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0) {

syn=n+1; break; } } else

if((ch<='9'&&ch>='0')) { sum=0;

while((ch<='9'&&ch>='0')) {

sum=sum*10+ch-'0'; ch=prog[p++]; }

ch=prog[--p]; syn=11; } else switch(ch)

{

case '<':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=21; token[m++]=ch; } else

if(ch=='=') { syn=22; token[m++]=ch; } else { syn=20; ch=prog[--p]; } break;

case '>':token[m++]=ch;