一、文件部分

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++实现简单的词法分析器相关推荐

  1. 编译原理(简单自动词法分析器LEX)

    编译原理(简单自动词法分析器LEX)源程序下载地址:  http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7 ...

  2. python解析器是什么_如何用python写一个简单的词法分析器

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

  3. python写词法分析器_如何用python写一个简单的词法分析器

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

  4. python写词法分析器_用python写一个简单的词法分析器

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

  5. C++写的一个简单的词法分析器(分析C语言)

    实验用: 几点注意: 1.代码又长又臭,时间关系,没有优化,冗余项多(我都看不下去了.囧) 2.加了一下简单的错误检测.(在mapping.h中定义了错误类型,可以查阅) 3.使用头文件宏定义来表示单 ...

  6. 标准纯C++实现简单的词法分析器(三)

    状态机实现: /**: nextToken     &        *    primary interface ......     *    return a Token from so ...

  7. 词法分析器java_利用Java实现简单的词法分析器实例代码

    首先看下我们要分析的代码段如下: 输出结果如下: 输出结果(a).PNG 输出结果(b).PNG 输出结果(c).PNG 括号里是一个二元式:(单词类别编码,单词位置编号) 代码如下: package ...

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

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

  9. 自己动手实现一个简单的JSON解析器

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...

最新文章

  1. Promise和setTimeout执行顺序 面试题
  2. Graphpad Prism作相关性分析图
  3. Python骚操作!你还在用PS制作电子签名吗?
  4. js 前加分号和感叹号的含义
  5. 安全审计报告_企业做税审的五大好处!税审报告和审计报告的区别
  6. Python version 3.3 required, which was not found in the registry
  7. 鸿蒙官网首页,鸿蒙官网-鸿蒙手游官网首页最新版预约 v1.0-优盘手机站
  8. Jmeter下载安装详细步骤(最新)
  9. 网络安全:9次实验带你学会网安
  10. 双线性映射matlab,[Matlab]双线性变换法设计数字带通滤波器
  11. solidity教程(四)僵尸作战系统
  12. “潜力工作者”会不会成为明年24届秋招统计参数中的受害者?
  13. 400+条实用C/C++框架、库、工具整理 ,你能想到的都在这里了
  14. android+apk+自动安装,Android版本更新下载apk自动安装的方法
  15. 【分享】品牌平面广告创意过程与思维技巧
  16. c语言实训报告 需求分析,软件需求实验报告2(软件功能描述与确认)
  17. 全屏css,CSS之全屏背景图
  18. 软链接解决存储空间不足
  19. [转载]刘兴亮|给同一天发的这三款社交产品算算命
  20. SpringBoot全局配置文件介绍

热门文章

  1. 硬核科普:什么是拓扑?
  2. 浅谈高性能计算(HPC)
  3. P5006 [yLOI2018] 大美江湖
  4. mysql sql调用函数_MySQL函数使用
  5. mysql函数中打印信息_mysql信息函数
  6. TensorFlow by Google 使用排序 APIMachine Learning Foundations: Ep #9 - Using the Sequencing APIs
  7. 设计模式学习笔记--享元(Flyweight)模式
  8. 2017年3月10日 星期五 --出埃及记 Exodus 23:28
  9. pixhawk6x/5x 电源插座/插头的型号
  10. 贵州支教之第一天(11月7日)