电子科技大学-计算机学院-编译原理实验-词法分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);