标签:
#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