您的位置:首页 > 科技 > 能源 > C++自定义接口类设计器之函数解析二

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

2024/10/6 1:43:40 来源:https://blog.csdn.net/qq_30220519/article/details/140858439  浏览:    关键词:C++自定义接口类设计器之函数解析二

关键代码


// 解析为函数
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

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com