C++自定义接口类设计器之函数解析二

news2024/9/25 13:16:32

关键代码


// 解析为函数
bool FunctionCreator::parse(const QString& lineFunc) {
    auto trimFunc = lineFunc.trimmed();
    auto list = trimFunc.split(" ");
    bool bHasReturn = false;
    // 返回值和函数名解析
    for (const auto& key : list) {
        auto trimKey = key.trimmed();
        if(trimKey.isEmpty())
            continue;
        if("virtual" == trimKey.toLower())
            continue;
        if("void" == trimKey.toLower()) {
            bHasReturn = true;
            continue;
        }
        if(!bHasReturn) {
            if(m_returnType.decoration.isEmpty()) {
                m_returnType.decoration += trimKey;
                continue;
            } else {
                // 返回值数据类型扩展,首个数据可能是类型修饰符
                if(trimKey.endsWith('*')) {
                    m_returnType.decoration += " " + trimKey;
                    bHasReturn = true;
                    continue;
                }
                if(trimKey.endsWith('&')) {
                    m_returnType.decoration += " " + trimKey;
                    bHasReturn = true;
                    continue;
                }
                if(trimKey.endsWith(']')) {
                    m_returnType.decoration += " " + trimKey;
                    bHasReturn = true;
                    continue;
                }
                if(trimKey.startsWith("const")) {
                    m_returnType.decoration += " " + trimKey;
                    continue;
                }
                if(trimKey.startsWith("volatile")) {
                    m_returnType.decoration += " " + trimKey;
                    continue;
                }
                const auto& typeKeys = FunctionCreator::typeKeys();
                for (const auto& type : typeKeys) {
                    bHasReturn = m_returnType.decoration.contains(type);
                    if(bHasReturn)
                        break;  // 有基础数据类型,返回值有效
                }
            }
        }
        // 匹配首个大写字母
        auto paramStartPos = trimKey.indexOf('(');
        if(-1 == paramStartPos)
            break;
        QRegularExpression regex("[A-Z]");
        QRegularExpressionMatch match = regex.match(trimKey);
        if (match.hasMatch() && match.capturedStart() < paramStartPos) {
            m_prefixName = trimKey.mid(0, match.capturedStart());
            m_name = trimKey.mid(match.capturedStart(), paramStartPos - match.capturedStart());
        } else {
            m_name = trimKey.mid(0, paramStartPos);
        }
        break;
    }

    // 函数参数解析
    auto paramStartPos = lineFunc.indexOf('(');
    auto paramEndPos = lineFunc.lastIndexOf(')');
    if(-1 == paramStartPos || -1 == paramEndPos)
        return false;
    auto params = lineFunc.mid(paramStartPos + 1, paramEndPos - paramStartPos - 1).split(',');
    Param var;
    for (const auto& param : params) {
        auto trimParam = param.trimmed();
        if(trimParam.isEmpty())
            continue;
        auto varNameStartIndex = trimParam.lastIndexOf(' ');
        if(-1 == varNameStartIndex) {
            var.type.decoration = trimParam;
            continue;
        }
        var.type.decoration = trimParam.mid(0, varNameStartIndex).trimmed();
        var.name = trimParam.mid(varNameStartIndex).trimmed();
        addParam(var);
    }

    // 函数尾部解析
    auto lastSuffix = lineFunc.mid(paramEndPos);
    auto lastSuffixs = lastSuffix.split(' ');
    for (const auto& suffix : lastSuffixs) {
        auto trimSuffix = suffix.trimmed();
        if(trimSuffix.isEmpty())
            continue;
        if("const" == trimSuffix.toLower())
            m_lastSuffixs.emplace_back(trimSuffix.toLower());
    }
    return true;
}

解析前

 871958312e9d4074bebb0ebfa253b2c7.png

解析后

bb647fdd4ce245df93ee610cf66070dc.png

C++自定义接口类设计器-CSDN博客


创作不易,小小的支持一下吧!

2d50062d779a47afb478b75948ec28e5.pngd4a3f7989b534e9b8b67a6fa085b1129.jpeg

 

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

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

相关文章

麦田物语第十八天

系列文章目录 麦田物语第十八天 文章目录 系列文章目录一、(Editor)制作 [SceneName] Attribute 特性二、场景切换淡入淡出和动态 UI 显示一、(Editor)制作 [SceneName] Attribute 特性 在本节课我们编写Unity的特性Attribute来更好的完善我们项目,具体是什么呢,就是当…

一款简单且强大的免费开源图片压缩软件

图压是一款简单易用且功能强大的图片压缩工具&#xff0c;适用于Windows和macOS两大操作系统。它能够在几乎不损害图片清晰度的情况下&#xff0c;显著减小图片的体积&#xff0c;特别适合需要在网页、PPT、Word、PDF中使用的图片压缩。图压的操作界面简洁&#xff0c;用户可以…

Kettle同步数据时如何借助Shell通过SSH连接MySQL数据库

在实际开发中&#xff0c;经常会用到KettleSpoon来同步数据&#xff0c;比如&#xff1a;需要定时将MySQL库某张表前一天的数据同步到SQL Server&#xff08;MySQL&#xff09;库中等等。一般由于安全性都会提供基于秘钥的连接方式&#xff0c;这种情况下如何在Kettle中连接数据…

Wordpress建站问题记录

从一月到七月因为工作的情况没有进行太深入的开发,想着整理一下把做一个独立站把博客多个渠道发布一下,遇到几个问题在这里记录一下. 先写一下我的配置 系统: centos7 php: 7.4 wordpress: 6.6.1 mysql:8.0.6 1. HTTP 500 Internal 这个问题出现在我将wordpress的文件夹全部…

运维变革背景下的运维工具衍化探讨

在数字化转型的浪潮中&#xff0c;运维领域正经历着前所未有的变革。这一变革不仅重塑了业务形态&#xff0c;也对运维工具和运维组织模式产生了深远影响。随着基础设施云化、容器化、微服务化等技术的兴起&#xff0c;运维对象、运维流程、协同关系等各个方面都发生了深刻的变…

J.U.C 原子类之AtomicIntegerFieldUpdate

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

MySQL:数据库用户

数据库用户 在关系型数据库管理系统中&#xff0c;数据库用户&#xff08;USER&#xff09;是指具有特定权限和访问权限的登录账户。每个用户都有自己的用户名和密码&#xff0c;以便系统可以通过认证来识别他们的身份。数据库用户可以登录数据库&#xff0c;在其中执行各种类…

第二十天学习笔记2024.8.2

安装mysql 1.安装软件包 centos7 中安装 mysql 8.x_wffkg-CSDN博客 2.解压 tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3.卸载mariadb yum remove -y *mariadb* 4.安装&#xff08;缺什么依赖补什么&#xff09; mysql-community-server-8.0.33-1.el7.x86_64.rpm 5.…

APP逆向 day26unidbg下-pdd(anti)案例

一.前言 今天我们讲unidbg的下篇&#xff0c;也就是unidbg基础的最后一个部分&#xff0c;我们上节课也有补环境&#xff0c;比如补java环境&#xff0c;补安卓环境&#xff0c;这节课我们讲的肯定比这些都要难&#xff0c;我会给出一个之前讲过的案例&#xff0c;然后会讲一个…

如何建立与众不同的市场洞察能力【深度】

来源&#xff1a;战略研发领航 建立与众不同的市场洞察机制&#xff0c;展示了如何在组织中建立一种以数据和洞察为核心的文化&#xff0c;并通过4S周期&#xff08;架构、探查、塑造、成型&#xff09;的洞察工作方法论&#xff0c;指导领导者和团队在各个层级上进行更有效的思…

【C语言】C语言期末突击/考研--函数

目录 一、函数的声明与定义-嵌套调用 1.1.函数的声明与定义 1.2.函数的分类与调用 二、函数的递归调用 三、局部变量与全局变量 3.1.全局变量解析形参实参解析 3.2.局部变量与全局变量 四、练习题及解析 一、函数的声明与定义-嵌套调用 1.1.函数的声明与定义 函数间的…

Code Review 这件事,AI 比人类强 10 倍

1.引言 代码审查&#xff0c;也就是 Code Review&#xff08;以下简称 CR&#xff09;&#xff0c;一直是 IT 行业讨论的热门话题&#xff0c;因为它在很大程度上决定了公司的工程质量。 但是&#xff0c;人工 CR 的成本的是很高的&#xff0c;所以在实际落地场景&#xff0c…

latex换行\left[和\right]编译报错-解决方案

简而言之&#xff1a;\\ 换成 \right.\\ , & 换成 &\left. 来个例子就知道了&#xff1a; 原本的公式是&#xff1a; \begin{align}\label{up_critic} L_Q(\theta) & \mathbb{E}\left[\frac{1}{2}(Q_\theta(\mathcal{S}_{k,t}^m, {A}_{k,t}^m) - ({R}_{k,t}^m …

07030405复杂可编程逻辑器件CPLD现场可编程阵列FPGA

复杂可编程逻辑器件CPLD&现场可编程阵列FPGA 7.3 复杂可编程逻辑器件CPLD7.3.1CPLD的结构 7.4现场可编程门阵列FPGA7.4.1FPGA实现逻辑功能的基本原理7.4.2FPGA结构简介1.可编程逻辑块2.I/O块3.可编程连线资源CPLD与FPGA的区别 7.5可编程逻辑器件开发过程简介编程条件 7.3 复…

细说文件操作

你好&#xff01;感谢支持孔乙己的新作&#xff0c;本文就结构体与大家分析我的思路。 希望能大佬们多多纠正及支持 &#xff01;&#xff01;&#xff01; 个人主页&#xff1a;爱摸鱼的孔乙己-CSDN博客 目录 1.什么是文件 1.1.程序设计文件 1.1.1.程序文件 1.1.2.数据文件…

使用EntityFramework8的学习和开发过程中一些经验

前言&#xff1a; 本篇文章主要记录自己在EF8的学习和使用过程中的碰到一些坑和自己琢磨的一些解决问题的方法以及过程。 问题汇总&#xff1a; 一、Code First 模式下生成表中字段的没有按照我们想要的次序排列 实体上增加注解 [Column(Order 0)] 可以通过Order来控制字段…

[CISCN2019 华北赛区 Day1 Web1]Dropbox 1

目录 题目分析功能测试代码读取index.phpdownload.phpdelete.phpclass.php 关键代码审计user类FileList类File类思路 解题步骤php脚本解题 题目分析 功能测试 注册登录后来到上传文件界面&#xff0c;通过改后缀&#xff0c;改文件头&#xff0c;改content-type&#xff0c;上…

如何养护我们的头发一

正常头发含水量10-13% 头发含水量低 头发就会干燥 受到损伤 头发保水能力弱 保养头发,最重要的是防止头发头发的流水. 正确的洗涤方法 干性头发,一般3天洗一次 油性头发,一般1天洗一次 中性头发,一般2天洗一次 (2)正确的洗发步骤 选择好梳子建议选用木梳或牛角梳 按摩头皮…

释疑 803-(2)物理层 整理总结

目录 2-01 物理层要解决哪些问题?物理层的主要特点是什么? 2-02 规程与协议有什么区别? 2-03 试给出数据通信系统的模型并说明其主要组成构件的作用。 2-04 试解释以下名词&#xff1a;数据、信号、模拟数据、模拟信号、基带信号、带通信号、数字数据、数字信号、码元、…

PHP智能问诊导诊平台-计算机毕业设计源码75056

摘 要 智能问诊导诊平台作为一种智能化医疗服务工具&#xff0c;利用PHP语言开发&#xff0c;旨在为用户提供便捷的在线问诊和导诊服务。该平台集成了智能算法和医疗数据&#xff0c;实现了智能化的病情诊断和治疗建议&#xff0c;帮助用户更快速地获取医疗信息和建议。用户可…