首页 > 代码库 > 词法分析程序
词法分析程序
词法分析程序功能:根据输入的字符串,按照种别码分类识别出对应的单词符号;
符号与种别码对照表
单词符号 | 种别码 | 单词符号 | 种别码 |
begin | 1 | : | 17 |
if | 2 | := | 18 |
then | 3 | < | 20 |
while | 4 | <= | 21 |
do | 5 | <> | 22 |
end | 6 | > | 23 |
l(l|d)* | 10 | >= | 24 |
dd* | 11 | = | 25 |
+ | 13 | ; | 26 |
- | 14 | ( | 27 |
* | 15 | ) | 28 |
/ | 16 | # | 0 |
用文法描述词法规则
<字母>:S→a|b|c|…|X|Y|Z
<数字>:S→0|1|2|…|9
<整数常数>:B→0|1|2|...|9
S→B|SB
<标识符>: A→B|AB|AS
B→a|b|c|…|X|Y|Z|_
S→0|1|2|...|9
<关键字>: S→const|var|procedure|begin|end|odd|if|then|call|while|do|read|write
<运算符>: S→+|-|*|/|=|#|<|<=|>|>=|!=
<界符>: S→(|)|,|;|.
运行代码及截图
#include<stdio.h>#include<string.h>void Fenxi(char c,char b);void word(char a[]);void number(char a[]);int i; int s=1; main(){ char a[50]; printf("请输入源程序:"); gets(a); printf("您要分析的源程序为:"); printf("%s",a); printf("\n"); for(i=0;(a[i]!=‘\0‘)&&(i<50)&&s==1;i++) { if((a[i]>=‘a‘ && a[i]<=‘z‘)||(a[i]>=‘A‘ && a[i]<=‘Z‘)) word(a); else if(a[i]>=‘0‘ && a[i]<=‘9‘) number(a); else Fenxi(a[i],a[i+1]); } printf("\n");}void number(char a[]) { char b[50]; int m,k=0,t; m=i; while(a[m]>=‘0‘ && a[m]<=‘9‘) { b[k]=a[m]; k++; m++; } i=m-1; printf("(11,"); for(t=0;t<k;t++) printf("%c",b[t]); printf(")"); printf("\n");}void word(char a[]) { int k=0,m,flag=0,t; char b[50]; char *key[6]={"begin","if","then","while","do","end"}; m=i; while((a[m]>=‘a‘&&a[m]<=‘z‘)||(a[m]>=‘A‘&&a[m]<=‘Z‘)) { b[k]=a[m]; k++; m++; b[k]=‘\0‘; } i=m-1; for(t=0;t<6;t++) { if(strcmp(b,key[t])==0) { printf("(%d,%s)",t+1,key[t]); flag=1; printf("\n"); } } if(flag==0) { printf("(10,%s)",b); printf("\n"); }}void Fenxi(char c,char b) { switch(c){ case ‘ ‘: break; case ‘+‘: printf("(13,+)\n"); break; case ‘-‘: printf("(14,-)\n"); break; case ‘*‘: printf("(15,*)\n"); break; case ‘/‘: printf("(16,/)\n"); break; case ‘:‘: if(b==‘=‘) { i++; printf("(18,:=)\n"); } else printf("(17,:)\n"); break; case ‘<‘: if(b==‘>‘) { i++; printf("(21,<>)\n"); } else if(b==‘=‘) { i++; printf("(22,<=)\n"); } else printf("(20,<)\n"); break; case ‘>‘: if(b==‘=‘) { printf("(24,>=)\n"); i++; } else printf("(23,>)\n"); break; case ‘=‘: printf("(25,=)\n"); break; case ‘;‘: printf("(26,;)\n"); break; case ‘(‘: printf("(27,()\n"); break; case ‘)‘: printf("(28,))\n"); break; case ‘#‘: printf("(0,#)\n"); break; default: { printf("\n存在字符 ‘%c‘,无法继续识别!\n",c); s=0; break; } }}
词法分析程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。