词法分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析相关的知识,希望对你有一定的参考价值。
词法分析程序的功能:
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
符号与种别码对照表:
用文法描述词法规则:
关键字,也称基本字,if, then, while, do等
标识符,表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum
常数,如123,4587
运算符,如+, -, *, /, :=, <=, >, <>等
界符,,;():等
代码:
#include<stdio.h> #include<string.h> #include<conio.h> #include<ctype.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)) { while(isalpha(ch)||isdigit(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)) { while(isdigit(ch)) { sum=sum*10+ch-‘0‘; ch=prog[p++]; } ch=prog[p--]; syn=11;} else switch(ch) { case‘<‘:m=0;token[m++]=ch;ch=prog[p++]; if(ch==‘>‘) { syn=21; token[m++]=ch;} else if(ch==‘=‘) { syn=22; token[m++]=ch; } else { syn=20; ch=prog[p--]; } break; case‘>‘:m=0;token[m++]=ch;ch=prog[p++]; if(ch==‘=‘) { syn=24; token[m++]=ch; } else{ syn=23; ch=prog[p--]; } break; case‘:‘:m=0;token[m++]=ch;ch=prog[p++]; if(ch==‘=‘) { syn=18; token[m++]=ch; } else{ syn=17; ch=prog[p--]; } 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=25;token[0]=ch;break; case‘;‘:syn=26;token[0]=ch;break; case‘(‘:syn=27;token[0]=ch;break; case‘)‘:syn=28;token[0]=ch;break; case‘#‘:syn=0;token[0]=ch;break; default:syn=-1; } } main() { p=0; printf("请输入词法(以#结束):\\n"); do { ch=getchar(); prog[p++]=ch; }while(ch!=‘#‘); p=0; do{ scaner(); switch(syn) { case 11: printf("(%d,%d)\\n",syn,sum);break; default: printf("(%d,%s)\\n",syn,token); } }while(syn!=0); }
以上是关于词法分析的主要内容,如果未能解决你的问题,请参考以下文章