专题:一个自制代码生成器(嵌入式脚本语言)之辅助逻辑

2024-03-30 06:52

本文主要是介绍专题:一个自制代码生成器(嵌入式脚本语言)之辅助逻辑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


专题:一个自制代码生成器(嵌入式脚本语言)之总述-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之对象模型-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之堆栈结构和总入口-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之核心逻辑-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之辅助逻辑-CSDN博客(本篇)

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之模型开发-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之代码模板详解-CSDN博客


目录

一、处理变量替换

二、处理表达式

三、寻找块结束

四、查找对象


一、处理变量替换

        变量替换使用“${”和“}”包裹。

	//处理没有控制块的纯替换bool _ProcessNoBlock(string const& _source, long start, long end, stringstream& ss, CCTObject& O, CCTStack& S){string source = _source.substr(start, end - start);DEBUG_LOG << "---------------------------------- " << start << " " << end << endl << source << endi;size_t pos = 0;//标记开始处size_t pos2 = 0;//指向未处理部分while (string::npos != (pos = source.find("${", pos2))){ss << source.substr(pos2, pos - pos2);pos2 = source.find("}", pos + 2);if (source.npos == pos2){thelog << "没找到匹配的 } :" << source.substr(pos) << ende;return false;}string objname = source.substr(pos, pos2 + 1 - pos);bool INCafterUsed = false;//带有后++objname = _makeobjname(objname);//脱壳if (objname.size() > 2 && "++" == objname.substr(objname.size() - 2)){INCafterUsed = true;objname.erase(objname.size() - 2);}if ("__LOG__" == objname){ss << "thelog << " << _getLineNumber(_source.c_str(), start + pos) << " << \" \"";}else if ("__DEBUG_LOG__" == objname){ss << "DEBUG_LOG << " << _getLineNumber(_source.c_str(), start + pos) << " << \" \"";}else{CCTObject* p = _FindObject(objname, O, S);if (NULL == p){thelog << "对象不存在 [" << objname << "] line : " << _getLineNumber(_source.c_str(), pos + start) << ende;return false;}DEBUG_LOG << "line : " << _getLineNumber(_source.c_str(), pos + start) << " " << objname << " " << p->GetDefaultValue() << endi;ss << p->GetDefaultValue();if (INCafterUsed){char buf[64];sprintf(buf, "%ld", atol(p->GetDefaultValue().c_str()) + 1);p->SetDefaultValue(buf);}}pos2 = pos2 + 1;}ss << source.substr(pos2);DEBUG_LOG << "-------------------" << endi;return true;}

二、处理表达式

	//处理表达式,双引号引导为纯文本,单引号引导为脚本,没有引号先判断是不是对象再当作脚本,如果是对象则p有效string _ProcessExpression(CCTObject& O, CCTStack& S, string const& expression, CCTObject*& p){//thelog << expression << endi;p = nullptr;if (expression.size() >= 2 && '\"' == expression[0] && '\"' == expression[expression.size() - 1]){//thelog << varname<<" "<< objname.substr(1, objname.size() - 2) <<endi;return expression.substr(1, expression.size() - 2);}stringstream tmp_ss;if (expression.size() >= 2 && '\'' == expression[0] && '\'' == expression[expression.size() - 1]){//thelog << expression << endi;if (_ProcessBlock(expression.substr(1, expression.size() - 2), 0, expression.size() - 2, tmp_ss, O, S)){//thelog << tmp_ss.str() << endi;return tmp_ss.str();}else{return expression + " 对象不存在或脚本出错 ";}}else{p = _tryFindObject(expression, O, S);if (NULL != p){return "";}if (_ProcessBlock(expression, 0, expression.size(), tmp_ss, O, S)){return tmp_ss.str();}else{return expression + " 对象不存在或脚本出错 ";}}}

        处理表达式只在dim和set中使用。

三、寻找块结束

	//寻找块结束,end1 end2返回扩展后的结束标签bool _findBlockEnd(string const& source, size_t start, size_t end, size_t& end1, size_t& end2, char const* labelBegin, char const* labelEnd){return __findBlockEnd(source, start, end, end1, end2, labelBegin, labelEnd, false);}bool _TryFindBlockEnd(string const& source, size_t start, size_t end, size_t& end1, size_t& end2, char const* labelBegin, char const* labelEnd){return __findBlockEnd(source, start, end, end1, end2, labelBegin, labelEnd, true);}bool __findBlockEnd(string const& source, size_t start, size_t end, size_t& end1, size_t& end2, char const* labelBegin, char const* labelEnd, bool isTry){long level = 1;string matchlable;end1 = start;end2 = start;while (level > 0){end1 = source.find("<%", end2);if (string::npos == end1 || end1 >= end){if (!isTry)thelog << "控制块不匹配 level " << level << " " << labelBegin << " " << labelEnd << " 行 " << _getLineNumber(source.c_str(), start) << ende;//exit(0);return false;}end2 = source.find("%>", end1 + 2);if (string::npos == end2 || end2 >= end){thelog << "没找到匹配的 %> : " << source.substr(end1) << ende;return false;}string blockcode = source.substr(end1 + 2, end2 - (end1 + 2));StringTokenizer st(blockcode, " ");DEBUG_LOG << "level " << level << " " << st[0] << " 行:" << _getLineNumber(source.c_str(), end1) << endi;if (st.size() > 0){if ((string)"else" == labelEnd){if ((string)"else" == st[0] && 1 == level){//找else只能在最后一层时降级DEBUG_LOG << "level=1时找到else" << endi;matchlable = st[0];--level;}if ((string)"endif" == st[0]){DEBUG_LOG << "找else时遇到endif" << endi;matchlable = st[0];--level;}}else if (labelEnd == st[0]){DEBUG_LOG << "找到结束标记" << endi;matchlable = st[0];--level;}if (labelBegin == st[0]){DEBUG_LOG << "找到开始标记" << endi;matchlable = st[0];++level;}}end2 += 2;}if (0 == level && labelEnd == matchlable){_extendToLine(source.c_str(), end1, end2);DEBUG_LOG << "找到块 " << labelBegin << " " << labelEnd << " 行 " << _getLineNumber(source.c_str(), end1) << " " << source.substr(end1, end2 - end1) << endi;return true;}else{if (labelEnd != (string)"else")thelog << "控制块不匹配" << labelBegin << " " << labelEnd << " 行 " << _getLineNumber(source.c_str(), start) << ende;return false;}}

四、查找对象

	CCTObject* _FindObject(string _objname, CCTObject& O, CCTStack& S){return __FindObject(_objname, O, S, false);}CCTObject* _tryFindObject(string _objname, CCTObject& O, CCTStack& S){return __FindObject(_objname, O, S, true);}CCTObject* __FindObject(string _objname, CCTObject& O, CCTStack& S, bool isTry){//G_IS_DEBUG = true;string objname = _makeobjname(_objname);//脱壳CCTObject* ret = NULL;DEBUG_LOG << "查找 " << objname << " " << S.size() << endi;for (long i = S.size() - 1; i >= 0; --i){DEBUG_LOG << "S... " << endi;ret = S[i].FindObject(objname);if (ret != NULL){DEBUG_LOG << "找到 " << endi;return ret;}}DEBUG_LOG << "O... " << endi;ret = O.FindObject(objname);if (NULL == ret){if (!isTry)thelog << "对象不存在 " << objname << endw;//string str;//thelog << endl << O.toString(str) << endi;//for (CCTStack::reverse_iterator it = S.rbegin(); it != S.rend(); ++it)//{//	thelog << endl << it->toString(str) << endi;//}}return ret;}


(这里是结束但不是整个系列的结束)

这篇关于专题:一个自制代码生成器(嵌入式脚本语言)之辅助逻辑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/860784

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

深入探索嵌入式 Linux

摘要:本文深入探究嵌入式 Linux。首先回顾其发展历程,从早期尝试到克服诸多困难逐渐成熟。接着阐述其体系结构,涵盖硬件、内核、文件系统和应用层。开发环境方面包括交叉编译工具链、调试工具和集成开发环境。在应用领域,广泛应用于消费电子、工业控制、汽车电子和智能家居等领域。关键技术有内核裁剪与优化、设备驱动程序开发、实时性增强和电源管理等。最后展望其未来发展趋势,如与物联网融合、人工智能应用、安全性与

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采