189 8069 5689

编译原理实验二词法分析【C语言实现】-创新互联


实验报告​​​​​​​ 一、实验目的

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

成都创新互联凭借专业的设计团队扎实的技术支持、优质高效的服务意识和丰厚的资源优势,提供专业的网站策划、成都网站设计、网站制作、网站优化、软件开发、网站改版等服务,在成都10多年的网站建设设计经验,为成都1000多家中小型企业策划设计了网站。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)

二、实验内容

在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。

三、实验步骤

1.初始化:从文件将源程序全部输入到字符缓冲区中。2.取单词前:去掉多余空白。

3.取单词后:去掉多余空白(可选,看着办)。

4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)

5.显示结果。

#include #include #include #include #define FILENAME "D:\\java\\text.c"
#define MODE "r"

const char *key[] = {"main", "int", "char", "f1oat", "doub1e", "if", "for", "while", " return"};
const char *border[] = {",", ";", "{", "}", "(", ")"};
const char *arithmetic[] = {"+", "_", "*", "/", "<", ">", "<=", ">=", "=", "<>"};

FILE *fp;


char nextChar() {
char ch = EOF;
if (!feof(fp)) {
ch = fgetc(fp);
}
return ch;
}

int isin(char str[], int type) {
int i = 0;
switch (type) {
case 1: {
for (i = 0; i < 9; ++i) {
if (strcmp(str, key[i]) == 0) {
return i + 1;
}
}
break;
}
case 4: {
for (i = 0; i < 10; ++i) {
if (strcmp(str, arithmetic[i]) == 0) {
return i + 1;
}
}
break;
}
case 5: {
for (i = 0; i < 6; ++i) {
if (strcmp(str, border[i]) == 0) {
return i + 1;
}
}
break;
}
}
return 0;
}
char alphaprocess(char ch) {
char buffer[1024];
int bufPtr = 0;
while (isalpha(ch) || isdigit(ch) ||'_' == ch) {
buffer[bufPtr++] = ch;
ch = nextChar();
}
buffer[bufPtr] = '\0';
if (isin(buffer, 1)) {
printf("(1,\"%s\")\n", buffer);
} else {
printf("(2,\"%s\")\n", buffer);
}
return ch;
}

char digitprocess(char ch) {
char buffer[1024];
int bufPtr = 0;
while (isdigit(ch) || '.' == ch) {
buffer[bufPtr++] = ch;
ch = nextChar();
}
buffer[bufPtr] = '\0';
printf("(3,\"%s\")\n", buffer);
return ch;

}


char otherprocess(char ch) {
char buffer[3];
buffer[0] = ch;
buffer[1] = buffer [2] = '\0';
char lookahead = nextChar();
if (isspace(ch)) {
return lookahead;
} else if (isin(buffer, 5)) {
printf("(5, \"%s\")\n", buffer);
} else if (isin(buffer, 4)) {
buffer[1] = lookahead;
if (isin(buffer, 4)) {
printf("(4,\"%s\")\n", buffer);
} else {
buffer[1] = '\0';
ungetc(lookahead, fp);
printf("(4,\"%s\")\n", buffer);
}
}
return lookahead;
}



int main(void) 
{
char ch;
if ((fp = fopen(FILENAME,MODE)) == NULL) {
printf("Error : File does not exist.");
}
ch = nextChar();
while (ch != EOF) {
if (isalpha(ch)) {
ch = alphaprocess(ch);
} 
else if (isdigit(ch)) {
ch = digitprocess(ch);
} else {
ch = otherprocess(ch);
}

}
fclose(fp);
system("pause");
return 0;
}

运行图:

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:编译原理实验二词法分析【C语言实现】-创新互联
分享路径:http://jkwzsj.com/article/dpcggd.html

其他资讯