#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <malloc.h>#include <ctype.h>#include <conio.h>#define NULL 0FILE *fp;char ch;char *keyword[8]={"do","begin","else","end","if","then","var","while"};char *operatornum[4]={"+","-","*","/"};char *comparison[6]={"<","<=","=",">",">=","<>"};char *interpunction[6]={",",";",":=",".","(",")"};//bool search(char searchstr[],int wordtype){ int i; switch (wordtype) { case 1:for(i=0;i<=7;i++) { if(strcmp(keyword[i],searchstr)==0) return(true); } case 2:{ for(i=0;i<=3;i++) { if(strcmp(operatornum[i],searchstr)==0) return(true); } break; } case 3: for(i=0;i<=5;i++) { if(strcmp(comparison[i],searchstr)==0) return(true); } case 4: for(i=0;i<=5;i++) { if(strcmp(interpunction[i],searchstr)==0) return(true); } } return(false);}
///
char letterprocess (char ch)//字母处理函数{ int i=-1; char letter[20]; while (isalnum(ch)!=0) { letter[++i]=ch; ch=fgetc(fp); }; letter[i+1]='/0'; if (search(letter,1)) { printf("<%s,->/n",letter); //strcat(letter,"/n"); //fputs('<' letter '>/n',outp); } else { printf("<indentifier,%s>/n",letter); //strcat(letter,"/n"); //fputs(letter,outp); } return(ch);}///
char numberprocess(char ch)//数字处理程序{ int i=-1; char num[20]; while (isdigit(ch)!=0) { num[++i]=ch; ch=fgetc(fp); } if(isalpha(ch)!=0) { while(isspace(ch)==0) { num[++i]=ch; ch=fgetc(fp); } num[i+1]='/0'; printf("错误!非法标识符:%s/n",num); goto u; } num[i+1]='/0'; printf("<num,%s>/n",num); //strcat(num,"/n"); //fputs(num,outp);u: return(ch);}
//
char otherprocess(char ch){ int i=-1; char other[20]; if (isspace(ch)!=0) { ch=fgetc(fp); goto u; } while ((isspace(ch)==0)&&(isalnum(ch)==0)) { other[++i]=ch; ch=fgetc(fp); } other[i+1]='/0'; if (search(other,2)) printf("<relop,%s>/n",other); else if (search(other,3)) printf("<%s,->/n",other); else if (search(other,4)) printf("<%s,->/n",other); else printf("错误!非法字符:%s/n",other);u: return (ch);}
/void main (){ char str,c; printf("**********************************词法分析器************************************/n"); //outp=fopen("二元式表.txt","w"); if ((fp=fopen("源程序.txt","r"))==NULL) printf("源程序无法打开!/n"); else { str =fgetc(fp); while (str!=EOF) { if (isalpha(str)!=0) str=letterprocess(str); else { if (isdigit(str)!=0) str=numberprocess(str); else str=otherprocess(str); } }; printf("词法分析结束,谢谢使用!/n"); printf("点任意键退出!/n"); } c=getch();}
<script language="javascript" src="/adfile/show_art2.js" type="text/javascript"></script>