标签:
一、词法分析程序功能:
词法分析器的功能为输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等
(1) 关键字 是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。
(2) 标识符 用来表示各种名字,如变量名,数组名,过程名等等。
(3) 常数 常数的类型一般有整型、实型、布尔型、文字型等。
(4) 运算符 如+、-、*、/等等。
(5) 界符 如逗号、分号、括号、等等。
二、符号与种别码对照表
三、代码实现:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 100 char prog[SIZE],ch,token[8]; int p=0,syn,n,i; char *keyword[6]={"begin","then","if","while","do","end"};//定义关键字数组 void scaner(); void main() { int select=-1; p=0; printf("请输入源程序字符串(以‘#‘结束):\n"); do { ch=getchar(); prog[p++]=ch; }while(ch!=‘#‘); p=0; do { scaner(); switch(syn) { case -1:printf("词法分析 出错\n");break; default :printf("<%d,%s>\n",syn,token);break; } }while(syn!=0); printf("词法分析 成功\n"); getchar(); } void scaner() { for(n=0;n<8;n++) {token[n]=‘\0‘;} n=0; ch=prog[p++]; while(ch==‘ ‘) {ch=prog[p++];} if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)) { do{ token[n++]=ch; ch=prog[p++]; }while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘0‘&&ch<=‘9‘)); syn=10; for(n=0;n<6;n++)//在六个关键字中对比 { if(strcmp(token,keyword[n])==0) syn=n+1; } p--; } else if(ch>=‘0‘&&ch<=‘9‘)//判断输入的是否为整数常数 { p--; do { token[n++]=prog[p++]; ch=prog[p]; }while(ch>=‘0‘&&ch<=‘9‘); syn=11; return; } else { switch(ch) { 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; ch=prog[p++]; if(ch==‘=‘){token[1]=ch;syn++;} else p--; break; case ‘<‘:syn=20;token[0]=ch; ch=prog[p++]; if(ch==‘>‘){token[1]=ch;syn++;} else if(ch==‘=‘){token[1]=ch;syn=syn+2;} else p--; break; case ‘>‘:syn=23;token[0]=ch; ch=prog[p++]; if(ch==‘=‘){token[1]=ch;syn++;} else p--; 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: printf("词法分析出错! 请检查是否输入非法字符\n");syn=-1;break; } } }
四、程序运行结果截图:
标签:
原文地址:http://www.cnblogs.com/171-LAN/p/5924836.html