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

devtools/2025/4/1 19:27:21/

目前在使用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.ppmy.cn/devtools/172444.html

相关文章

Sentinel 相关知识点

Sentinel 实现原理&#xff1f; Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助开发者保障微服务的稳定性。以下是 Sentinel 的实现原理&#xff1a; 核心概念 资源&…

[Mac]利用Hexo+Github Pages搭建个人博客

由于我这台Mac基本没啥环境&#xff0c;因此需要从零开始配置&#xff0c;供各位参考。 注意⚠️&#xff1a;MacBook (M4)使用/bin/zsh作为默认Shell&#xff0c;其对应的配置文件为~/.zshrc 参考文档&#xff1a; HEXO系列教程 | 使用GitHub部署静态博客HEXO | 小白向教程 文…

基于Flask的防火墙知识库Web应用技术解析

基于Flask的防火墙知识库Web应用技术解析 一、系统概述 本系统是一个结构化网络防火墙知识库的Web实现&#xff0c;采用Python Flask框架构建&#xff0c;提供章节导航、知识点检索、详情展示等功能。系统整合了100条防火墙领域核心知识点&#xff0c;涵盖基础概念、配置实践…

SylixOS 中 select 原理及使用分析

1、select接口简介 1.1 select接口使用用例 select 是操作系统多路 I/O 复用技术实现的方式之一。 select 函数允许程序监视多个文件描述符&#xff0c;等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指&#xff1a;文件描述符不再是阻塞状…

windows磁盘管理

简介 Windows 磁盘管理是 Windows 操作系统中的一个功能强大的工具&#xff0c;用于管理和维护计算机的磁盘分区、卷和存储设备 磁盘管理的主要功能 查看磁盘分区信息&#xff1a; 可以查看所有磁盘的分区情况&#xff0c;包括分区大小、分区类型&#xff08;如 NTFS、FAT32 …

霸王茶姬小程序(2025年1月版)任务脚本

脚本用于自动执行微信小程序霸王茶姬的日常签到和积分管理任务。 脚本概述 脚本设置了定时任务(cron),每天运行两次,主要用于自动签到以获取积分,积分可以用来换取优惠券。 核心方法 constructor:构造函数,用于初始化网络请求的配置,设置了基础的 HTTP 请求头等。 logi…

Java实战:实现用户的登录注册功能

系列文章目录 Java文件 I/O流的操作实战和高级UI组件和事件监听的综合 文章目录 系列文章目录前言一、大致流程思路分析&#xff1a;二、定义用户类&#xff1a;三、服务层的实现&#xff1a; 1.保护用户数据功能的实现2.登录操作的实现 四、实现用户的注册界面&#xff1a; 大…

美团2024年春招第一场笔试【算法策略】题解

算法策略 美团第一场机考平衡矩阵 美团第一场机考 平衡矩阵 小美拿到了一个n∗nn∗n的矩阵&#xff0c;其中每个元素是 0 或者 1。 小美认为一个矩形区域是完美的&#xff0c;当且仅当该区域内 0 的数量恰好等于 1 的数量。 现在&#xff0c;小美希望你回答有多少个i∗ii∗i的…