#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("输入完成!
");
printf("
输入内容是:
");
PrintDate(input);
printf("
词法分析:");
printf("
------------------
");
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 1
");
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 2
");
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 3
");
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 4
");
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 5
");
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 6
");
i+=2;
break;
}
goto TT;
case '+':
printf("+ 13
");
break;
case '-':
printf("- 14
");
break;
case '*':
printf("* 15
");
break;
case '/':
printf("/ 16
");
break;
case ':':
if(strncmp("=",input+i+1,1)==0)
{
printf(":= 18
");
i+=1;
}
else
printf(": 17
");
break;
case '<':
if(strncmp("=",input+i+1,1)==0)
{
printf("<= 21
");
i+=1;
}
else if(strncmp(">",input+i+1,1)==0)
{
printf("<> 22
");
i+=1;
}
printf("< 20
");
break;
case '>':
if(strncmp("=",input+i+1,1)==0)
{
printf(">= 24
");
i+=1;
}
else
printf("> 23
");
break;
case '=':
printf("= 25
");
break;
case '(':
printf("( 27
");
break;
case ')':
printf(") 28
");
break;
case '#':
printf("# 0
");
break;
case '.':
printf(".
");
break;
case ' ':
printf("");
break;
case '
':
printf("");
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(" 10
");
}
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(" 11
");
}
break;
}
}
}
int InputDate(char input[]) //录入输入数据,返回数据长度
{
int i;
printf("输入“****”时结束输入!
");
printf("请输入:");
for(i=0;2>1;i++)
{
input[i]=getch();
if(input[i]=='
')
putchar('
');
else if(input[i]==8)
{
if(i<=0)
{
i-=1;
putchar(7);
}else{
i-=2;
printf(" ");
}
}
else
putchar(input[i]);
if(i>=3&&(input[i]=='*'&&input[i-1]=='*'&&input[i-2]=='*'&&input[i-3]=='*'))
break;
}
input[i-3]=' ';
return strlen(input);
}
void PrintDate(char input[]) //打印输入数据
{
int i;
for(i=0;input[i]!=' ';i++)
if(input[i]=='
')
putchar('
');
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);
}