电子科技大学-计算机学院-编译原理实验-词法分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#define MAX_COUNT 1024

#define ILLEGAL_CHAR_ERR 1

#define UNKNOWN_OPERATOR_ERR 2

/*从标准输入读入第一个非空白字符(换行符除外)*/

char getnbc()

{

char ch;

ch = getchar();

while (1)

{

if (ch == '\r' || ch == '\t' || ch == ' ')

{

ch = getchar();

}

else

{

break;

}

}

return ch;

}

/*判断character是否为字母*/

bool letter(char character)

{

if ((character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z')) return true;

else

return false;

}

/*判断character是否为数字*/

bool digit(char character)

{

if (character >= '0'&&character <= '9')

return true;

else

return false;

}

/*回退字符*/

void retract(char& character)

{

ungetc(character, stdin);

character = NULL;

}

/*返回保留字的对应种别*/

int reserve(char* token)

{

if (strcmp(token, "begin") == 0)

return 1;

else if (strcmp(token, "end") == 0)

return 2;

else if (strcmp(token, "integer") == 0) return 3;

else if (strcmp(token, "if") == 0)

return 4;

else if (strcmp(token, "then") == 0)

return 5;

else if (strcmp(token, "else") == 0)

return 6;

else if (strcmp(token, "function") == 0) return 7;

else if (strcmp(token, "read") == 0)

return 8;

else if (strcmp(token, "write") == 0)

return 9;

else

return 0;

}

/*返回标识符的对应种别*/

int symbol()

{

return 10;

}

/*返回常数的对应种别*/

int constant()

{

return 11;

}

/*按照格式输出单词符号和种别*/

void output(const char* token, int kindNum)

{

printf("%16s %2d\n", token, kindNum);

}

/*根据行号和错误码输出错误*/

bool error(int lineNum, int errNum)

{

char* errInfo;

switch (errNum)

{

case ILLEGAL_CHAR_ERR:

errInfo = "出现字母表以外的非法字符";

break;

case UNKNOWN_OPERATOR_ERR:

errInfo = "出现未知运算符";

break;

default:

errInfo = "未知错误";

}

if (fprintf(stderr, "***LINE:%d %s\n", lineNum, errInfo) >= 0) return true;

else

return false;

}

/*词法分析函数,每调用一次识别一个符号*/

bool LexAnalyze()

{

static int lineNum = 1;

char character;

char token[17] = "";

character = getnbc();

switch (character)

{

case'\n':

output("EOLN", 24);

lineNum++;

break;

case EOF:

output("EOF", 25);

相关文档
最新文档