这学期在学编译原理,老师推荐的教材是陈火旺老师的,但自己却按着蒋立源老师的讲,幸好也无所谓,都一样啦。
上周实验课做了词法分析器部分,这部分的实验内容,包括预处理,单词分离并归类,也就这些。
我是用C语言写的C语言的词法分析。
先将代码保存下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "compil.h"
void checkStr(char *str);
FILE digitFile = fopen("digitFile.c","w");
FILE keyFile = fopen("keyFile.c","w");
FILE identifierFile = fopen("identifierFile.c","w");
FILE errorFile = fopen("errorFile.c","w");
void lexical(FILE *fin)
{
int i;
char ch;
char str[80],file_name[20];
while(!feof(fin))
{
fscanf(fin,"%s",str); /*空格之间为一串*/
checkStr(str);
// printf("%s\n",str);
}
fclose(fin);
getch();
}
void checkStr(char *str)
{
char ch;
char tmp[20];
int i=0,j,k;
InitKeyTable();
InitOperatTable();
// printf("input str:");
// scanf("%s",str);
//ch = str[0];
do{
ch = str[i];
j = i; /* j 为每次循环的开始位置*/
strcpy(tmp,"");
if(isalpha(ch)){ /*字母开头*/
do{
ch = str[++i];
}while(isalpha(ch));
if(i<strlen(str)){
if(isdigit(ch)){
printf("%s\t\t标识符\n",&str[j]);
fprintf(identifierFile,"%s\t\t标识符\n",&str[j]);
break;
}
else{
strncpy(tmp,&str[j],i-j);
tmp[i-j]='\0';
if(!isKey(tmp)){
printf("%s\t\t 标识符\n",tmp);
fprintf(identifierFile,"%s\t\t标识符\n",tmp);
continue;
}
}
}
else
if(!isKey(str)){
printf("%s\t\t标识符\n",&str[j]);
fprintf(identifierFile,"%s\t\t标识符\n",&str[j]);
break;
}
}
else if(isdigit(ch)){ /*数字开头*/
do{
ch = str[++i];
}while(isdigit(ch));
if((i<strlen(str))&&isdigit(str[0]))
{ printf("%s\t\t错误的标识符 \n",str);
fprintf(errorFile,"%s\t\t错误的标识符 \n",str);
break;
}
else{
strncpy(tmp,&str[j],i-j);
tmp[i-j]='\0';
printf("%s\t\t 数字\n",tmp);
fprintf(digitFile,"%s\t\t 数字\n",tmp);
continue;
}
}
else { /*其他符号开头*/
do{
ch = str[++i];
}while(!isalpha(ch)&&!isdigit(ch));
strncpy(tmp,&str[j],i-j);
tmp[i-j]='\0';
if(!isOperat(tmp))
continue;
}
}while(i<strlen(str));
}
以上只是词法分析的关键代码,其他都是些修饰性的代码,贴出来也无意义。
词法分析的程度有益于后面的语法分析。
感觉编译原理不是很好学,要用到很多的知识。数据结构,离散等。
浙公网安备 33010602011771号