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

河北工大《编译原理》实验指导书及参考程序 - 图文(2)

来源:网络收集 时间:2020-06-08 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

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

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

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

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

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

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

程序一 根据图1编写的扫描器

# 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];

extern int lookup (char*); extern void out (int, char*); extern report_error (void);

void scanner_example (FILE *fp) {

char ch; int i, c; ch=fgetc (fp);

if (isalpha (ch)) /*it must be a identifer!*/ {

TOKEN[0]=ch; ch=fgetc (fp); i=1; while (isalnum (ch)) {

TOKEN[i]=ch; i++; ch=fgetc (fp); }

TOKEN[i]= ′\0′

fseek(fp,-1,1); /* retract*/ c=lookup (TOKEN);

if (c==0) out (ID,TOKEN); else out (c,\; } else

if(isdigit(ch)) {

TOKEN[0]=ch; ch=fgetc(fp); i=1; while(isdigit(ch)) {

TOKEN[i]=ch; i++; ch=fgetc(fp); }

TOKEN[i]= ′\0′; fseek(fp,-1,1); out(INT,TOKEN);

} else

switch(ch) {

case ′<′: ch=fgetc(fp);

if(ch==′=′)out(LE,\

else if(ch==′>′) out (NE,\

else {

fseek (fp,-1,1); out (LT,\} break;

case ′=′: out(EQ, \case ′>′: ch=fgetc(fp);

if(ch==′=′)out(GE,\ else {

fseek(fp,-1,1); out(GT,\}

break;

default: report_error( ); break; } return; }

提示:扫描器所用的若干函数以及主程序有待于具体编写,并需事先建立好保留字表,以备查询。例如:

/* 建立保留字表 */

#define MAX_KEY_NUMBER 20 /*关键字的数量*/

#define KEY_WORD_END “waiting for your expanding” /*关键字结束标记*/

char *KeyWordTable[MAX_KEY_NUMBER]={“begin”, “end”, “if”, “then”, “else”, KEY_WORD_END}; /* 查保留字表,判断是否为关键字 */

int lookup (char *token) {

int i=0;

while (strcmp(KeyWordTable[n], KEY_WORD_END)) /*strcmp比较两串是否相同,若相同返回0*/ {

if (!strcmp(KeyWordTable[n], token)) /*比较token所指向的关键字和保留字表中哪个关键字相符*/ {

return n+1; /*设置正确的关键字类别码,并返回此类别码的值*/ break; } n++; }

return 0; /*单词不是关键字,而是标识符*/ }

另外,在扫描源程序字符串时,一旦识别出关键字、标识符、整常数以及运算符中

之一,即以二元式形式(类别编码,值)输出单词到指定文件中。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。

题目2:将表I单词集中的整常数改为无符号常数,修改题目1中已开发的扫描器。 无符号常数的单词分类码助记符:UCON;其值为无符号常数的机内二进制表示。 描述无符号数的正规文法和状态转换图: 无符号数的右线性文法G[<无符号数>]如下:

〈无符号数〉→ d〈余留无符号数〉

〈无符号数〉→ ·〈小数部分〉 〈无符号数〉→ d

〈余留无符号数〉→ d〈余留无符号数〉 〈余留无符号数〉→ ·〈十进小数〉 〈余留无符号数〉→ E〈指数部分〉 〈余留无符号数〉→ d 〈余留无符号数〉→ ·

〈十进小数〉→ E〈指数部分〉 〈十进小数〉→ d〈十进小数〉 〈十进小数〉→ d

〈小数部分〉→ d〈十进小数〉 〈小数部分〉→ d

〈指数部分〉→ d〈余留整指数〉 〈指数部分〉→ +〈整指数〉 〈指数部分〉→ -〈整指数〉 〈指数部分〉→ d

〈整指数〉→ d〈余留整指数〉 〈整指数〉→ d

〈余留整指数〉→ d〈余留整指数〉 〈余留整指数〉→ d

图2所示为上述文法的状态转换图,其中编号0、1、2、?、6分别代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>。

图2 文法G[<无符号数>]的状态转换图

实现无符号数识别的参考方法:在计算机内实现状态转换图的方法之一,是以状态图中的各个状态为行,以可能输入的各个输入符号为列,组成一个状态矩阵。其中,矩

阵的元素用来指明下一个状态和扫描器应完成的语义动作(如拼接字符、数制转换、查填符号表以及输出单词的内部表示等)。由于在一个状态矩阵中,通常有许多状态都是出错状态,为了节省存放状态矩阵的存储空间,在具体实现时,常常采用更为紧凑和有效的数据结构。例如,对于文法G[<无符号数>]的状态转换图,可按表II的形式来存放其状态矩阵。表II中的第一列为各状态Si的编号,第二列分别列出了在每一状态下可能扫视到的输入符号aj(其中“other”是一个符号集合,用来表示在相应状态所属的那一栏中,除其前所列字符之外的全部其它字符),第三列指出当(Si,aj)出现时应执行的语义动作(通常用若干个语句来实现,若其后空,则表示不进行任何处理),最后一栏用来指明下一状态的编号(若其后NULL或“结束”则表示无后继状态)。状态矩阵中所嵌入的语义动作,其功能是在扫描源程序字符串的过程中,把识别出的字符串形式的无符号数的值,逐步转换为相应的二进制整数(ICON)或二进制浮点数(FCON)的内部形式,方法详见教材第56页。(注:考虑能否采用C语言的库函数实现此语义处理工作。)

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

根据加入语义过程说明的状态转换图直接编写词法分析程序,部分实现代码如下:

程序二 单词分类码为UCON的无符号数的识别程序

1 #include 2 #include 3 #include 4 #define LETTER 0 5 #define DIGIT 1 6 #define POINT 2 7 #define OTHER 3 8 #define POWER 4 9 #define PLUS 5 10 #define MINUS 6

11 #define UCON 7 //Suppose the class number of unsigned constant is 7 12 #define ClassOther 200 13 #define EndState -1 14 int w,n,p,e,d;

15 int Class; //Used to indicate class of the word 16 int ICON; 17 float FCON;

18 static int CurrentState; //Used to present current state, the initial value:0 19

20 int GetChar (void); 21 int EXCUTE (int,int); 22 int LEX (void);

23 int HandleOtherWord (void) 24 {return ClassOther; 25 }

26 int HandleError (void)

27 {printf (\\n\28

29 int GetChar (void) 30 {

31 int c;

32 c=getchar ( );

33 if(isdigit(c)) {d=c-′0′;return DIGIT;} 34 if (c==′.′) return POINT;

35 if (c==′E′||c==′e′) return POWER; 36 if (c==′+′) return PLUS; 37 if (c==′-′) return MINUS; 38 return OTHER; 39 }

40 int EXCUTE (int state, int symbol) 41 {

42 switch (state) 43 {

44 case 0:switch (symbol) 45 {

46 case DIGIT: n=0;p=0;e=1;w=d;CurrentState=1;Class=UCON;break; 47 case POINT: w=0;n=0;p=0;e=1;CurrentState=3;Class=UCON;break; 48 default: HandleOtherWord( );Class=ClassOther; 49 CurrentState=EndState; 50 }

51 break;

52 case 1:switch (symbol) 53 {

54 case DIGIT: w=w*10+d;break; //CurrentState=1

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库河北工大《编译原理》实验指导书及参考程序 - 图文(2)在线全文阅读。

河北工大《编译原理》实验指导书及参考程序 - 图文(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/1099820.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: