当前位置: 首页 > news >正文

在Qt中判断输入的js脚本是否只包含函数

目前在使用QtScriptEngine,在利用evaluate注册子函数时,要求用户输入的js文件中的内容仅仅是函数,函数体外,不能出现一些变量的声明、函数的调用等其他代码。
反复咨询DeepSeek后,终于给出了一个目前测试可用的代码:

bool isPureFunctions(const QString& code) {
    enum State {
        Normal,
        InFunctionBody,
        InLineComment,
        InBlockComment,
        InString
    };

    State state = Normal;
    int braceDepth = 0;
    bool hasFunction = false;
    QChar stringQuote;
    int functionStartDepth = 0;  // 记录函数起始层级的栈

    for (int i = 0; i < code.length(); ++i) {
        const QChar c = code[i];
        const QChar next = (i < code.length()-1) ? code[i+1] : QChar();

        switch (state) {
        case Normal:
            if (c.isSpace()) {
                continue;
            } else if (c == '/' && next == '*') {
                state = InBlockComment;
                i++; // 跳过 *
            } else if (c == '/' && next == '/') {
                state = InLineComment;
                i++; // 跳过 /
            } else if (c == 'f' && code.mid(i, 8) == "function") {
                // 进入函数声明
                i += 7; // 跳过 "function"
                state = InFunctionBody;
                braceDepth = 0;
                hasFunction = true;
                functionStartDepth = 0; // 重置层级计数器
            } else {
                // 非函数代码立即拒绝
                if (hasFunction) return false; // 函数后出现其他代码
                else return false;              // 函数外出现其他代码
            }
            break;

        case InFunctionBody:
            if (c == '{') {
                braceDepth++;
                if (braceDepth == 1) functionStartDepth = i; // 记录函数起始位置
            } else if (c == '}') {
                if (--braceDepth == 0) {
                    state = Normal; // 函数体结束
                } else if (braceDepth < 0) {
                    return false;   // 花括号不匹配
                }
            } else if (c == '"' || c == '\'' || c == '`') {
                state = InString;
                stringQuote = c;
            }
            break;

        case InLineComment:
            if (c == '\n') state = Normal;
            break;

        case InBlockComment:
            if (c == '*' && next == '/') {
                state = Normal;
                i++; // 跳过 /
            }
            break;

        case InString:
            if (c == stringQuote && (i == 0 || code[i-1] != '\\')) {
                state = InFunctionBody;
            }
            break;
        }
    }

    // 最终必须回到Normal状态且至少有一个函数
    return state == Normal && hasFunction;
}

测试:

// 应返回 true 的有效用例
QString validCode = 
    "function foo1(){}\n"
    "function foo2(){ if(true){} }";
qDebug() << isPureFunctions(validCode); // 输出 true

// 应返回 false 的无效用例
QString invalidCode = 
    "function foo(){}\n"
    "console.log(123);\n"
    "function bar(){}";
qDebug() << isPureFunctions(invalidCode); // 输出 false
http://www.dtcms.com/a/99290.html

相关文章:

  • 【Linux】常见信号 + 进程和作业
  • Java常用异步方式总结
  • 硬实时操作系统(Hard Real-Time OS)与软实时操作系统(Soft Real-Time OS)的区别
  • matplot显示中文
  • json-server使用方法
  • Android14 SystemUI中添加第三方AIDL
  • java.util包之java.util.Collection介绍
  • 并发编程之最小化共享
  • 21_js正则_表单验证
  • Java基于SpringBoot的网络云端日记本系统,附源码+文档说明
  • 若依——基于AI+若依框架的实战项目(实战篇(上))
  • SourceMap原理
  • 打破循环依赖的三大法宝:Spring Boot实战解析
  • 基于三维数字图像相关(DIC)全场应变测量技术的基础设施结构健康监测与安全评估方法研究
  • Msys2安装编译Redis
  • LearnOpenGL-笔记-其六
  • 数据分析概述
  • tauri配置全局变量
  • neo4j中导入csv格式的三元组数据
  • 访问者模式_行为型_GOF23
  • 人工智能入门(2)
  • 心理咨询法律咨询预约咨询微信小程序系统源码独立部署
  • Python函数中的*args与**kwargs详解:灵活处理可变参数
  • LabVIEW 燃气轮机气路故障诊断
  • 算法中常见的求和问题,数学公式
  • 通俗版解释:SecureLink 和 Xshell 的区别与联系
  • 管理系统-接口信息
  • 烽火MR622-KK融合机_海思MV300芯片_1+8G_强刷卡刷固件包
  • 计算机网络 用deepseek帮助整理的复习资料(一)
  • 工程项目管理软件赋能制造工程高效变革