词法分析

 

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
int InputDate(char input[]);    
void PrintDate(char input[]);    
int NoSign_Number(char a);          
int NOSign2(char a);              
int NOSign(char a);                
 
void main()
{
int i,length,flag=0;
char input[1000];
length=InputDate(input);
printf("输入完成!\n");
printf("\n输入内容是:\n");
PrintDate(input);
printf("\n\n词法分析:");
printf("\n------------------\n");
for(i=0;i<length;i++)
{
switch(input[i])
{
case 'b':
if(strncmp("egin",input+i+1,4)==0&&NoSign_Number(input[i-1])&&NoSign_Number(input[i+5]))
{
printf("begin\t\t1\n");
i+=4;
break;
}
goto TT;
case 'i':
if(strncmp("f",input+i+1,1)==0&&NoSign_Number(input[i+2])&&NoSign_Number(input[i-1]))
{
printf("if\t\t2\n");
i+=1;
break;
}
goto TT;
case 't':
if(strncmp("hen",input+i+1,3)==0&&NoSign_Number(input[i+4])&&NoSign_Number(input[i-1]))
{
printf("then\t\t3\n");
i+=3;
break;
}
goto TT;
case 'w':
if(strncmp("hile",input+i+1,4)==0&&NoSign_Number(input[i+5])&&NoSign_Number(input[i-1]))
{
printf("while\t4\n");
i+=4;
break;
}
goto TT;
case 'd':
if(strncmp("o",input+i+1,1)==0&&NoSign_Number(input[i+2])&&NoSign_Number(input[i-1]))
{
printf("do\t\5\n");
i+=1;
break;
}
goto TT;
case 'e':
if(strncmp("nd",input+i+1,2)==0&&NoSign_Number(input[i+3])&&NoSign_Number(input[i-1]))
{
printf("end\t\6\n");
i+=2;
break;
}
goto TT;
case '+':
printf("+\t\t13\n");
break;
case '-':
printf("-\t\t14\n");
break;
case '*':
printf("*\t\t15\n");
break;
case '/':
printf("/\t\t16\n");
break;
case ':':
if(strncmp("=",input+i+1,1)==0)
{
printf(":=\t\t18\n");
i+=1;
}
else
printf(":\t\t17\n");
break;
case '<':
if(strncmp("=",input+i+1,1)==0)
{
printf("<=\t\t21\n");
i+=1;
}
else if(strncmp(">",input+i+1,1)==0)
{
printf("<>\t\t22\n");
i+=1;
}
printf("<\t\t20\n");
break;
case '>':
if(strncmp("=",input+i+1,1)==0)
{
printf(">=\t\t24\n");
i+=1;
}
else
printf(">\t\t23\n");
break;
case '=':
printf("=\t\t25\n");
break;
case '(':
printf("(\t\t27\n");
break;
case ')':
printf(")\t\t28\n");
break;
case '#':
printf("#\t\t0\n");
break;
case '.':
printf(".\t\t\n");
break;
case ' ':
printf("\b");
break;
case '\r':
printf("\b");
break;
TT: default:
if((input[i]>='a'&&input[i]<='z')||(input[i]>='A'&&input[i]<='Z'))
{
while(NOSign(input[i])&&i<length)
{
flag=1;
putchar(input[i]);
i++;
}
if(flag)
{
i--;
flag=0;
}
printf("\t\t10\n");
}
else if(input[i]>=48||input[i]<=57)
{
while((input[i]>=48||input[i]<=57||input[i]=='.')&&!NoSign_Number(input[i])&&i<length)
{
flag=1;
putchar(input[i]);
i++;
}
if(flag)
{
i--;
flag=0;
}
printf("\t\t11\n");
}
break;
}
}
}
int InputDate(char input[])       //录入输入数据,返回数据长度
{
int i;
printf("输入“****”时结束输入!\n");
printf("请输入:");
for(i=0;2>1;i++)
{
input[i]=getch();
if(input[i]=='\r')
putchar('\n');
else if(input[i]==8)
{
if(i<=0)
{
i-=1;
putchar(7);
}else{
i-=2;
printf("\b \b");
}
}
else
putchar(input[i]);
if(i>=3&&(input[i]=='*'&&input[i-1]=='*'&&input[i-2]=='*'&&input[i-3]=='*'))
break;
}
input[i-3]='\0';
return strlen(input);
}
void PrintDate(char input[])      //打印输入数据
{
int i;
for(i=0;input[i]!='\0';i++)
if(input[i]=='\r')
putchar('\n');
else
putchar(input[i]);
}
int NoSign_Number(char a)    //若该符号既不是数字也不是字母,是返回1
{
return (a<'a'||a>'z')&&(a<'A'||a>'Z')&&(a<48||a>57);
}
int NOSign(char a)  //数字,字母,下划线,返回1
{
return (a>=48&&a<=57)||(a>=65&&a>=90)||(a>=97&&a<=122)||(a==95);
}
int NOSign2(char a)  //数字,小数点,返回1
{
return (a>=33&&a<46&&a==47)||(a>=91&&a<=96)||(a>123&&a<=126);  
}

posted on 2015-10-15 14:33  52袁文洪  阅读(229)  评论(1编辑  收藏  举报

导航