Tiny C 语言编译程序实验一 Scanner_程序设计语言与编译

其他范文 时间:2020-02-27 09:42:38 收藏本文下载本文
【www.daodoc.com - 其他范文】

Tiny C 语言编译程序实验一 Scanner由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“程序设计语言与编译”。

Tiny C语言编译程序实验一 Scanner Tiny C语言编译程序实验一 Scanner 要求:填写getToken()函数,完成词法分析器scan.c。

约定:

 仅允许整数类型,不允许实数类型

 标识符由大小写英文字母组成,最多52个。其识别按最长匹配原则  整数后紧跟非数字,或标识符后紧跟非字母认为是一个新Token开始  由{ }括起来符号串都认为是注释部分,该部分在词法分析时被过滤掉

 识别出的Token由两个变量:currentToken,tokenString识别,其中currentToken代表Token的类属,为一个名为TokenType的枚举类型,在文件globals.h中定义;tokenString代表Token在程序中出现的形式,即其本来面目。例如整数10的currentToken值为NUM,而tokenString值为‘10’;标识符i的currentToken值为ID,而tokenString值为‘i’

typedef enum

{ ENDFILE,ERROR,IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE, /* 保留字 */

ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI :=

=

+

*

/

()

;

} TokenType;

画识别符合TINY C语言构词规则的DFA。然后用直接编码的方法构造词法分析器

/****************************************************/ /* File: scan.c

*/ /* The scanner implementation for the TINY compiler

*/ /****************************************************/ #include “globals.h”

#include “util.h”

#include “scan.h”

typedef enum

{ START, INASSIGN, INCOMMENT, INNUM, INID, DONE } StateType;char tokenString[MAXTOKENLEN+1];static int getNextChar(void)

//获得下一字符

Tiny C语言编译程序实验一 Scanner

static struct

{ char* str;

TokenType tok;

} reservedWords[MAXRESERVED]

= {{“if”,IF},{“then”,THEN},{“else”,ELSE},{“end”,END},{“repeat”,REPEAT},{“until”,UNTIL},{“read”,READ},{“write”,WRITE}};

//定义保留字表

static TokenType reservedLookup(char * s)

//进行保留字的匹配 {实现请自己看scan.c文件}

/**********************************************/ /* the primary function of the scanner

*/ /* function getToken returns the next token in source file */ /**********************************************/ TokenType getToken(void){ int tokenStringIndex = 0;

TokenType currentToken;

//保存被识别Token的类属

StateType state = START;

//初始状态为START

int save;

//标识当前字符是否保存,如空格,换行符n、TAB符t及注释中的任何字符

while(state!= DONE)

//DONE状态表示已识别出一个Token

{ int c = getNextChar();

save = TRUE;

switch(state)

{ case START:

if(isdigit(c))

state = INNUM;

else if(isletter(c))

{ state=DONE;currentToken=END;state=INID;state=INASSIGN;state=INCOMMENT;else if(c==':')else if(c=='{')else

}

break;

case INCOMMENT:

if(c=='}')

Tiny C语言编译程序实验一 Scanner

{ state=DONE;currentToken=END;}

break;case INASSIGN: if(c=='=')

{

} else { error();currentToken=ERROR };/* 此处已填写完整 */ state=DONE;currentToken=ASSIGN;break;

case INNUM:

if(!isdigit(c))

{ /* backup in the input */

ungetNextChar();

save = FALSE;

state = DONE;

currentToken = NUM;

}

break;

case INID:

if(!isletter(c)){ /* backup in the input */ ungetNextChar();save = FALSE;state = DONE;currentToken =ID;

break;

case DONE: //不可能到

default: /* should never happen */

fprintf(listing,“Scanner Bug: state= %dn”,state);

state = DONE;

currentToken = ERROR;

break;

}

if((save)&&(tokenStringIndex

tokenString[tokenStringIndex++] =(char)c;

if(state == DONE)

Tiny C语言编译程序实验一 Scanner

{ tokenString[tokenStringIndex] = '';

if(currentToken == ID)

currentToken = reservedLookup(tokenString);

}

}

---------end WHILE

if(TraceScan){

fprintf(listing,“t%d: ”,lineno);

printToken(currentToken,tokenString);

}

return currentToken;} /* end getToken */

下载Tiny C 语言编译程序实验一 Scannerword格式文档
下载Tiny C 语言编译程序实验一 Scanner.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

    热门文章
      整站推荐
        点击下载本文