簡單的詞法分析程序


 詞法分析程序完成的是編譯第一階段的工作,它的主要任務是從左至右逐個字符地對源程序進行掃描,產生一個個單詞序列,用於語法分析。

我寫的簡單代碼實現如下:

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

}

運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM