简单的词法分析器

  • 词法分析后的结果
  • 词法分析的过程
  • 词法分析程序

词法分析后的结果

对一个源程序进行词法分析,得到一个二元式,单词的符合,以及对应的内码值

词法分析的过程


程序一开始的时候,先对那些常见标识符和操作符进行加载到一个哈希表中(单纯为了查找方便),并对维护一个唯一的id映射的关系

// 初始化
void init() {for (auto& e : keyBuf) keyWord[e] = ++idx;for (auto& e : operBuf)   oper[e] = ++idx;operand = ++idx;tag = ++idx;
}

然后从事先准备好的解析文件中,将里面的程序部分按行读取,得到一个字符串

 ifstream fp(fileName);string rbuf;init();while (getline(fp, rbuf)) {buf += rbuf + "\n";}

然后就可以进行解析了,按照顺序在字符串中从前向后进行解析,遇到字母就记录一下,如果遇到空格,符号,数字则需要记录一下,说明当前字母已经构成了一个标识符,维护一个哈希表的映射关系,然后再处理对应的符号或者数字。

词法分析程序

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
#include <fstream>
#include <unordered_map>
#include <string>
#include <vector>using namespace std;const string  fileName   =  "text.cpp";
vector<string> keyBuf = { "int", "if", "else", "while", "do", "return","for" ,"include"};
vector<string> operBuf    = {"#" ,"<", ">", "!=", ">=", "<=", "==", ",", ";", "(", ")", "{", "}", "+", "-", "*", "/", "=" ,"++"};
vector<string> numBuf = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };int     idx;                            // 词法标号
string  buf;                            // 源程序
int                         operand;    // 操作数
int                         tag;        // 标识符
unordered_map<string, int>    keyWord;    // 关键字
unordered_map<string, int>    oper;       // 操作符void init();          // 初始化
void analyse();         // 词法解析
bool isSpace(char ch);  // 是否为空格,tab,回车
void show(string first, int index); // 展示int main() {ifstream fp(fileName);string rbuf;init();while (getline(fp, rbuf)) {buf += rbuf + "\n";}cout << "词法分析器解析源文件: \n\n";cout << "==================================================" << endl;cout << buf << endl;analyse();        // 解析fp.close();return 0;
}// 初始化
void init() {for (auto& e : keyBuf) keyWord[e] = ++idx;for (auto& e : operBuf)   oper[e] = ++idx;operand = ++idx;tag = ++idx;
}void show(string first, int index) {printf("[ %s -> ( %d , %s )] \n", first.c_str(), index, first.c_str());
}// 是否为空格,tab,回车
bool isSpace(char ch) {return ch == ' ' || ch == '\n' || ch == '\t';
}// 是否为操作符
bool isOper(char ch) {string s(1,ch);//if (oper.find(s) != oper.end()) cout << "no find " << s << endl;return oper.find(s) != oper.end();
}// 是否是数字
bool isNum(string& str) {for (auto& ch : str) if (ch < '0' || ch > '9') return false;return true;
}// 标识符,数字 解析
void check(string& str) {if (str == "") return;// 是否为数字bool ret = isNum(str);if (ret) {// numbershow(str, operand);}else {if (keyWord.find(str) == keyWord.end()) {// 标识符show(str, tag);return;}show(str, keyWord[str]);}
}// 操作符解析
void checkOper(int& index) {int p = index;string t;for (; p < buf.size(); p++) {if (oper.find(t + buf[p]) == oper.end()) break;t += buf[p];}show(t, oper[t]);index = p - 1;
}// 词法解析
void analyse() {string str;int n = buf.size();for (int i = 0; i < n; i++) {if (isSpace(buf[i])) {check(str);str = "";}else if (isOper(buf[i])) {check(str);checkOper(i);str = "";}else {str += buf[i];}//cout << str << endl;}
}

编译原理,词法分析器相关推荐

  1. 【SEUSE】编译原理 - 词法分析器实验报告

    [SEU&SE]编译原理 - 词法分析器实验报告 README 一. 实验目的 二. 实验环境 1. 开发环境: 2. 运行环境 三. 实验内容 1. 主要内容 2. 主要功能 3. 种别码 ...

  2. 编译原理——词法分析器

    采用java图形化界面编写了java语言的词法分析器,该分析器可识别所有java关键字.软件工程课程中编译原理实验. Keyword.jvav package org.kyc.test1;public ...

  3. 编译原理--词法分析器(python语言实现)

    词法分析器 最近在学习编译原理.由于实验要求有词法分析器,这里我就先记录一下词法分析器实现过程以及具体思路. 目标语言 此处我选择的目标语言是c语言的子集来进行词法分析. 实现语言 此处我选用的语言是 ...

  4. 编译原理词法分析器的c++实现

    一.题目的理解和说明 编译原理这门课是计算机专业的核心课程之一,是一门研究软件是什么,为什么可以运行,以及怎么运行的学科.编译系统的改进将会直接对其上层的应用程序的执行效率,执行原理产生深刻的影响.编 ...

  5. 编译原理———词法分析器

    1.目的 设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解. 2.实现功能:词法分析 输入:所给文法的源程序字符串. 输出:二元组(syn,token或sum)构成的序列.其 ...

  6. 南华大学编译原理----词法分析器的设计与实现、语法分析器的设计与实现

    下载链接:(各位同学不需要充钱哈,这种我也没有收益,去淘宝上面找个代下,大概0.5元就能下载实验报告,用来给同学们参考,下载积分不是我设置的,是网站自己默认的) ------------------- ...

  7. 编译原理——词法分析器的设计

    两种设计方案以及各自优缺点 我们先学手工构造 词法分析器手工构造 关系运算符的手工构造: 上面这个图其实我有点疑惑,下面说一下,我自己的理解 C语言中的关系运算符,有<. <=. > ...

  8. 编译原理—词法分析器(Java)

    1.当运行程序时,程序会读取项目下的program.txt文件 2. 程序将会逐行读取program.txt中的源程序,进行词法分析,并将分析的结果输出. 3. 如果发现错误,程序将会中止读取文件进行 ...

  9. 编译原理-词法分析器

    词法分析器 实验要求 1.根据以下的正规式,编制正规文法,画出状态图: 标识符 <字母>(<字母>|<数字字符>)* 十进制整数 0 | ((1|2|3|4|5|6 ...

  10. 编译原理词法分析器(C/C++)

    前言&思路 词法分析器不用多说,一开始我还不知道是什么样的,看了下别人的博客,再看看书,原来是输出二元组,这不就是字符串操作嘛.然后细看几篇博客,发现大都是用暴力判断来写的.我对代码重复性比较 ...

最新文章

  1. 算法---给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合
  2. Nginx与Redis解决高并发问题
  3. LibreOJ 数列分块入门
  4. HDU 1325 Is It A Tree? 并查集
  5. XCTF WEB webshell
  6. 微信开发 :WeixinPayInfoCollection尚未注册Mch 问题解决
  7. java中堆与栈的区别_java中堆和栈的区别分析
  8. oracle归档日志的概念,浅谈Oracle归档日志
  9. 设置Spring 3开发环境
  10. 在Linux 中编写并运行C语言
  11. 获得系统异常的详细信息
  12. Java定时任务解决方案
  13. Electron —— Cannot find module ‘index.js’
  14. 不允许同时配置%Error 140357: Simultaneous configs not aUowed.问题解决
  15. 【MySQL 实战】02. 一条SQL 更新语句是如何具体执行的呢?
  16. 使用MySQL Workbench备份和还原数据库
  17. wow大芒果mysql,大芒果魔兽世界3.3.5GM命令范例.doc
  18. 机器人定位误差标定模型
  19. 【大数据】城市公交网络分析与可视化(二):获取公交行驶路径并绘制散点图
  20. java dismiss_为什么我的dismiss()方法无法关闭自定义警报对话框

热门文章

  1. c语言课程设计报告 火车票,C语言课设报告火车票系统源代码.doc
  2. equals和hashcode总结
  3. 阿里云EMAS超级App助力Agmo电动车超级应用程序发布
  4. jeesite 登录模块
  5. 干货:如何有效的做好工程采购、分包及合同管理?
  6. mysql ormlite_ormlite jdbc 使用例子
  7. java containsany_判断字符串中是否存在的几种方案:string.indexof、string.contains、list.contains、list.any几种方式效率对比...
  8. a标签新窗口打开,解决跨域问题
  9. css如何使下划线位置远,使用css调整下划线和文本之间的距离
  10. vue + XLSX解析excel数据