或二进制浮点数(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
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;