詞法分析器
1.源文件:text.c
main(){int a,b;a=10;b=a+20;}
2.源文件:詞法分析
#include <stdio.h>#include <ctype.h>#include <malloc.h>#include <stdlib.h>#include <string.h>#define NULL 0FILE *fp;char cbuffer;char *key[8]={"if","else","for","while","do","return","break","continue"};char *border[6]={",",";","{","}","(",")"};char *arithmetic[4]={"+","-","*","/"};char *relation[6]={"<","<=","=",">",">=","<>"};char *consts[20];char *label[20];int constnum=0,labelnum=0;int search(char searchchar[],int wordtype){ int i=0; switch (wordtype) { case 1:for (i=0;i<=7;i++) { if (strcmp(key[i],searchchar)==0) return(i+1); } case 2:{for (i=0;i<=5;i++) { if (strcmp(border[i],searchchar)==0) return(i+1); } return(0); } case 3:{for (i=0;i<=3;i++) { if (strcmp(arithmetic[i],searchchar)==0) { return(i+1); } } return(0); } case 4:{for (i=0;i<=5;i++) { if (strcmp(relation[i],searchchar)==0) { return(i+1); } } return(0); } case 5:{for (i=0;i<=constnum;i++) { if (strcmp(consts[i],searchchar)==0) { return(i+1); } } consts[i-1]=(char *)malloc(sizeof(searchchar)); strcpy(consts[i-1],searchchar); constnum++; return(i); } case 6:{for (i=0;i<=labelnum;i++) { if (strcmp(label[i],searchchar)==0) { return(i+1); } } label[i-1]=(char *)malloc(sizeof(searchchar)); strcpy(label[i-1],searchchar); labelnum++; return(i); } }}char alphaprocess(char buffer){ int atype; int i=-1; char alphatp[20]; while ((isalpha(buffer))||(isdigit(buffer))) { alphatp[++i]=buffer; buffer=fgetc(fp); } alphatp[i+1]= ; if (atype=search(alphatp,1)) printf("%s (1,%d)
",alphatp,atype-1); else { atype=search(alphatp,6); printf("%s (6,%d)
",alphatp,atype-1); } return(buffer);}char digitprocess(char buffer){ int i=-1; char digittp[20]; int dtype; while ((isdigit(buffer))) { digittp[++i]=buffer; buffer=fgetc(fp); } digittp[i+1]= ; dtype=search(digittp,5); printf("%s (5,%d)
",digittp,dtype-1); return(buffer);}char otherprocess(char buffer){ int i=-1; char othertp[20]; int otype,otypetp; othertp[0]=buffer; othertp[1]= ; if (otype=search(othertp,3)) { printf("%s (3,%d)
",othertp,otype-1); buffer=fgetc(fp); goto out; } if (otype=search(othertp,4)) { buffer=fgetc(fp); othertp[1]=buffer; othertp[2]= ; if (otypetp=search(othertp,4)) { printf("%s (4,%d)
",othertp,otypetp-1); goto out; } else othertp[1]= ; printf("%s (4,%d)
",othertp,otype-1); goto out; } if (buffer==:) { buffer=fgetc(fp); if (buffer===) printf(":= (2,2)
"); buffer=fgetc(fp); goto out; } else { if (otype=search(othertp,2)) { printf("%s (2,%d)
",othertp,otype-1); buffer=fgetc(fp); goto out; } } if ((buffer!=
)&&(buffer!= )) printf("%c error,not a word
",buffer); buffer=fgetc(fp);out: return(buffer);}void main(){ int i; for (i=0;i<=20;i++) { label[i]=NULL; consts[i]=NULL; }; if ((fp=fopen("text.c","r"))==NULL) printf("error"); else { cbuffer = fgetc(fp); while (cbuffer!=EOF) { if (isalpha(cbuffer)) cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer)) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer); } printf("over
"); getchar(); }}
推薦閱讀:
TAG:編譯原理 |