天天看点

词法分析

#include<stdio.h>

#include<string.h>

void Fenxi(char c,char b);

void word(char a[]);

void number(char a[]);

int i; //定义全局变量i

int s=1; //用来记录是否存在非法字符

main(){

char a[50];

printf("请输入源程序:");

gets(a);

printf("您要分析的源程序为:");

printf("%s",a);

printf("\n");

for(i=0;(a[i]!='\0')&&(i<50)&&s==1;i++)

{

if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))

word(a);

else if(a[i]>='0' && a[i]<='9')

number(a);

else

Fenxi(a[i],a[i+1]);

}

}

void number(char a[]) //对数字字符进行扫描分析

{

char b[50];

int m,k=0,t;

m=i;

while(a[m]>='0' && a[m]<='9')

b[k]=a[m]; //用数组b存放数组a中的数字

k++;

m++;

i=m-1;

printf("(11,");

for(t=0;t<k;t++)

printf("%c",b[t]);

printf(")");

void word(char a[]) //对字母字符进行扫描分析,并识别保留字

int k=0,m,flag=0,t;

char *key[6]={"begin","if","then","while","do","end"};

while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母

b[k]=a[m];

b[k]='\0';

for(t=0;t<6;t++)

if(strcmp(b,key[t])==0) //将数组b与关键字进行比较

{

printf("(%d,%s)",t+1,key[t]); //输出关键字

flag=1;

printf("\n");

}

if(flag==0)

printf("(10,%s)",b); //输出标识符

printf("\n");

void Fenxi(char c,char b) //对特殊字符进行扫描分析

switch(c){

case ' ':

break;

case '+':

printf("(13,+)\n");

case '-':

printf("(14,-)\n");

case '*':

printf("(15,*)\n");

case '/':

printf("(16,/)\n");

case ':':

if(b=='=')

{

i++;

printf("(18,:=)\n");

}

else

printf("(17,:)\n");

case '<':

if(b=='>')

printf("(21,<>)\n");

else if(b=='=')

printf("(22,<=)\n");

printf("(20,<)\n");

case '>':

printf("(24,>=)\n");

printf("(23,>)\n");

case '=':

printf("(25,=)\n");

case ';':

printf("(26,;)\n");

case '(':

printf("(27,()\n");

case ')':

printf("(28,))\n");

case '#':

printf("(0,#)\n");

default:

printf("\n存在字符 '%c',无法继续识别!\n",c);

s=0; //用s=0记录存在非法字符