词法分析程序的设计与实现
词法分析程序(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 N 80
char word[6][10]={"begin","if","then","while","do","end"};
void Analyse(char a[]);
main()
{
int i;
char a[N];
printf("请输入源程序:(以$结束)\n");
for(i=0;i<N;i++)
{
scanf("%c",&a[i]);
if(a[i]=='$')
break;
}
a[i+1]='\0';
i=0;
printf("词法分析结果为:\n");
Analyse(a);
}
void Analyse(char a[])
{
int i=0,j=0,n=0,m=0,temp=0;
char b[N];
while(a[i]!='$')
{
if(a[i]>=65&&a[i]<=122)
{
j=0;
while((a[i]>=65&&a[i]<=122)||(a[i]>='0'&&a[i]<='9')||a[i]=='_')
{
b[j]=a[i];
j++;
i++;
}
i--;
b[j]='\0';
for(n=0;n<6;n++)
{
if(strcmp(b,word[n])==0)
{
printf("<关键字,%d,",n+1);
while(word[n][m]!='\0')
{
printf("%c",word[n][m]);
m++;
}
printf(">\n");
temp=1;
}
}
if(temp==0)
printf("<标识符,10,%s>\n",b);
}
else
{
switch(a[i])
{
case '#': printf("<0,$>\n");
case '+': printf("<运算符,13,+>\n");break;
case '-': printf("<运算符,14,->\n");break;
case '*': printf("<运算符,15,*>\n");break;
case '/': printf("<运算符,16,/>\n");break;
case ':':if(a[i+1]=='=')
{
printf("<运算符,18,:=>\n");
i++;
}
else printf("<界符,17,:>\n");
break;
case '<': if(a[i+1]=='=')
{
printf("<运算符,21,<=>\n");
i++;
}
else if(a[i+1]=='>')
{
printf("<运算符,22,<>>\n");
i++;
}
else printf("<界符,20,<>\n");
break;
case '>': if(a[i+1]=='=')
{
printf("<运算符,24,>=>\n");
i++;
}
else printf("<界符,23,>>\n");
break;
case '=': printf("<25,=>\n");break;
case ';': printf("<界符,26,;>\n");break;
case '(': printf("<界符,27,(>\n");break;
case ')': printf("<界符,28,)>\n");break;
case' ': break;
case'\n': break;
default:
if(a[i]>='0'&&a[i]<='9')
printf("<数字,%c>\n",a[i]);
else
printf("'%c'输入错误!\n",a[i]);
break;
}
}
i++;
}
}

浙公网安备 33010602011771号