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

news2025/2/3 8:54:40

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

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("~!@#$%^&*()+-/.{}[]|\\ `=");

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

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

相关文章

m基于matlab的连续相位调制(CPM)解调系统仿真,包括解调,同步等模块

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着数字通信技术的飞速发展&#xff0c;数字通信的调制技术也得到了快速发展&#xff0c;其中连续相位调制(Continuous Phase Modulation&#xff0c;CPM)作为一种全新的通信调制方法得到了越来…

GNN 极简入门

文章目录图基本知识GNN简介GCNPYG极简入门Data Handling of GraphsCommon Benchmark DatasetsMini-batchesData TransformsLearning Methods on Graphs图基本知识 &#x1f638;图是由节点的有穷非空集合和节点之间边的集合组成&#xff0c;通常表示为 G(V,E)G(V, E)G(V,E)&am…

涨知识系列:爆款短视频拍摄技巧之一,构图

拍摄技巧主要分为两个部分&#xff0c;一个是构图&#xff0c;一个是拍摄手法。这部分内容其实也是比较简单的&#xff0c;因为短视频毕竟不需要做到像拍电影那么专业。所以在短视频当中我们只要学会一些基本的技巧就完全够用了。更重要的是我们需要对构图和拍摄手法有一个概念…

基于KT6368A的双模蓝牙模块打印机的方案

目录 一、打印机蓝牙模块简介 目前主流的打印机&#xff0c;很多都还是不带蓝牙。大部分的受限于成本等等原因&#xff0c;都还是通过USB的方式和电脑进行通讯&#xff0c;从而完成打印的数据交互 因为早期蓝牙技术发展的比较缓慢&#xff0c;而打印机类型的产品&#xff0c;…

_12LeetCode代码随想录算法训练营第十二天-C++二叉树

_12LeetCode代码随想录算法训练营第十二天-C二叉树 二叉树基础知识 二叉树的种类 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 完全二叉树 完全二叉树的定义如下…

线段树能解决多少问题?

背景 给一个两个数组&#xff0c;其中一个数组是 A [1,2,3,4]&#xff0c;另外一个数组是 B [5,6,7,8]。让你求两个数组合并后的大数组的&#xff1a; 最大值最小值总和 这题是不是很简单&#xff1f;我们直接可以很轻松地在 O(mn) 的时间解决&#xff0c;其中 m 和 n 分别为…

maven的java工程获取mysql数据库数据【问题及解决过程记录】

创建数据库maven&#xff0c;指定字符集和排序规则 UTF8MB4常用的排序规则&#xff1a;utf8mb4_unicode_ci、utf8mb4_general_ci、utf8mb4_bin&#xff0c;选用哪种方式呢&#xff1f;先来分析一下&#xff1a; 1、准确性&#xff1a; &#xff08;1&#xff09;utf8mb4_unico…

ffmpeg-时间基tbn、tbc、tbr

时间基的作用 源码来自ffmpeg5.1。 时间基在ffmpeg中是通过数据结构有理数AVRational描述的。时间基为时间戳的单位&#xff0c;比如时间基tbn(AVStream.time_base)0.001秒&#xff0c;AVPacket的pts40&#xff0c;则表明该AVPacket要在tbn*pts0.04秒开始显示。 /** 代码路径…

JavaScript 网页特效

一、Offset 1.1 概述 offset > 偏移量 &#xff0c;可以动态的获取的元素的位置、大小等属性。 获得元素距离带有定位父元素的位置获得元素自身的大小(宽度高度) 返回的数值都不带单位 offset常用属性&#xff1a; 属性作用element.offsetParent返回作为该元素带有定位…

全球汽车后行业发展现状:欧洲市场保持稳健 中国产业规模增速较快

根据观研报告网发布的《2022年中国汽车后市场分析报告-市场发展格局与投资潜力研究》显示&#xff0c;汽车后市场&#xff08;AM市场&#xff09;是指汽车在销售之后维修和保养服务及其所包含的汽车零部件、汽车用品和材料的交易市场&#xff0c;它涵盖了消费者买车后所需要的一…

LeetCode 321 周赛

2485. 找出中枢整数 给你一个正整数 n &#xff0c;找出满足下述条件的 中枢整数 x &#xff1a; 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。 返回中枢整数 x 。如果不存在中枢整数&#xff0c;则返回 -1 。题目保证对于给定的输入&#xff0c;至多存在一个中…

STM32单片机直流电机PID速度控制正反转控制(霍尔磁铁测速)LCD1602

实践制作DIY- GC0116-直流电机PID速度控制 一、功能说明&#xff1a; 基于STM32单片机设计-直流电机PID速度控制 功能介绍&#xff1a; STM32F103C系列最小系统LCD1602直流电机磁铁霍尔传感器MX15系列驱动模块4个按键&#xff08;速度减、速度加、开/关、正转/反转&#xff0…

【复习笔记】【嵌入式】嵌入式系统及其原理复习重点——篇二

嵌入式系统及其原理复习重点笔记 2 ARM处理器和指令集 ARM处理器简介 ARM架构与ARM处理器对应关系 V1版架构 该版架构只在原型机ARM1出现过,处理能力有限&#xff0c;其基本性能&#xff1a; 寻址空间&#xff1a;64M字节(26位)基本的数据处理指令(无乘法)字节、半字和字的…

4个封神的电脑软件,颠覆你对白嫖的认知,干货奉上

闲话少说&#xff0c;直上干货。 1、TinyWow TinyWow虽说是国外网站工具&#xff0c;但不得不承认真的无敌好用&#xff0c;收纳工具超200个&#xff0c;完全免费&#xff0c;无任何弹屏广告&#xff0c;更为良心的是&#xff0c;不需要注册登录&#xff0c;随用随走&#xff0…

如何优化大场景实时渲染?HMS Core 3D Engine这么做

在先前举办的华为开发者大会2022&#xff08;HDC&#xff09;上&#xff0c;华为通过3D数字溪村展示了自有3D引擎“HMS Core 3D Engine”&#xff08;以下简称3D Engine&#xff09;的强大能力。作为一款高性能、高画质、高扩展性的3D引擎&#xff0c;3D Engine不仅能通过实时光…

C++文件流

1、【转】string和stringstream用法总结 - 小金乌会发光&#xff0d;Z&M - 博客园 2、C&#xff1a;std::stringstream【数据类型转换、多个字符串拼接、分割字符串】_u013250861的博客-CSDN博客_c stringstream转string 3、C使用stringstream进行数据类型转换_puppylpg的…

TCP延迟应答、捎带应答、粘包问题、异常处理

TCP延迟应答、捎带应答、粘包问题、异常处理一、延迟应答二、捎带应答三、面向字节流 -- 粘包问题四、TCP中的异常处理五、补充一、延迟应答 上篇博客我们讲到TCP滑动窗口、流量控制、拥塞控制。 如果接收数据的主机立刻返回ACK应答&#xff0c;这时候返回的窗口可能比较小。…

[ vulhub漏洞复现篇 ] Airflow dag中的命令注入漏洞复现 CVE-2020-11978

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

web前端-javascript-function函数的arguments对象(类数组对象,它也可以通过索引来操作数据,也可以获取长度)

arguments 对象 1. 引出 arguments 在调用 function 函数时&#xff0c;浏览器每次都会传递进两个隐含的参数 函数的上下文对象 this封装实参的对象 arguments 2. 说明 arguments 是一个类数组对象,它也可以通过索引来操作数据&#xff0c;也可以获取长度在调用函数时&#…

ACL会议介绍 - Call for Main Conference Papers

The 61st Annual Meeting of the Association for Computational Linguistics Toronto, Canada July 9-14, 2023 网址&#xff1a;The 61st Annual Meeting of the Association for Computational Linguistics - ACL 2023 目录 征集主要会议文件 Submission Topics 主题轨迹…