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

embedded/2024/9/23 9:36:50/

关键代码


// 解析为函数
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.ppmy.cn/embedded/88361.html

相关文章

模型优化—动量梯度下降

一、mini-batch 梯度下降&#xff08;gradient descent&#xff09;&#xff1a; SGD&#xff08;stochastic GD&#xff09;随机梯度下降&#xff1a;对一个样本做梯度下降 batch梯度下降&#xff1a;使用所有样本做梯度下降&#xff08;做一次又叫epoch&#xff09; mini…

谷粒商城实战笔记-75-商品服务-API-品牌管理-品牌分类关联与级联更新

文章目录 一&#xff0c;引入Mybatis Plus分页插件二&#xff0c;品牌列表的模糊查询三&#xff0c;增加品牌测试数据四&#xff0c;开发后台品牌关联分类接口1&#xff0c;接口product/categorybrandrelation/catelog/list2&#xff0c;接口product/categorybrandrelation/sav…

javascript(三)

五、事件 发生在 HTML 元素上的事情&#xff0c;当在 HTML 页面中使用 JavaScript 时&#xff0c; JavaScript 可以触发这些事件 1.常用事件 事件 描述 onchange HTML元素改变 onclick 点击 onmouseover 鼠标移入 onmouseout 鼠标移出 onkeydown 按下键盘 onload…

旗晟机器人环境检测AI智慧算法

在当今迅猛发展的工业4.0时代&#xff0c;智能制造和自动化运维已然成为工业发展至关重要的核心驱动力。工业场景上不仅要对人员行为、仪器仪表识别。环境监测也是不可缺少的一个环节。那么我们说说旗晟环境监测AI智慧算法吧 旗晟仪环境监测AI智慧算法是通过各类采集设备与AI服…

SpringBoot整合Flink CDC实时同步postgresql变更数据,基于WAL日志

SpringBoot整合Flink CDC实时同步postgresql变更数据&#xff0c;基于WAL日志 一、前言二、技术介绍&#xff08;Flink CDC&#xff09;1、Flink CDC2、Postgres CDC 三、准备工作四、代码示例五、总结 一、前言 在工作中经常会遇到要实时获取数据库&#xff08;postgresql、m…

SaaS 服务:满足个性化需求

软件即服务&#xff08;SaaS&#xff09;模式在当今企业IT架构中扮演着越来越重要的角色。它不仅为企业提供了一种灵活、成本效益高的软件使用方式&#xff0c;还通过持续的服务更新和优化&#xff0c;帮助企业保持技术前沿。观测云&#xff0c;作为中国首款 SaaS 可观测服务平…

Mac电脑数据恢复软件 Disk Drill 企业版安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将拖入文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;运行软件&#xff0c;点击安装&#xff0c;软件页面打开表示安装成功 三、运行测试1、打开软件&#xff0c;恢复一个…

Spark核心知识要点(三)

1、为什么要进行序列化序列化&#xff1f; 可以减少数据的体积&#xff0c;减少存储空间&#xff0c;高效存储和传输数据&#xff0c;不好的是使用的时候要反序列化&#xff0c;非常消耗CPU。 2、Yarn中的container是由谁负责销毁的&#xff0c;在Hadoop Mapreduce中containe…