第五次作业-词法分析程序的设计与实现

词法分析程序(Lexical Analyzer)要求:

- 从左至右扫描构成源程序的字符流

-  识别出有词法意义的单词(Lexemes

-  返回单词记录(单词类别,单词本身)

-  滤掉空格

-  跳过注释

-  发现词法错误

程序结构:

输入:字符流(什么输入方式,什么数据结构保存)

处理:

–遍历(什么遍历方式)

–词法规则

输出:单词流(什么输出形式)

–二元组

单词类别:

1.标识符(10)

2.无符号数(11)

3.保留字(一词一码)

4.运算符(一词一码)

5.界符(一词一码)

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:=

18

then

3

<

20

while

4

<=

21

do

5

<>

22

end

6

>

23

l(l|d)*

10

>=

24

dd*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

#include <stdio.h>
#include <string.h>
#define crux 13 //定义crux关键字为6
#define max 10 //定义number的最大位数
#define al 10 //定义符号的最的长度

FILE* fa1; //指针
char ch; //getch读取的字符
char id[al+1]; //当前的ident
int num;
int cc, ll; //getch计数器
char line[81];
char a[al+1]; //读取一个符号 暂时存在这里
char word[crux][al]; //关键字

FILE* fin;
FILE* fout;
char name[al]; //输入的文件名
int err;

#define chat if(-1==getch()) return -1;

void error(int n);

void error(int n)
{
char space[81];
memset(space, 32, 81);
space[cc-1] = 0;
printf("分析出现错误\n");
fprintf(fa1, "分析出现错误\n");
err++;
}
int getch()
{
if(cc == ll)
{
if(feof(fin))
{
printf("\n读取完成!\n");
return -1;
}
ll = 0;
cc = 0;

ch = ' ';
while(ch != 10)
{
if(fscanf(fin, "%c", &ch) == EOF)
{
line[ll] = 0;
break;
}
printf("%c", ch);
line[ll] = ch;
ll++;
}
printf("\n");
}
ch = line[cc];
cc++;
return 0;
}

int getsym()
{
int i, j, k;
while(ch == ' ' || ch == 10 || ch == 9||ch== 6)
{
chat;
}
if(ch >= 'a' && ch <= 'z')
{
k = 0;
do
{
if(k < al)
{
a[k] = ch;
k++;
}
chat;
}while(ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9');
a[k] = '\0';
strcpy(id, a);
i = 0;
j = crux-1;
do
{
k = (i+j)/2;
if(strcmp(id, word[k]) <= 0)
j = k-1;
if(strcmp(id, word[k]) >= 0)
i = k+1;
}while(i <= j);

if(i-1 > j)
{
printf("保留字 (1,'%s')\n", id);
}
else
{
printf("标识符 (3,'%s')\n", id);
}
}
else
{
if(ch >= '0' && ch <= '9')
{
k = 0;
num = 0;
do
{
num = num * 10 + ch - '0';
k++;
chat;
}while(ch >= '0' && ch <= '9');
k--;
if(k > max)
{
error(30);
}
printf("整 数 (2,'%d')\n",num);
}
else
{
if(ch == ':')
{
chat;
if(ch == '=')
{
printf("运算符 (4,':=')\n");
chat;
}
else
{
printf("分析错误!\n");
}
}
else
{
if(ch == '<')
{
chat;
if(ch == '=')
{
printf("运算符 (4,'<=')\n");
chat;
}
else
{
printf("运算符 (4,'<')\n");
}
}
else
{
if(ch == '>')
{
chat;
if(ch == '=')
{
printf("运算符 (4,'>=')\n");
chat;
}
else
{
printf("运算符 (4,'>')\n");
}
}
else
{
if(ch=='+')
{
printf("运算符 (4,'+')\n");
chat;
}
else if(ch=='-')
{
printf("运算符 (4,'-')\n");
chat;
}
else if(ch=='*')
{
printf("运算符 (4,'*')\n");
chat;
}
else if(ch=='/')
{
printf("运算符 (4,'/')\n");
chat;
}
else if(ch=='#')
{
printf("运算符 (4,'#')\n");
chat;
}
else if(ch=='(')
{
printf("分界符 (5,'(')\n");
chat;
}
else if(ch==')')
{
printf("分界符 (5,')')\n");
chat;
}
else if(ch==',')
{
printf("分界符 (5,',')\n");
chat;
}
else if(ch==';')
{
printf("分界符 (5,';')\n");
chat;
}
else if(ch=='.')
{
printf("分界符 (5,'.')\n");
chat;
}
else
{
printf("分析错误!");
return -1;
}
}
}
}
}
}
return 0;
}
void init()
{
strcpy(&(word[0][0]), "begin"); //将关键字复制到运行结果
strcpy(&(word[1][0]), "if");
strcpy(&(word[2][0]), "then");
strcpy(&(word[3][0]), "while");
strcpy(&(word[4][0]), "do");
strcpy(&(word[5][0]), "end");

}
int main()
{
printf("请输入要分析的文件名:\n");
scanf("%s", name);
fin = fopen(name, "r");
if(fin)
{
init();
printf("\n分析成功!\n\n");
err = 0;
ch = ' ';
while(getsym() != -1)
{
}
}
else
{
printf("无法找到此文件\n");
}
return 0;
}

此次作业代码借鉴了网上的代码,努力理解了代码,但还是有很多地方自己不会写!

猜你喜欢

转载自www.cnblogs.com/hqling/p/11657129.html