【问题描述】通过设计c语言常见单词的正规文法或正规式,而后得到NFA,再确定化得到DFA,根据DFA的转换矩阵或转换图,用c++语言实现词法分析器。
【输入形式】输入一段完整的c语言程序
【输出形式】各类单词的token字【样例输入】int main(){int a = 10;double b = -20.9;if(a<=b)        a+=b;return a;}【样例输出】line1:(type, int)line1:(keyword, main)line1:(bracket, ()line1:(bracket, ))line1:(bracket, {)line2:(type, int)line2:(identify, a)line2:(OPT, =)line2:(integer, 10)line2:(bracket, ;)line3:(type, double)line3:(identify, b)line3:(OPT, =)line3:(decimal, -20.9)line3:(bracket, ;)line4:(keyword, if)line4:(bracket, ()line4:(identify, a)line4:(OPT, <=)line4:(identify, b)line4:(bracket, ))line5:(identify, a)line5:(OPT, +=)line5:(identify, b)line5:(bracket, ;)line6:(keyword, else)line6:(identify, a)line6:(OPT, =)line6:(integer, 0)line6:(bracket, ;)line7:(keyword, return)line7:(identify, a)line7:(bracket, ;)line8:(bracket, })【样例说明】需要识别的关键字包括void, int, main, double, return, float, if, else, do, while, for, scanf, printf, char, sqrt, abs, 运算符(算术、关系、逻辑、位);需要识别的其他单词有标识符, 整数(十进制形式、指数形式),实数(十进制形式、指数形式),字符串;过滤注释及空格。【评分标准】根据设计文档的质量、lex文件的正确性,代码的正确性、代码的时间空间复杂度、识别单词的种类等综合评分

构造DFA:


看起来也不是DFA

直接上代码:

#include <iostream>
#include <string.h>
#include <vector>using namespace std;vector<string> keyword = { "scanf","printf","if","else","for","while","return","do","main","abs","sqrt","float" };
vector<string> type = { "int","void","char","double","short" };
vector<char> bracket = { ',', '\\', ';', ':', '(', ')', '[',  ']', '{', '}', '"', '\'' };struct Store {int line = 0;string token;string word;
};vector<Store> msg;class Compile
{public:void scan();void print();void Pushmsg(string s);void JudgeFloat(string s);
private:int line = 1;char ch = ' ';string word;Store temp;
};
void Compile::Pushmsg(string s)
{temp.line = line;temp.token = s;temp.word = word;msg.push_back(temp);word.clear();
}
void Compile::JudgeFloat(string s)
{word += ch;ch = getchar();if (ch == '+' || ch == '-'){word += ch;ch = getchar();}if (ch < '1' || ch > '9'){cout << "Error at Line " << line << ": Illegal floating point number \"" << word << "\".\n";exit(-1);}else{word += ch;while ((ch = getchar()) && (ch >= '0' && ch <= '9')){word += ch;}Pushmsg("float");}
}
void Compile::scan()
{/*读取第一个有效字符*/ch = getchar();while (ch == ' ' || ch == '\n'){if (ch == '\n')line++;ch = getchar();}while (ch != '\0' && ch != EOF){while (ch == ' ' || ch == '\n'){if (ch == '\n')line++;ch = getchar();}//判断是否整数、小数、浮点数if (ch == '+' || ch == '-'){word += ch;ch = getchar();if (ch == '='){word += ch;Pushmsg("OPT");ch = getchar();}elseif (ch >= '1' && ch <= '9'){word += ch;while ((ch = getchar()) && (ch >= '0' && ch <= '9')){word += ch;}Pushmsg("integer");}}if (ch >= '1' && ch <= '9'){word += ch;ch = getchar();while (ch >= '0' && ch <= '9'){word += ch;ch = getchar();}//判度小数、浮点数if (ch == '.'){word += ch;ch = getchar();while (ch >= '0' && ch <= '9'){word += ch;ch = getchar();}if (ch == 'e'){JudgeFloat(word);}elsePushmsg("decimal");}elsePushmsg("integer");}int flag = 0;if (ch == '_' || isalpha(ch)){while (isalnum(ch)||ch == '_'){word += ch;ch = getchar();}for (vector<string>::iterator it = keyword.begin(); it != keyword.end(); it++){if (word == (*it)){Pushmsg("keyword");flag = 1;}}if (flag == 0){for (vector<string>::iterator it = type.begin(); it != type.end(); it++){if (word == (*it)){Pushmsg("type");flag = 1;}}if (flag == 0){Pushmsg("identify");}}}if (ch == '/'){char temp = getchar();if (temp == '/'){do {ch = getchar();} while (ch != '\n');}elseif (temp == '*'){do {ch = getchar();} while (ch != '/');ch = getchar();}else if (temp == '='){word += "/=";Pushmsg("OPT");ch = getchar();}else{word += '/';Pushmsg("OPT");ch = getchar();}}// 0 开头的情况if (ch == '0'){word += ch; ch = getchar();Pushmsg("integer");}//对typeidentify进行判断char temp;if (ch == '%' || ch == '&'){temp = getchar();if (isalnum(temp)){word += ch;word += temp;Pushmsg("typeidentify");ch = getchar();}}int flag2 = 0;//对bracket进行匹配for (vector<char>::iterator it = bracket.begin(); it != bracket.end(); it++){if (ch == (*it)){word += ch; ch = getchar();Pushmsg("bracket");break;flag2 = 1;}}//bracket没有匹配成功,对OPT进行判断if (flag2 == 0){switch (ch){case '*':case '=':case '<':case '>':case '!':temp = getchar();if (temp == '=') {word += ch;word += temp; ch = getchar();Pushmsg("OPT");break;}else {word += ch; ch = getchar();Pushmsg("OPT");break;}break;default:break;}}}}void Compile::print()
{for (vector<Store>::iterator it = msg.begin(); it != msg.end(); it++)cout << "line" << (*it).line << ":(" << (*it).token << ", " << (*it).word << ')' << endl;}
int main()
{Compile cp;cp.scan();cp.print();
}

【编译原理】手工构造词法分析器相关推荐

  1. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  2. C++:编译原理实验之词法分析器

    一.实验目的 学会针对DFA转换图实现相应的高级语言源程序. 深刻领会状态转换图的含义,逐步理解有限自动机. 掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理. 加强对C语言的掌握 二.实验 ...

  3. 编译原理:简单词法分析器的设计与实现

    一.实验目的: 设计.编制并调试一个简单的c语言词法分析程序,加深对词法分析原理的理解 二.实验要求: 对单词的构词规则有明确的定义: 编写的分析程序能够正确识别源程序中的单词符号: 识别出的单词以( ...

  4. 编译原理 子集构造法实现

    输入说明 第一行 点数n 边数m 集合中字符数目k 第二行 集合中的字符 接下去m行 每一行三个值 起点 终点 经过的边上的字符 输出: 构造好的边 新构造节点包含的原先的点的集合 #include ...

  5. 【编译原理】构造产生如下语言的上下文无关文法各一个:

    13.构造产生如下语言的上下文无关文法各一个: (1) (an bm c2m | n,m≥0 } S->AB A->ε|aA B->ε|bBcc (2) w c wR| w∈{a,b ...

  6. 【编译原理】构造DFA例题

    1.构造一个DFA,它接受Σ = {0,1}上能被5整除的二进制数 列出状态转换表: 状态 添0 添1 0 0 1 1 2 3 2 4 0 3 1 2 4 3 4 绘制DFA: 2.画出一个最简的DF ...

  7. 编译原理——构造词法分析器(基于 Flex 构造和手工构造)

    文章目录 一.概述 二.基于 Flex 构造词法分析器 2.1 需求描述 2.2 编译流程 2.3 Flex 代码 三.手工构造词法分析器 3.1 需求描述 3.2 实现流程 3.3 C++ 代码 四 ...

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

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

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

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

最新文章

  1. 2003迁移到 Server 2008
  2. 44 ansible ad-hoc模式
  3. iptables规则备份恢复,firewalld的9个zone
  4. 用神经网络做分子模型:乙烯和乙炔的实验数据
  5. IDEA打开html文件时显示错误browser error提示找不到chrome或者别的浏览器
  6. Ubuntu/Fedora高版本安装海思SDK的方法
  7. 英语口语 Week14 Monday
  8. VC 创建NT服务程序
  9. 红帽加速开放混合云创新,助力企业成功迈向开源应用时代
  10. 如何用极路由新插件【搜狐视频】进行远程下载
  11. 字节跳动经营范围新增销售电子产品家用电器等
  12. SAP License:谈对财务人的解惑
  13. 快速崛起的物联网世界安全问题
  14. java(20) - 代理模式
  15. windows10彻底杀死卡死的顽固进程
  16. linux 多路径配置
  17. Android实现计算器布局(相对布局)
  18. java使用hdf.jar_在HDFView 2.14上查看使用h5py编写的大(12.5GB)HDF5文件
  19. mysql命令执行cmd命令_mysql cmd常用命令
  20. mysql如何设置host_如何快速修改MySQL用户的host属性

热门文章

  1. 学习Fluent必备经验(转贴)
  2. 强大的跨平台绘制流程图软件网站ProcessOn
  3. 【软工项目组】第十九次会议(Alpha版本完成并修复一些小BUG)
  4. 华为加码布局 VR/AR趁势启航
  5. 怎么样才能降低职称论文查重率?
  6. 数据分析大数据面试题大杂烩02
  7. 制定游戏机计算机配置清单,求吃鸡游戏电脑配置清单
  8. 会计的六大要素及等式
  9. 西门子200SMART 5轴伺服控制程序
  10. myeclipse/ eclipse断点没有对勾,断点打不上,方法无法访问