简单的词法分析程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的词法分析程序相关的知识,希望对你有一定的参考价值。

 词法分析程序完成的是编译第一阶段的工作,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。

技术分享

我写的简单代码实现如下:

#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++;
}

}

运行结果如下:

技术分享

 

以上是关于简单的词法分析程序的主要内容,如果未能解决你的问题,请参考以下文章

用C语言编写一个简单的词法分析程序

简单的词法分析程序

编译原理课程设计词法分析程序设计

词法分析程序 LEX和VC6整合使用的一个简单例子

Java 实现《编译原理》简单词法分析功能

词法分析实验报告