编写分析器有两种方法,一种是通过DFA对单词进行识别,二是通过直接编敲代码进行识别。
本程序採用DFA对单词进行识别。
DFA的实现方法。大概思想和书上一致,在程序中,则是用二维数组代表状态转换矩阵,用一维数组表示终态。
一个词法编辑要实现的功能主要包含下面几点:
可以识别标识符、keyword、数字和运算符,对凝视进行过滤。同一时候还能识别出程序错误。
使用说明:
本程序的输入由当前文件夹下的in.txt文件读取输入,输出为一系列二元式#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//用指针而不是二维数组表示。这样就不用指定字符串长度,仅仅是不能改动指针所指向字符串的内容
char *key[]={"int","char","float","double","void","const","for","if","else","then","while","switch","break","main","return"};
char buffer[20];//存储当前识别出的单词
char *identifier[50];
char *num[50];
int ident_num;//标志符数
int number;//数字数
int judgement_num(char c) {
if (c >= '0' && c <= '9') return 0;
else if (c == '.') return 1;
return -1;
}
int judge(char c){
if(c=='_') return 2;
else if(c>='0'&&c<='9') return 1;
else if(c>='a'&&c<='z'||c>='A'&&c<='Z') return 0;
return -1;
}
//next_i,next_j分别代表着状态转换表move的当前状态与接收到的字符
//width代表每一状态可能遇到的状态数,length代表终态集大小
int DFA(int begin,int move[],int width,int final[],int length,int(*judge)(char)){
int len=0,next_i,next_j,tmp;
char next_char;
memset(buffer,0,sizeof(buffer));
next_char=getchar();
next_i=begin;
while((next_j=judge(next_char))!=-1){
tmp=next_i;
next_i=move[next_i*width+next_j];
if(next_i==-1){
printf("move[%d][%d]has not next state
",tmp,next_j);
return -1;
}
buffer[len++]=next_char;
next_char=getchar();
}
ungetc(next_char,stdin);
buffer[len]='