码迷,mamicode.com
首页 > 其他好文 > 详细

词法分析

时间:2015-10-07 22:48:07      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

#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("空格\t\t\n");     break;    case ‘\r‘:     printf("回车\t\t\n");     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]==‘.‘)&&!NOSign2(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);  }

词法分析

标签:

原文地址:http://www.cnblogs.com/w304/p/4859640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!