编译原理实验二 词法分析【C语言实现】


实验报告​​​​​​​

一、实验目的

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

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

二、实验内容

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

 三、实验步骤

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

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

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

5.显示结果。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#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;
}

 运行图:

  • 5
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangkay88

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值