这学期在学编译原理,老师推荐的教材是陈火旺老师的,但自己却按着蒋立源老师的讲,幸好也无所谓,都一样啦。
上周实验课做了词法分析器部分,这部分的实验内容,包括预处理,单词分离并归类,也就这些。
我是用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)); }
以上只是词法分析的关键代码,其他都是些修饰性的代码,贴出来也无意义。
词法分析的程度有益于后面的语法分析。
感觉编译原理不是很好学,要用到很多的知识。数据结构,离散等。