首页 > 代码库 > 词法分析
词法分析
词法分析程序的功能:
将用户输入的程序段进行分析,逐个字符进行读取,根据关键字、数字、标识符等的文法规则,将它们拼在
一起组成一个有意义的单词,并输出自身值及其种别码。
符号与种别码对照表:
单词符号 | 种别码 | 单词符号 | 种别码 |
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 |
文法描述词法规则:
•<字母>→ a|b|c|……y|z
•<数字>→d|<整数>|.<小数>
•<整数常数>→1|2|3|···
•<标识符>→l|l<字母数字>
•<关键字>→→if|else|while|do|for|int|char|···
•<运算符>→+|-|-|/|=|=<等号>···
•<界符>→,|;|(|)|···
词法分析程序:
#include<stdio.h> /*定义I/O库所用的某些宏和变量*/#include<string.h> /*定义字符串库函数*/ /char prog[80]={‘\0‘}, token[8]; /*存放构成单词符号的字符串*/char ch;int syn, n,sum, m,p;char *rwtab[6]={"begin","if","then","while","do","end"};void scaner(){ m=0; sum=0; for(n=0;n<8;n++) token[n]=‘\0‘; ch=prog[p++]; while(ch==‘ ‘) ch=prog[p++]; if(isalpha(ch)) /*ch为字母字符*/{ while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/{ token[m++]=ch; ch=prog[p++];} token[m++]=‘\0‘; ch=prog[p--]; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) /*字符串的比较*/{ syn=n+1; break;}} else if(isdigit(ch)) /*ch是数字字符*/{ while(isdigit(ch)) /*ch是数字字符*/{ sum=sum*10+ch-‘0‘; ch=prog[p++];} ch=prog[p--]; syn=11;} else switch(ch){ case‘+‘:syn=12;token[0]=ch;break; case‘-‘:syn=13;token[0]=ch;break; case‘*‘:syn=14;token[0]=ch;break; case‘/‘:syn=15;token[0]=ch;break; case‘=‘:syn=16;token[0]=ch;break; case‘;‘:syn=17;token[0]=ch;break; case‘(‘:syn=18;token[0]=ch;break; case‘)‘:syn=19;token[0]=ch;break; case‘#‘:syn=0;token[0]=ch;break; default:syn=-1;}}main(){ printf("请输入单词符号:"); p=0; do { ch=getchar(); prog[p++]=ch; }while(ch!=‘#‘); p=0; do{ scaner(); switch(syn){ case 11: printf("(%d,%d)\n",syn,sum);break; case -1: printf("\n 出错!;\n");break; default: printf("(%d,%s)\n",syn,token);} }while(syn!=0); getch();}
词法分析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。