一,词法分析器
作用:读取源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列
二,设计原理
1)C程序语言的符号分类:关键字、标识符、常数、运算符、界符
2)词法分析器的二元输出:<单词种别,单词符号属性值>
3)正规式和状态转换图

4)程序说明:
1>main 中打开源码文件,从第一个字符流读取
2>如果第一个是字符,则交给letterprocess(str); 处理
3>如果第一个是数字,则交给numberprocess(str); 处理
4>如果第一个是数字,则交给otherprocess(str); 处理
5>注意上述过程中,File *fp每读取一个词素,fp都会移动到下一个词素。对于空格的处理:isspace(ch)检查参数c是否为空格字符,也就是判断是否为空格('')、定位字符
('\t')、CR('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况
这个程序输出结果情况汇总:关键字、算术运算符、关系运算符、分割符号、特殊符号、注释符号、逻辑运算符、非法符号
三,程序源码
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <malloc.h>
- #include <conio.h>
- #define NULL 0
- FILE *fp;
- char ch;
- char *keyword[34]={"auto","break","case","char","const","continue","default","do","double",
- "else","enum","extern","float","for","goto","if","int","long","register",
- "return","short","signed","sizeof","static","struct","switch","typedef", "printf",
- "union","unsigned","void","volatile","while","main"};
- char *operatornum[6]={"+","-","*","/","++","--"};
- char *comparison[8]={"<","<=","=",">",">=","<>","==","!="};
- char *interpunction[8]={",",";",":=",".","(",")","{","}"};
- char *biaoshifu[6]={"%","$","^","&","_","#"};//特殊标识符
- char *zhushifu[3]={"//","/*","*/"};//注释符
- char *luoji[3]={"&&","||","!"};//逻辑运算符
-
-
- bool search(char searchstr[],int wordtype)//符号匹配
- {
- int i;
- switch (wordtype)
- {
- case 1:
- for(i=0;i<=33;i++)
- {
- if(strcmp(keyword[i],searchstr)==0)
- return(true);
- }
- break;
- case 2:
- for(i=0;i<=5;i++)
- {
- if(strcmp(operatornum[i],searchstr)==0)
- return(true);
- }
- break;
-
- case 3:
- for(i=0;i<=7;i++)
- {
- if(strcmp(comparison[i],searchstr)==0)
- return(true);
- }
- break;
-
- case 4:
- for(i=0;i<=7;i++)
- {
- if(strcmp(interpunction[i],searchstr)==0)
- return(true);
- }
-
- break;
- case 5:
- for(i=0;i<=5;i++)
- {
- if(strcmp(biaoshifu[i],searchstr)==0)
- return(true);
- }
- break;
- case 6:
- for(i=0;i<=2;i++)
- {
- if(strcmp(zhushifu[i],searchstr)==0)
- return(true);
- }
- break;
- case 7:
- for(i=0;i<=2;i++)
- {
- if(strcmp(luoji[i],searchstr)==0)
- return(true);
- }
- break;
- }
-
- return false;
- }
-
- char letterprocess (char ch)//字母处理函数
- {
- int i=-1;
- char letter[20];
- while (isalnum(ch)!=0)
- {
- letter[++i]=ch;
- ch=fgetc(fp);
- }
- letter[i+1]='\0';
- if (search(letter,1))
- {
- printf("<%s,关键字>\n",letter);
- //strcat(letter,"\n");
- //fputs('<' letter '>\n',outp);
- }
- else
- {
- printf("<%s,自定义变量>\n",letter);
- //strcat(letter,"\n");
- //fputs(letter,outp);
- }
-
- return(ch);
- }
-
- char numberprocess(char ch)//数字处理程序
- {
- int i=-1;
- char num[20];
- while (isdigit(ch)!=0)
- {
- num[++i]=ch;
- ch=fgetc(fp);
- }
- if(isalpha(ch)!=0)//数字后面是字符
- {
- while(isspace(ch)==0)
- {
- num[++i]=ch;
- ch=fgetc(fp);
- }
- num[i+1]='\0';
- printf("错误!非法标识符:%s\n",num);
- goto u;
- }
- num[i+1]='\0';
- printf("<%s,数字>\n",num);
-
- u: return(ch);
- }
-
- char otherprocess(char ch)//其他处理程序
- {
- int i=-1;
- char other[20];
- if (isspace(ch)!=0)
- {
- ch=fgetc(fp);
- goto u;
- }
- while ((isspace(ch)==0)&&(isalnum(ch)==0))
- {
- other[++i]=ch;
- ch=fgetc(fp);
- }
- other[i+1]='\0';
- if (search(other,2))
- printf("<%s,算数运算符>\n",other);
- else if (search(other,3))
- printf("<%s,关系运算符号>\n",other);
- else if (search(other,4))
- printf("<%s,分隔符号>\n",other);
- else if (search(other,5))
- printf("<%s,特殊标识符号>\n",other);
- else if (search(other,6))
- printf("<%s,注释符号>\n",other);
- else if (search(other,7))
- printf("<%s,逻辑运算符号>\n",other);
- else
- printf("错误!非法字符:%s\n",other);
- u: return (ch);
- }
-
- int main ()
- {
- char str;
- printf("**********************************词法分析器************************************\n");
- if ((fp=fopen("源程序.txt","r"))==NULL)
- printf("源程序无法打开!\n");
- else
- {
- str =fgetc(fp);//从流中读取字符
- while (str!=EOF)
- {
- if (isalpha(str)!=0)//如果是字符 isalpha包含在#include <cctype>
- str=letterprocess(str);
- else
- {
- if (isdigit(str)!=0)
- str=numberprocess(str);
- else
- str=otherprocess(str);
- }
-
- };
- printf("词法分析结束,谢谢使用!\n");
- //printf("点任意键退出!\n");
- }
- //c=getch();
-
- return 0;
- }
|