C++实现简单的词法分析器
一、文件部分
anly.cpp 进行词法分析
tools.h 词法分析所用到的工具
二、方法介绍
/*判断是否为大写字母*/
bool IsUpper( const char& ch_char );/*判断是否为小写字母*/
bool IsLower( const char& ch_char );/*判断是否为字母*/
bool IsLetter( const char& ch_char );/*判断是否为数字*/
bool IsNumber( const char& ch_char );/*判断是否为标识符*/
bool IsIdentifier( const char& ch_char );/*判断组中有没有目标字符串*/
bool IsStringInStrings( const C_String& o_string, C_String ao_strings[], const int& stringsLength );
三、代码部分
tools.h
# ifndef __TOOLS_H__# define __TOOLS_H__# include "bits/stdc++.h"using namespace std;typedef std::string C_String ; //新类型
typedef std::ifstream C_Ifstream ;
typedef std::stringstream C_StringStream ;const int KEYWORDS_LENGTH = 7;
C_String keywords[KEYWORDS_LENGTH] = { "print", "println", "integer", "boolean", "floating", "string", "function"
};bool IsUpper( const char& ch_char ){ //大写return ch_char >= 'A' && ch_char <= 'Z';
}bool IsLower( const char& ch_char ){ //小写return ch_char >= 'a' && ch_char <= 'z';
}bool IsLetter( const char& ch_char ){ //字母return IsUpper( ch_char ) || IsLower( ch_char );
}bool IsNumber( const char& ch_char ){ //数字return ( ch_char >= '0' && ch_char <= '9' ) || ch_char == '.';
}bool IsIdentifier( const char& ch_char ){ //后标识符return IsLetter( ch_char ) || IsNumber( ch_char ) || ch_char == '_';
}bool IsStringInStrings( const C_String& o_string, C_String ao_strings[], const int& stringsLength ){for( unsigned int index = 0; index < stringsLength; index++ ){if( ao_strings[index] == o_string ) return true;}return false;
}# endif
anly.cpp
/** anly.cpp** Created on: 2021.5.25* Author: LB_303*/
# include "tools.h"void Analyze( C_String text ){ //分析//缓冲字符串C_String o_bufferSave = "";for( unsigned int index = 0; index < text.length(); index++ ){//缓冲字符串清空o_bufferSave = "";//是字母或是下划线if( IsLetter( text[index] ) || text[index] == '_' ){//获取这个单词while( IsIdentifier( text[index] ) ){//将单词内容逐个塞入缓冲字符串o_bufferSave = o_bufferSave + text[index];index++;}index--;//退位//是关键字if( IsStringInStrings( o_bufferSave, keywords, KEYWORDS_LENGTH ) ){//打印信息cout << "关键字 ->" << o_bufferSave << endl;//不是}else{//打印信息cout << "标识符 ->" << o_bufferSave << endl;}}else if( IsNumber( text[index] ) ){//是数字//获取整个数字while( IsNumber( text[index] ) ){//将数字逐一塞到缓冲字符串o_bufferSave = o_bufferSave + text[index];index++;}index--;//退位//打印信息cout << "数字 ->" << o_bufferSave << endl;}else{//符号处理int bufferTotal = 1;switch( text[index] ){//左方括号case '['://向缓冲字符串塞入左方括号o_bufferSave += '[';//挪到下一位index++;//方括号内的内容塞到缓冲字符串while( bufferTotal != 0 ){if( text[index] == '[' ){bufferTotal++;}else if( text[index] == ']' ){bufferTotal--;}o_bufferSave += text[index];index++;}index--;//打印信息cout << "方括号组 ->" << o_bufferSave << endl;//除去头尾大括号o_bufferSave = o_bufferSave.substr( 1, o_bufferSave.length() - 2 );//分析方括号内内容Analyze( o_bufferSave );break;//左大括号case '{'://向缓冲字符串塞入左大括号o_bufferSave += '{';//挪到下一位index++;//大括号内的内容塞到缓冲字符串while( bufferTotal != 0 ){if( text[index] == '{' ){bufferTotal++;}else if( text[index] == '}' ){bufferTotal--;}o_bufferSave += text[index];index++;}index--;//打印信息cout << "大括号组 ->" << o_bufferSave << endl;//除去头尾大括号o_bufferSave = o_bufferSave.substr( 1, o_bufferSave.length() - 2 );//分析大括号内内容Analyze( o_bufferSave );break;//左括号case '('://向缓冲字符串塞入左括号o_bufferSave += '(';//挪到下一位index++;//括号内的内容塞到缓冲字符串while( bufferTotal != 0 ){if( text[index] == '(' ){bufferTotal++;}else if( text[index] == ')' ){bufferTotal--;}o_bufferSave += text[index];index++;}index--;//打印信息cout << "括号组 ->" << o_bufferSave << endl;//除去头尾括号o_bufferSave = o_bufferSave.substr( 1, o_bufferSave.length() - 2 );//分析括号内内容Analyze( o_bufferSave );break;//单引号case '\''://向右一个发现单引号if( text[index+1] == '\'' ){//向缓冲字符串塞入o_bufferSave += "''";//向右不是单引号}else{//向缓冲字符串塞入第一个单引号o_bufferSave += '\'';//挪到下一位index++;//获取单引号之间的内容塞到缓冲字符串里面while( text[index] != '\'' ){o_bufferSave += text[index];index++;}o_bufferSave += text[index];//再将第二格单引号塞入缓冲字符串//打印信息cout << "字符字面表达式 ->" << o_bufferSave << endl;}break;//同上case '"':if( text[index+1] == '"' ){o_bufferSave += "\"\"";}else{o_bufferSave += '"';index++;while( text[index] != '"' ){o_bufferSave += text[index];index++;}o_bufferSave += text[index];cout << "字符字面表达式 ->" << o_bufferSave << endl;}break;//分号case ';':cout << "分号->" << text[index] << endl;break;//其他default:break;}}}return;
}int main( int args, char* argv[] ){/** 文件路径* 文件读取流* 文件内容存放处* 字符串流*/char ach_filePath[] = "D:/anly/anly/text.txt";//此处换成要分析的文件路径ifstream o_fileInput ( ach_filePath );C_String o_fileText = "" ;C_StringStream o_stringstream ;if( !o_fileInput ){cout << "文件打开失败";}else{//字符流读取文件内容,包括空格换行o_stringstream << o_fileInput.rdbuf();//字符流将内容导入文件内容存放处,包括空格和换行o_fileText = o_stringstream.str();//分析Analyze( o_fileText );}return 0;
}
四、运行结果
(本人第一次写博客,写的不好请谅解一下~)
(个人原创)
(Rìnso bi LB_303 áns ei data 2021.ECF .)
C++实现简单的词法分析器相关推荐
- 编译原理(简单自动词法分析器LEX)
编译原理(简单自动词法分析器LEX)源程序下载地址: http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7 ...
- python解析器是什么_如何用python写一个简单的词法分析器
编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...
- python写词法分析器_如何用python写一个简单的词法分析器
编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...
- python写词法分析器_用python写一个简单的词法分析器
编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...
- C++写的一个简单的词法分析器(分析C语言)
实验用: 几点注意: 1.代码又长又臭,时间关系,没有优化,冗余项多(我都看不下去了.囧) 2.加了一下简单的错误检测.(在mapping.h中定义了错误类型,可以查阅) 3.使用头文件宏定义来表示单 ...
- 标准纯C++实现简单的词法分析器(三)
状态机实现: /**: nextToken & * primary interface ...... * return a Token from so ...
- 词法分析器java_利用Java实现简单的词法分析器实例代码
首先看下我们要分析的代码段如下: 输出结果如下: 输出结果(a).PNG 输出结果(b).PNG 输出结果(c).PNG 括号里是一个二元式:(单词类别编码,单词位置编号) 代码如下: package ...
- 编译原理:简单词法分析器的设计与实现
一.实验目的: 设计.编制并调试一个简单的c语言词法分析程序,加深对词法分析原理的理解 二.实验要求: 对单词的构词规则有明确的定义: 编写的分析程序能够正确识别源程序中的单词符号: 识别出的单词以( ...
- 自己动手实现一个简单的JSON解析器
1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...
最新文章
- Promise和setTimeout执行顺序 面试题
- Graphpad Prism作相关性分析图
- Python骚操作!你还在用PS制作电子签名吗?
- js 前加分号和感叹号的含义
- 安全审计报告_企业做税审的五大好处!税审报告和审计报告的区别
- Python version 3.3 required, which was not found in the registry
- 鸿蒙官网首页,鸿蒙官网-鸿蒙手游官网首页最新版预约 v1.0-优盘手机站
- Jmeter下载安装详细步骤(最新)
- 网络安全:9次实验带你学会网安
- 双线性映射matlab,[Matlab]双线性变换法设计数字带通滤波器
- solidity教程(四)僵尸作战系统
- “潜力工作者”会不会成为明年24届秋招统计参数中的受害者?
- 400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了
- android+apk+自动安装,Android版本更新下载apk自动安装的方法
- 【分享】品牌平面广告创意过程与思维技巧
- c语言实训报告 需求分析,软件需求实验报告2(软件功能描述与确认)
- 全屏css,CSS之全屏背景图
- 软链接解决存储空间不足
- [转载]刘兴亮|给同一天发的这三款社交产品算算命
- SpringBoot全局配置文件介绍
热门文章
- 硬核科普:什么是拓扑?
- 浅谈高性能计算(HPC)
- P5006 [yLOI2018] 大美江湖
- mysql sql调用函数_MySQL函数使用
- mysql函数中打印信息_mysql信息函数
- TensorFlow by Google 使用排序 APIMachine Learning Foundations: Ep #9 - Using the Sequencing APIs
- 设计模式学习笔记--享元(Flyweight)模式
- 2017年3月10日 星期五 --出埃及记 Exodus 23:28
- pixhawk6x/5x 电源插座/插头的型号
- 贵州支教之第一天(11月7日)