这学期学习编译原理,第一个实验就是做一个简易的词法分析器。
自己写了一个,保存在这。以后需要的时候再来看看。
// 对于每一行输出的解释:
// 1.第一个为取出来的单词
// 2.第二个为该单词首字母出现的位置 [行: 列]
// 3.第三个为该单词的种类码:
// -1 错误
// 1 关键字
// 2 自定义标识码
// 3 数字
// 4 常用符号
// 5 运算符
// 6.比较或赋值符号
//
//
//
//
//#include <cstdio>
#include <algorithm>
#include <queue> //队列
#include <ctype.h>
#include<cstdlib>using namespace std;typedef struct word //单词结构体
{int row; //行int column; //列int category; //种别码char str[0];
}word;queue<word*> words; // 单词队列//关键字
const char* keys[] = { "if","else","for","while","do","return","break","continue","int","double","char","main" };//常用符号
const char* border[] = { ",",";","{","}","(",")","[","]","&" };//运算符
const char* arithmetic[] = { "+","-","*","/","%" };//比较符
const char* relation[] = { "<","<=","=","==","!=",">=",">" };// 单词转结构体
word* res_struct(int row, int column, int category, char* str, int n);// 词法分析器
int lexical_analyzer(FILE* fp);// 单词种类判断
int word_estimate(char* str, int n, int key, int row, int column);int main()
{FILE* fp = NULL;word *aword;if ((fp = fopen(", "r"))== NULL){printf("打不开文件n");return -1;}lexical_analyzer(fp); //词法分析while (!pty()) //输出队列中的单词{aword = words.front();words.pop();printf(""%s" [%d:%d] %dn", aword->str, aword->row, aword->column, aword->category);}if (fp != NULL){fclose(fp);}return 0;
}/// <summary>
/// 单词转结构体
/// </summary>
/// <param name="row">行数</param>
/// <param name="column">列数</param>
/// <param name="category">种别码</param>
/// <param name="str">单词</param>
/// <param name="n">单词长度</param>
/// <returns>转换后的结构体</returns>
word* res_struct(int row, int column,int category, char* str, int n)
{word* a_word = (word*)malloc(sizeof(word) + n+1);if(a_word){a_word->column = column;a_word->row = row;a_word->category = category;strcpy(a_word->str, str);}return a_word;
}/// <summary>
/// 词法分析器
/// </summary>
/// <param name="fp">文件指针</param>
/// <returns>0 表示分析结束</returns>
int lexical_analyzer(FILE* fp)
{char cbuffer = fgetc(fp);//获得一个字符char tp[30] = { 0 }; //临时单词int row = 1; //行int column = 1; //列int n = 0; //单词长度int key = 0; //单词模糊类型while (cbuffer != EOF) //直到文件末尾{n = 0;if (isalpha(cbuffer) || cbuffer == '_') //第一个字符为字母或下划线{while ((isalpha(cbuffer)) || (isdigit(cbuffer)) || cbuffer == '_') //读出整个单词{tp[n++] = cbuffer;cbuffer = fgetc(fp);column++;}tp[n] = '