词法分析器C++读取外部txt(编译原理)
2020-02-01 04:54
3187 查看
词法分析器C++读取外部txt(编译原理)
词法分析器的参考文章:
https://blog.csdn.net/qq_32623363/article/details/79911321)
在原文章的基础上,我加入了关键字的识别,并将词法分析器设计为一个独立的程序,从文件中读取源程序,将其变换成相应的符号序列;
c++读取txt文件的参考文章https://blog.csdn.net/m0_38033475/article/details/94394087
#include <iostream> #include <string> #include<fstream> using namespace std; #define MAX_LEN 200 //将一个字符串内容清空 void clearArray(char *c) { int len = strlen(c); for(int i = 0; i < len; i++) { c[i] = '\0'; } } //判断是否为数字,true为是,false为不是 bool isDigit(char c){ if(c >= '0' && c <= '9') { return true; } else { return false; } } //判断是否为字母,ture为是,false为不是 bool isChar(char c) { if( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ) { return true; } else { return false; } } /* * 单词输出函数 * 该单词的意义 * 经过词法分析器分析后得到的单个单词 */ void print(string label, char *word) { ofstream outfile("output.txt",ios::app); outfile << label << ": " << word << endl; } /* * 词法分析函数 * 输入字符串指针 * 该函数对输入串进行分析,并分割成单词后输出 */ void analysis(char* inChar) { //用于对词法分析后的单词进行保存 char tempChar[MAX_LEN] = {0}; // 作为tempChar的一个索引 int j = 0; //用于遍历inChar字符数组 int i = 0; while(inChar[i] != '\0') { switch(inChar[i]) { case '-': tempChar[j++] = inChar[i]; print("减号",tempChar); j = 0; clearArray(tempChar); break; case '=': tempChar[j++] = inChar[i]; print("等号",tempChar); j = 0; clearArray(tempChar); break; case '+': tempChar[j++] = inChar[i]; print("加号",tempChar); j = 0; clearArray(tempChar); break; case ',': tempChar[j++] = inChar[i]; print("逗号",tempChar); j = 0; clearArray(tempChar); break; case ';': tempChar[j++] = inChar[i]; print("分号",tempChar); j = 0; clearArray(tempChar); break; case '/': tempChar[j++] = inChar[i]; print("除号",tempChar); j = 0; clearArray(tempChar); break; case '(': tempChar[j++] = inChar[i]; print("左括号",tempChar); j = 0; clearArray(tempChar); break; case ')': tempChar[j++] = inChar[i]; print("右括号",tempChar); j = 0; clearArray(tempChar); break; case '<': tempChar[j++] = inChar[i]; print("小于号",tempChar); j = 0; clearArray(tempChar); break; case '>': tempChar[j++] = inChar[i]; print("大于号",tempChar); j = 0; clearArray(tempChar); break; case '*': if(inChar[i+1] != '*') { tempChar[j++] = inChar[i]; print("乘法",tempChar); j = 0; clearArray(tempChar); } else { tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i]; print("平方",tempChar); j = 0; clearArray(tempChar); } break; default: //判断是否为字母+数字 if(isChar(inChar[i])) { if(inChar[i]=='i' && inChar[i+1]=='f') { tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i]; print("关键字",tempChar); j=0; clearArray(tempChar); i++; continue; } else if(inChar[i]=='d' && inChar[i+1]=='o') { tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i]; print("关键字",tempChar); j=0; clearArray(tempChar); i++; continue; } else if(inChar[i]=='t' && inChar[i+1]=='h' && inChar[i+2]=='e' && inChar[i+3]=='n') { tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i]; print("关键字",tempChar); j=0; clearArray(tempChar); i++; continue; } else if(inChar[i]=='e' && inChar[i+1]=='l' && inChar[i+2]=='s' && inChar[i+3]=='e') { tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i]; print("关键字",tempChar); j=0; clearArray(tempChar); i++; continue; } else if(inChar[i]=='w' && inChar[i+1]=='h' && inChar[i+2]=='i' && inChar[i+3]=='l' && inChar[i+4]=='e') { tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i++]; tempChar[j++] = inChar[i]; print("关键字",tempChar); j=0; clearArray(tempChar); i++; continue; } else { j = 0; tempChar[j++] = inChar[i]; while (isChar(inChar[i + 1]) || isDigit(inChar[i + 1])) { i++; tempChar[j++] = inChar[i]; } j = 0; print("标识符", tempChar); clearArray(tempChar); } } else if(isDigit(inChar[i])) { j = 0; tempChar[j++] = inChar[i]; while(isDigit(inChar[i+1])) { i++; tempChar[j++] = inChar[i]; } j = 0; print("数字",tempChar); clearArray(tempChar); } else { tempChar[j++] = inChar[i]; print("其他",tempChar); j = 0; clearArray(tempChar); } } i++; } } int main() { char inChar[MAX_LEN] = {0}; ifstream myfile("input.txt"); ofstream outfile("output.txt",ios::app); //ios::app指追加写入 //获取输入字符串,输入的字符串以空格、回车、换行作为结束符 myfile>>inChar; //对输入的字符串进行分析 analysis(inChar); myfile.close(); outfile.close(); return 0; }
输入示例:
输出:
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- C++实现编译原理的词法分析器
- c++ 编译原理 简单词法分析器
- 编译原理 C++ 词法分析器
- 编译原理:第七节 及词法分析器的C++和Python实现
- 【编译原理与技术】词法分析器(C++实现)
- 编译原理 - 词法分析器
- 如何利用C/C++逐行读取txt文件中的字符串(可以顺便实现文本文件的复制)
- c++从txt中读取数据,数据并不是一行路径(实用)
- 编译原理(1)词法分析程序(C++实现)
- C C++ Java C# JS编译、执行过程的原理入门分析
- 关于Basic程序解释器及编译原理的简单化(2)---C++封装好的Basic解释器
- 如何让CUDA编译普通C++文件,细说-x cu选项如何在CMakeLists.txt里面实现
- C++读取txt示例程序
- 求助:C++中读取txt文件如何忽略特定符号后的内容?
- 有关C++模板(template)的编译错误“error LNK2019: 无法解析的外部符号”的分析
- C++中txt文件读取和写入
- 编译原理(二) NFA的确定化及DFA的最小化的算法及C++实现
- 编译原理——词法分析器
- 编译原理——词法分析器
- C++中Txt文件读取和写入