词法分析

#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);  
}
原文地址:https://www.cnblogs.com/w304/p/4882324.html