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

42 篇文章 0 订阅
14 篇文章 0 订阅

关键代码


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力码力我爱你

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值