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

词法分析程序

时间:2016-09-30 23:49:19      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

这个词法分析程序只是一个相对简单的程序,如果还有其他符号要标注的话可以再加,主要功能就是让用户输入一串字符串,直到用户输入$(个人定义的结束符)就结束输入开始执行词法分析功能,将输入的字符存在一个字符数组里,
然后按一个个的字符读出,对其进行判断,最终将这个用户输入的字符串分解为不同种别码的类型。





#include<stdio.h> #include<string.h> #include<stdlib.h> #define Max 1000 int j=1; long g=0; char nchar[Max]={""}; int k=0; char ch=NULL; char m[30]={""}; int sym=-1; main() { char cha; int p; printf("请输入一串字符串:"); while((cha=getchar())!=$) { nchar[g]=cha; g++; } do { p=getsym(); }while(p); } int getsym() { int i; char a[2]={""}; char word[][15]={"begin","do","end","if","then","while"}; int wsym[6]={1,2,3,4,5,6}; int ssym[9]={25,26,27,28,0,13,14,15,16}; char b[9]={=,;,(,),#,+,-,*,/}; if(j==1&&k<g) { ch=nchar[k]; j++; k++; } while(ch== ||ch==10||ch==9||ch==13) { if(k==g) { return 0; } ch=nchar[k]; k++; } if(ch>=a&&ch<=z) { while((ch>=a&&ch<=z)||(ch>=0&&ch<=9)||ch==_) { a[0]=ch; strcat(m,a); if(k==g) { break; } ch=nchar[k]; k++; } for(i=0;i<12;i++) { if(strcmp(m,&word[i][0])==0) break; } if(i<12) { sym=wsym[i]; printf("保留字%s 种别码%d\n",m,wsym[i]); } else { sym=10; printf("标识符%s 种别码10\n",m); } if(k==g) return 0; strcpy(m,""); return 1; } else if(ch>=0&&ch<=9) { while(ch>=0&&ch<=9) { a[0]=ch; strcat(m,a); if(k==g) { break; } ch=nchar[k]; k++; } sym=11; printf("常数%s 种别码11\n",m); if(k==g) return 0; strcpy(m,""); return 1; } else if(ch==:) { a[0]=ch; strcat(m,a); if(k==g) { sym=17; printf("运算符%s 种别码17\n",m); return 0; } ch=nchar[k]; k++; if(ch===) { a[0]=ch; strcat(m,a); sym=18; printf("运算符%s 种别码18\n",m); if(k==g) { return 0; } ch=nchar[k]; k++; } strcpy(m,""); return 1; } else if(ch==<) { a[0]=ch; strcat(m,a); if(k<g) { ch=nchar[k]; k++; } if(ch===) { a[0]=ch; strcat(m,a); sym=21; printf("运算符%s 种别码21\n",m); if(k==g) { return 0; } ch=nchar[k]; k++; } else if(ch==>) { a[0]=ch; strcat(m,a); sym=22; printf("运算符%s 种别码22\n",m); if(k==g) { return 0; } ch=nchar[k]; k++; } else { printf("运算符%s 种别码22\n",m); } if(k==g) { return 0; } strcpy(m,""); return 1; } else if(ch==>) { a[0]=ch; strcat(m,a); if(k<g) { ch=nchar[k]; k++; } if(ch===) { a[0]=ch; strcat(m,a); sym=24; printf("运算符%s 种别码24\n",m); if(k==g) { return 0; } ch=nchar[k]; k++; } else { sym=23; printf("运算符%s 种别码23\n",m); } if(k==g) { return 0; } strcpy(m,""); return 1; } else { for(i=0;i<9;i++) { if(ch==b[i]) break; } if(i<9) { sym=ssym[i]; a[0]=ch; strcat(m,a); sym=ssym[i]; printf("%s 种别码为:%d\n",m,ssym[i]); } else { a[0]=ch; strcat(m,a); sym=-1; printf("错误!%s不存在种别码\n",m); } if(k<g) { ch=nchar[k]; k++; } else { return 0; } strcpy(m,""); return 1; } }
技术分享



用文法描述词法规则
•<字母>   A->a|b|c|d|……|z|A|B...|Z

•<数字>  B->0|1|2|….|9

•<整数常数>  S->C|SB

      C->1|2|3|…|9


•<标识符>  S->A|SB|SA|S_

•<关键字>  S->begin|if|then|while|do|end

•<运算符>  S->+|-|*|/|=|#|<|<=|>|>=|:=

•<界符>  S->(|),|;|.
 
 
技术分享



 

词法分析程序

标签:

原文地址:http://www.cnblogs.com/OZX143570/p/5925039.html

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