记录C,C++关键字的位置,直接跳过注释和字符串文本。(修正)

news2025/2/1 11:48:51

依据第二版本,可以写一个跳过注释的查找函数

C_IndexOfWord

Java_IndexOfWord

CSharp_IndexOfWord

还有一种方法,可以先把所有注释用空格代替,查出的字符位置也不变。

以前版本:

DList<TextColor> Syntax::GetTextColorPosForC_Keywords1() const
{
    DList<TextColor> dtResult;
    int nPos = -1;

    if (_LanguageType == LanguageType::C)//-----------------------------------C&C++ Begin
    {


        //-----------------------------------------------------------------关键字
        for (_string s : C_Keyword)
        {
            nPos = _code.IndexOfWord(s);

            while (nPos != -1)
            {
                dtResult.Add(TextColor(nPos, s.length(), GetColor(SyntaxType::关键字)));

                nPos = _nh_en.IndexOfWord(s, nPos + s.length());
            }
        }
    }

    return dtResult;
}
 

修改版本:

/// <summary>
///  记录C,C++关键字的位置,跳过注释和字符串文本。
/// </summary>
/// <returns></returns>
/// 创建时间: 2022-12-19      最后一次修改时间:2022-12-19
DList<TextColor> Syntax::GetTextColorPosForC_Keywords2() const
{
    DList<TextColor> dtResult;

    if (_code.length() <= 0) return dtResult;

    const _char *p = _code.c_str();
         
    _string sWord(_t(""), 50);  //50个_char缓冲

    Color_  cKeyWordColor = GetColor(SyntaxType::关键字);

    for(int i = 0; i < _code.length(); ++ i)
    {
        if ( p[i] == _t('/'))
        {
            if (i + 1 < _code.length())
            {
                if (p[i + 1] == _t('/') ) //是"//"注释,查找注释结束位置 \n ,跳过注释
                {
                    i += 2;
                    while (p[i] != 0 && p[i] != '\n')
                    {
                        ++i;
                    }
                }
                else if (p[i + 1] == _t('*')) //是"/*"注释,查找注释结束位置 */ ,跳过注释
                {
                    i += 2;
                    while (p[i] != 0 && p[i] != _t('*'))
                    { 
                        if (p[i + 1] != 0 && p[i + 1] != '/') //结束位置
                        {
                            ++i;
                        }
                        else
                        {
                            ++i;
                            break;
                        }
                    }
                }
            }
            else
            {
                return dtResult;
            }      
        }
        else if (p[i] == _t('\"')) //字符开始
        {
            ++i;
            while(p[i] != 0 && p[i] != '\"')
            {
               ++i;   
            }         
        }

        if (gs.s_Syntax_IsWordSeparator(p[i]))
        {
            //关键字最小长度大于2,且全是小写字母
            if (sWord.length() >= 2 && sWord.IsAllLowerCaseEnglishLetter())
            {
                if (C_Keyword.findNoteItem(sWord) != null) //是关键字,记录位置
                {
                    dtResult.Add(TextColor(i - sWord.length(), sWord.length(), cKeyWordColor));
                }

                //log::d(_getc(sWord));
            }
   

            sWord.Clear(); //清空
        }
        else
        {
            sWord.add(p[i]);
        }         
    }

    return dtResult;
}

/// <summary>
///  记录C,C++关键字的位置,跳过注释和字符串文本。
/// </summary>
/// <returns></returns>
/// 创建时间: 2022-12-19      最后一次修改时间:2022-12-19
DList<TextColor> Syntax::GetTextColorPosForC_Keywords2() const
{
    DList<TextColor> dtResult;

    if (_code.length() <= 0) return dtResult;

    const _char *p = _code.c_str();
         
    _string sWord(_t(""), 50);  //50个_char缓冲

    Color_  cKeyWordColor = GetColor(SyntaxType::关键字);

    for(int i = 0; i < _code.length(); ++ i)
    {
        if ( p[i] == _t('/'))
        {
            if (i + 1 < _code.length())
            {
                if (p[i + 1] == _t('/') ) //是"//"注释,查找注释结束位置 \n ,跳过注释
                {
                    i += 2;
                    while (p[i] != 0 && p[i] != '\n')
                    {
                        ++i;
                    }
                }
                else if (p[i + 1] == _t('*')) //是"/*"注释,查找注释结束位置 */ ,跳过注释
                {
                    i += 2;
                    while (p[i] != 0 && p[i] != _t('*'))
                    { 
                        if (p[i + 1] != 0 && p[i + 1] != '/') //结束位置
                        {
                            ++i;
                        }
                        else
                        {
                            ++i;
                            break;
                        }
                    }
                }
            }
            else
            {
                return dtResult;
            }      
        }
        else if (p[i] == _t('\"')) //字符开始
        {
            ++i;
            while(p[i] != 0 && p[i] != '\"')
            {
               ++i;   
            }         
        }

        if (gs.s_Syntax_IsWordSeparator(p[i]))
        {
            //关键字最小长度大于2,且全是小写字母
            if (sWord.length() >= 2 && sWord.IsAllLowerCaseEnglishLetter())
            {
                if (C_Keyword.findNoteItem(sWord) != null) //是关键字,记录位置
                {
                    dtResult.Add(TextColor(i - sWord.length(), sWord.length(), cKeyWordColor));
                }

                //log::d(_getc(sWord));
            }
   

            sWord.Clear(); //清空
        }
        else
        {
            sWord.add(p[i]);
        }         
    }

    return dtResult;
}

其中:

    /// <summary>
    /// 判断字符是否单词的有效分隔符
    /// </summary>
    /// <param name="c"></param>
    /// <returns></returns>
    inline static bool s_Syntax_IsWordSeparator(_char c) {
        return (gs.c_IsPunctuation(c) || gs.c_IsControl(c) || Math_::strchr(IdentifierSpecial, c) != -1) && c != _t('_');
    }


const _char* global_c_str::IdentifierSpecial = _t("~!@#$%^&*()+-/.{}[]|\\ `=");

虽然结果正确,但不严谨,以下修正:

/// <summary>
///  记录C,C++关键字的位置,跳过注释和字符串文本。
/// </summary>
/// <returns></returns>
/// 创建时间: 2022-12-19      最后一次修改时间:2022-12-21  已测试
DList<TextColor> Syntax::GetTextColorPosForC_Keywords2() const
{
    DList<TextColor> dtResult;

    if (_code.length() <= 0) return dtResult;

    const _char *p = _code.c_str();
         
    _string sWord(_t(""), 50);  //50个_char缓冲

    Color_  cKeyWordColor = GetColor(SyntaxType::关键字);

    for(int i = 0; i < _code.length(); ++ i)
    {
        if ( p[i] == _t('/'))
        {
            ++i;

            if (i < _code.length())
            {
                if (p[i] == _t('/') ) //是"//"注释,查找注释结束位置 \n ,跳过注释
                {
                    ++i;

                    bool bFind = false; //查找下一个 "\n"
                    while (i  < _code.length())
                    {
                        if (p[i] == '\n')
                        {
                            ++i;
                            bFind = true;        
                            break;
                        }
                        ++i;
                    }
                    if (!bFind) return dtResult;
                }
                else if (p[i] == _t('*')) //是"/*"注释,查找注释结束位置 */ ,跳过注释
                {
                    ++i;

                    bool bFind = false;
                    while (i + 1 < _code.length()) //查找下一个 "*/"
                    {
                        if (p[i] == '*' && p[i + 1] == '/')
                        {
                            i += 2;
                            bFind = true;
                            break;
                        }
                        ++i;
                    }
                    if (!bFind) return dtResult;
                }
            }
            else
            {
                return dtResult;
            }      
        }
        else if (p[i] == _t('\"')) //字符开始
        {
            ++i;
            bool bFind = false; //查找下一个 "\""
            while (i + 1 < _code.length())
            {
                if (p[i] == '\"')
                {
                    i += 2;
                    bFind = true;
                    break;
                }
                ++i;
            }
            if (!bFind) return dtResult;
        }

        if (gs.s_Syntax_IsWordSeparator(p[i]))
        {
            //关键字最小长度大于2,且全是小写字母
            if (sWord.length() >= 2 && sWord.IsAllLowerCaseEnglishLetter())
            {
                if (C_Keyword.findNoteItem(sWord) != null) //是关键字,记录位置
                {
                    dtResult.Add(TextColor(i - sWord.length(), sWord.length(), cKeyWordColor));
                }

                //log::d(_getc(sWord));
            }
   

            sWord.Clear(); //清空
        }
        else
        {
            sWord.add(p[i]);
        }         
    }

    return dtResult;
}

另加上查找函数:

/// <summary>
	/// 跳过注释和字符串值查找字符,这里假设注释和字符串书写模式正确,而且你
	/// 不要去查找一个双引号( '\"') ,永远都返回-1。
	/// </summary>
	/// <param name="c"></param>
	/// <param name="iFindStart"></param>
	/// <param name="bMatchCase"></param>
	/// <returns></returns>
	/// 创建时间: 2021-12-21      最后一次修改时间:2022-12-21    已测试
	int Syntax_C_IndexOf(const _char c, const int iFindStart = 0)const
	{
		int iStart = iFindStart <= 0 ? 0 : iFindStart;

		if (c == 0 || _nLength <= 0 || iStart >= _nLength) return -1;

		const _char* p = _pData;

		for (int i = iStart; i < _nLength; ++i)
		{
			if (p[i] == _t('/'))
			{
				++i;

				if (i < _nLength)
				{
					if (p[i] == _t('/')) //是"//"注释,查找注释结束位置 \n ,跳过注释
					{
						++i;
						bool bFind = false;
						while ( i < _nLength)
						{
							if (p[i] == '\n') //查找下一个 "\n"
							{
								bFind = true;
								++i;
								break;
							}
							++i;
						}
						if (!bFind) return -1;
					}
					else if (p[i] == _t('*')) //是"/*"注释,查找注释结束位置 */ ,跳过注释
					{
						++i;

						bool bFind = false;
						while (i + 1 < _nLength) //查找下一个 "*/"
						{
							if (p[i] == '*' && p[i + 1] == '/')
							{
								i += 2;
								bFind = true;
								break;
							}
							++i;
						}
						if (!bFind) return -1;
					}
					else
					{
						if (p[i] == c) { return i; }
					}
				}
				else
				{
					return -1;
				}
			}
			else if (p[i] == _t('\"')) //字符开始
			{
				++i;
				bool bFind = false;
				while (i < _nLength)   //查找下一个 "\""
				{
					if (p[i] == '\"')
					{
						bFind = true;
						++i;
						break;
					}
					++i;
				}
				if (!bFind) return -1;
			}
			else
			{
				if (p[i] == c) { return i; }
			}

		}

		return -1;
	}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(三分钟)学会kd-tree 激光SLAM点云搜索常见

Kd-Tree&#xff1a; 今天来介绍一下有关Kdtree的相关概念&#xff0c;它是一维线段树的多维推广。Kd-tree常用在激光点云编程中使用&#xff0c;Kd-tree简称k维树&#xff0c;是一种空间划分的数据结构&#xff0c;常被用于高维空间中的搜索&#xff0c;比如范围搜索和最近邻…

动态规划问题——最长公共子序列问题

题目: 给定两个字符串 str1 和 str2 &#xff0c;返回两个字符串的最长公共子序列。 举例&#xff1a; str1 "1A2C3D4B56" str2 "B1D23CA45B6A" 最长公共子序列为&#xff1a;"123456" 或 "12C4B6" 返回哪个都行 思路&#xf…

「内核知识」Linux下的系统调用write

本文以x86_64平台为例&#xff0c;分析linux下的系统调用是如何被执行的。 假设目标系统调用是&#xff0c;其对应的内核源码为&#xff1a; // fs/read_write.c SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,size_t, count) {return ksys_write(fd, …

通过国产化低代码平台搭建设备管理系统,助力中国航天企业信息化建设

编者按&#xff1a;掌握软件自主权&#xff0c;支持信创国产化。本文分析了国产化低代码平台的意义&#xff0c;并介绍了低低代码平台是如何为航天企业提高信息化建设水平的。 关键词&#xff1a;国产化&#xff0c;第三方对接能力&#xff0c;文件管理 以容器、微服务、DevOp…

Linux内核中的open方法

在linux下&#xff0c;假设我们想打开文件/dev/tty&#xff0c;我们可以使用系统调用open&#xff0c;比如&#xff1a; int fd open("/dev/tty", O_RDWR, 0); 本文将从源码角度看下&#xff0c;在linux内核中&#xff0c;open方法是如何打开文件的。 首先看下入…

【opencv】centos下opencv的编译(带opencv_contrib扩展包)

目录1.安装cmake2.opencv安装文件准备可选安装3.进行编译4.进行安装5.使用测试编译步骤&#xff1a;1.安装cmake 安装wget: 应该已安装gcc工具套组&#xff1a; yum install sudo yum install -y gcc gcc-c make automake yum install -y wget wget https://cmake.org/files…

【树莓派不吃灰】兄弟连篇④ Shell编程

目录1、Shell基础1.1 脚本执行方式1.1.1 echo1.1.2 脚本执行1.2 Bash基本功能1.2.1 history1.2.2 命令补全1.2.3 命令别名1.2.4 常用快捷键1.2.5 输出输入重定向1.2.6 多命令顺序执行与管道符1.2.7 通配符和特殊符号1.3 Bash变量1.3.1 用户自定义变量1.3.2 环境变量1.3.3 位置变…

Hudi入门到实战

简介 Apache Hudi&#xff08;Hadoop Upserts Delete and Incremental&#xff09;是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&#xff0c;同时保持…

用于医学诊断的菁染料ICG-Sulfo-OSu,活性基团修饰ICG

英文名&#xff1a;ICG-Sulfo-EG4-OSu 激发波长: 780nm; 发射波长: 800nm 分子量: 1777.36 溶剂:DMSO 凯新生物描述&#xff1a; (ICG)是一种用于医学诊断的菁染料。它用于测定心输出量、肝功能和肝脏血流量&#xff0c;以及用于眼科血管造影。它的峰值光谱吸收接近800纳米…

【课程整理】随机系统期末整理

文章目录1 概率论部分 (1-4)概率空间随机变量概率分布随机变量的函数仍然是随机变量条件期望2 随机过程 (5-7)随机过程Martingale停时马尔科夫链3 参数估计 (8-10)参数估计问题充分统计量贝叶斯估计非随机估计部分思维导图如下&#xff0c;私信发送html完整版 1 概率论部分 (1-…

3.path路径模块

目录 1 路径问题 2 直接给绝对路径 3 用 __dirname 表示绝对路径 4 path模块常用方法 4.1 路径拼接 path.join() 4.2 从路径字符串中解析出文件名 path.basename() 4.3 获取路径中的扩展名 path.extname() 1 路径问题 当我们使用 ./ 或是 ../ 表示相对路径的时…

小林Coding阅读笔记:操作系统篇之硬件结构,中断问题

前言 参考/导流&#xff1a; 小林coding - 2.6 什么是软中断&#xff1f;学习意义 学习CPU与外设如何去提升处理效率的设计思想&#xff0c;异步机制的理解与借鉴掌握相关的Linux命令&#xff0c;帮助问题排查 相关说明 该篇博文是个人阅读的重要梳理&#xff0c;仅做简单参…

【修饰性PEG供应商】mPEG-DBCO_DBCO mPEG_甲氧基聚乙二醇环辛炔

【产品描述】 西安凯新生物科技有限公司是国内业PEG供应商&#xff0c;可以提供不同分子量的PEG衍生物&#xff0c;小分子PEG的循环节可以做到1-36个&#xff0c;高分子PEG分子量从1000-40000不等&#xff0c;可以修饰的基团有&#xff1a;氨基类&#xff0c;NHBOC类&#xff0…

多层板PCB设计中电源平面相对地平面为什么要进行内缩

大家是否观察过&#xff0c;有一些人绘制的PCB&#xff0c;在GND层和电源层会进行一定程度的内缩设计&#xff0c;那么大家有没有想过为什么要内缩呢。需要搞清楚这个问题&#xff0c;我们需要来先了解一个知识点&#xff0c;那就是“20H”原则&#xff1a; 20H原则主要是为了减…

MySQL的数据结构

阅读目录MySQL 数据结构用 btree 做的为什么不用红黑树叉树呢&#xff1f;什么是 B-Tree&#xff08;B-树&#xff09;&#xff1f;什么是 BTree&#xff1f;BTree 相对于 B-Tree 的几点不同MySQL 数据结构用 btree 做的 为什么不用红黑树叉树呢&#xff1f; 不用红黑树是因为…

计算机3D数学基础 旋转的三种表示方法 学习笔记

旋转的三种表示方法&#xff1a;1、矩阵 2、欧拉角 3、四元数 矩阵的缺点&#xff0c;记录旋转角度要记录9个数 欧拉角的heading就是绕着y(绿色轴)轴30 &#xff0c;容易理解 三种旋转方式的优缺点&#xff1a; 矩阵&#xff1a;缺点&#xff1a;1、上手难&#xff0c;记…

Android常用布局总结之(LinearLayout、TableLayout、GridLayout、RelativeLayout)

一、LinearLayout 线性布局 LinearLayout 是一个视图组&#xff0c;用于使所有子视图在单个方向&#xff08;垂直或水平&#xff09;保持对齐。您可以使用 android:orientation 属性指定布局方向。 android:orientation&#xff0c;指定布局方向&#xff0c;vertical-竖向布局…

在线点餐网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 管理员&#xff1a; 1、管理门店介绍、联系我们 2、对公告类型、公告信息增删改查 3、对菜品类型、菜品信息增册改查 4…

【计算机考研408】2023考研408相关题目预测总结

目录数据结构选择1-时间复杂度选择2-栈或者队列选择3-二叉树、树、森林选择4-并查集选择5-红黑树选择6-图的概念选择7-图的应用选择8-B树&#xff08;B-树&#xff09;选择8-B树选择8-B树与B树的区别选择8-B树与B树的相关应用选择9-查找算法选择10、11-排序算法综合应用题41-算…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler 列文章目录 文章目录 前言 一、知识点提取 二、案例需求分析 三、…