用HTML+JavaScript构建C++类(Class)代码转换为MASM32代码的平台

一、需求分析

在使用MASM32编写Windows应用程序时,经常要调用Windows API接口函数 和 相应的数据结构,这些数据结构中有很多是类(Class),对于那些在MASM32没有定义的类,我们需要自己来转换。比如:

[Dynamic, Provider("CIMWin32"), UUID("{8502C4E0-5FBB-11D2-AAC1-006008C78BC7}"), SupportsCreate, CreateBy("Create"), SupportsDelete, DeleteBy("Delete"), AMENDMENT]
class Win32_ScheduledJob : CIM_Job
{string   Caption;string   Description;datetime InstallDate;string   Name;string   Status;datetime ElapsedTime;string   Notify;string   Owner;uint32   Priority;datetime TimeSubmitted;datetime UntilTime;string   Command;uint32   DaysOfMonth;uint32   DaysOfWeek;boolean  InteractWithDesktop;uint32   JobId;string   JobStatus;boolean  RunRepeatedly;datetime StartTime;
};

要转换成MASM32中的定义:

Win32_ScheduledJob STRUCTCaption	db	?Description	db	?InstallDate	datetime	?Name	db	?Status	db	?ElapsedTime	datetime	?Notify	db	?Owner	db	?Priority	DWORD	?TimeSubmitted	datetime	?UntilTime	datetime	?Command	db	?DaysOfMonth	DWORD	?DaysOfWeek	DWORD	?InteractWithDesktop	boolean	?JobId	DWORD	?JobStatus	db	?RunRepeatedly	boolean	?StartTime	datetime	?
Win32_ScheduledJob ENDS

手工转换效率太低,我们可以用HTML+JavaScript来构建一个转换平台。

二、页面设计

首先我们来定义转换平台的页面:

左边的文本框用来粘贴要转换的C++ 类代码,右边的文本框用来显示转换后的 MASM32代码,点击右上角的“转换”按钮进行转换。

相应的代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="Generator" content="EditPlus®"><meta name="Author" content="PurpleEndurer"><meta name="Keywords" content="C++,MASM32,Class,Struct"><meta name="Description" content="C++ Class 2 MASM32 Struct"><title>C++ Class code 2 MASM32 Struct code</title></head><body><table style="backgound:#ccccff;">
<caption style="background: #ccccff; color:yellow;border-top:1px solid purple;border-left:1px solid purple;"><P><span style=" font:18pt bold;">C++ Class code 2 MASM32 Struct code</span>&nbsp;&nbsp;<span style=" font:14pt bold;color:purple;">by&nbsp;PurpleEndurer</span>&nbsp;&nbsp;<input type="button" value="转换" onclick="tran()"></P>
</caption>
<tr><td style="border:1px solid black;background:#ccffff;"><P align="center">C++ class code</P><textarea id="taCppClass" rows="50" cols="40">
[Dynamic, Provider("CIMWin32"), UUID("{8502C4E0-5FBB-11D2-AAC1-006008C78BC7}"), SupportsCreate, CreateBy("Create"), SupportsDelete, DeleteBy("Delete"), AMENDMENT]
class Win32_ScheduledJob : CIM_Job
{string   Caption;string   Description;datetime InstallDate;string   Name;string   Status;datetime ElapsedTime;string   Notify;string   Owner;uint32   Priority;datetime TimeSubmitted;datetime UntilTime;string   Command;uint32   DaysOfMonth;uint32   DaysOfWeek;boolean  InteractWithDesktop;uint32   JobId;string   JobStatus;boolean  RunRepeatedly;datetime StartTime;
};
</textarea>     		</td><td style="border:1px solid black;background:#ffffcc;"><P align="center">MASM32 Struct code</P><textarea id="taMASM32" rows="50" cols="90"></textarea></td>
</tr>
</table></body>
</html>

三、对C++类代码的检测

当我们点击右上角的“转换”按钮进行转换时,我们首先要检测一下左边文本框里内容是否为C++类 代码,检测思路是:

首先用正则表达式的search()方法 检测文本中是否包含关键字class,如果不包含 class,文本就不是C++类 代码;

然后我们分别用字符串的indexOf()和lastIndexOf()方法 来查文本中是否包含'{'和'}'两个字符,如果文本不包含这两个字符,就不是C++类 代码,反之我们可以认为文本是C++类 代码。

代码如下:

//功能:判断是否为c++ class定义代码
//输入:c=code
//输出:true=是,false=否
//记录:20230812创建
function isCppClass(c)
{//taMASM32.value += 'isCppClass : c.search(/\bclass\b/i =' + c.search(/\bclass\b/i) + '\n';if (c.search(/\bclass\b/i)){if ( -1 != c.indexOf('{') ){if ( -1 != c.lastIndexOf('}')){return true;}//if}//if}//ifreturn false;
}//isCppClass(c)

四、生成MASM32注释

由于类的定义在MASM32中和C++不同,有时我们需要参考类在C++中的原始定义,我们一般会将

类在C++中的原始定义代码以注释的形式放在MASM32中,这里我们用字符串的replace()方法 来实现:

	//生成masm32注释taMASM32.value += ';' + v.replace(/\n/g, '\n;') + '\n';	

五、获取类名

接下来我们来获取类名。在C++中,类名一般位于关键字class后面。

思路是首先用正则表达式的search()方法获取关键字class的位置,然后用substring()方法截取它后面的文本c,用indexOf()方法 获取文本c中第一个空格的位置p,再用substring()方法截取文本c从开头到p的文本a,这个文本a就是类名。代码如下:

//功能:获取为c++ class的名称
//输入:c=code
//输出:class的名称(可能为'')
//记录:20230812创建
function getClassName(c)
{var r = c.substring(c.search(/\bclass\b/i) + 5).ltrim();return r.substring(0, r.indexOf(' '));
}//getClassName(c)

为了确保获取文本c中第一个空格的位置p位于类名的后面,我们用ltrim()删除文本c开头的空格。

在MASM32中,类的定义是用Struct来实现的。

取得类名后,我们就可以生成MASM32中定义的第一行:

	taMASM32.value += '\n' + clsName + ' STRUCT\n';

六、将C++类成员定义转换MASM32格式

C++类成员定义在{}中,顺序是成员类型、成员名称,两者中间用空格或制表符间隔。

MASM32中Struct成员定义顺序是成员名称, 成员类型,值,前两项的顺序与c++相反,两者中间也是用空格或制表符间隔。

我们的思路是:首先获取{}中的文本,用replace(';'.'')把文本中位于行末的所有分号去掉。

然后用split('\n')把文本按行转换为数组逐行处理。

我们用replace()方法,获取C++中的成员类型$1和成员名称$2,并替换成"$2\t$1\t?\n"

//功能:将c++ class中的成员定义转换为MASM32结构体成员定义
//输入:c=code
//输出:MASM32结构体成员定义字符串
//记录:20230812创建
function tranStructMem(c)
{//获取关键字class后的文本var r = c.substring(c.search(/\bclass\b/i) + 5);//获取{}之间的文本r = r.substring(r.indexOf('{')+1, r.lastIndexOf('}'));r = r.replace(/;/g,''); //去除所有行末的分号var a = r.split('\n');//按行转换为数组r = '';for (var i = 0; i < a.length; i++){r += a[i].replace( /(\w+)\s+(\w+)/, "$2\t$1\t?\n");}//r = r.substring(0, r.length-1);//删除最后一个换行符return tranCppType2Masm32Type(r);
}//tranStructMem(c)

由于c++中的数据类型与MASM32中的并不完全对应,比如c++中的uint32,在MASM32中没有定义,可以用DWORD来对应,所以我们还增加了一个函数tranCppType2Masm32Type来进行类型转换:

//功能:将c++ class中的数据类型转换为MASM32的数据类型
//输入:v=string
//输出:MASM32的数据类型
//记录:20230812创建
function tranCppType2Masm32Type(v)
{var aType = [[/string/gi, "db"],[/uint32/gi, "DWORD"]];var r = v;for (var i = 0; i < aType.length; i++){r = r.replace(aType[i][0], aType[i][1]);}return r;
}//tranCppType2Masm32Type(v)

七、运行效果

八、完整代码

如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="Generator" content="EditPlus®"><meta name="Author" content="PurpleEndurer"><meta name="Keywords" content="C++,MASM32,Class,Struct"><meta name="Description" content="C++ Class 2 MASM32 Struct"><title>C++ Class code 2 MASM32 Struct code</title></head><body><table style="backgound:#ccccff;">
<caption style="background: #ccccff; color:yellow;border-top:1px solid purple;border-left:1px solid purple;"><P><span style=" font:18pt bold;">C++ Class code 2 MASM32 Struct code</span>&nbsp;&nbsp;<span style=" font:14pt bold;color:purple;">by&nbsp;PurpleEndurer</span>&nbsp;&nbsp;<input type="button" value="转换" onclick="tran()"></P>
</caption>
<tr><td style="border:1px solid black;background:#ccffff;"><P align="center">C++ class code</P><textarea id="taCppClass" rows="50" cols="40">
[Dynamic, Provider("CIMWin32"), UUID("{8502C4E0-5FBB-11D2-AAC1-006008C78BC7}"), SupportsCreate, CreateBy("Create"), SupportsDelete, DeleteBy("Delete"), AMENDMENT]
class Win32_ScheduledJob : CIM_Job
{string   Caption;string   Description;datetime InstallDate;string   Name;string   Status;datetime ElapsedTime;string   Notify;string   Owner;uint32   Priority;datetime TimeSubmitted;datetime UntilTime;string   Command;uint32   DaysOfMonth;uint32   DaysOfWeek;boolean  InteractWithDesktop;uint32   JobId;string   JobStatus;boolean  RunRepeatedly;datetime StartTime;
};
</textarea>     		</td><td style="border:1px solid black;background:#ffffcc;"><P align="center">MASM32 Struct code</P><textarea id="taMASM32" rows="50" cols="90"></textarea></td>
</tr>
</table><script>
//功能:删除字符串中的所有空格
//记录:20230726创建
String.prototype.eliminateSpace = function()
{return this.replace(/\s*/g,"");
}//去除字符串首部空格
String.prototype.ltrim = function() 
{ return this.replace(/(^\s*)/g, ""); 
} //去除字符串尾部空格 
String.prototype.rtrim = function() 
{ return this.replace(/(\s*$)/g, ""); 
}//去除字符串首尾空格
String.prototype.trim = function() 
{return this.replace(/(^\s*)|(\s*$)/g, ""); /*var t = this.replace(/(^\s*)|(\s*$)/g, ""); return t =t.replace(/(^&nbsp;*)|(&nbsp*$)/g, ""); */
}//功能:判断是否为c++ class定义代码
//输入:c=code
//输出:true=是,false=否
//记录:20230812创建
function isCppClass(c)
{//taMASM32.value += 'isCppClass : c.search(/\bclass\b/i =' + c.search(/\bclass\b/i) + '\n';if (c.search(/\bclass\b/i)){if ( -1 != c.indexOf('{') ){if ( -1 != c.lastIndexOf('}')){return true;}//if}//if}//ifreturn false;
}//isCppClass(c)//功能:获取为c++ class的名称
//输入:c=code
//输出:class的名称(可能为'')
//记录:20230812创建
function getClassName(c)
{var r = c.substring(c.search(/\bclass\b/i) + 5).ltrim();return r.substring(0, r.indexOf(' '));
}//getClassName(c)//功能:将c++ class中的数据类型转换为MASM32的数据类型
//输入:v=string
//输出:MASM32的数据类型
//记录:20230812创建
function tranCppType2Masm32Type(v)
{var aType = [[/string/gi, "db"],[/uint32/gi, "DWORD"]];var r = v;for (var i = 0; i < aType.length; i++){r = r.replace(aType[i][0], aType[i][1]);}return r;
}//tranCppType2Masm32Type(v)//功能:将c++ class中的成员定义转换为MASM32结构体成员定义
//输入:c=code
//输出:MASM32结构体成员定义字符串
//记录:20230812创建
function tranStructMem(c)
{//获取关键字class后的文本var r = c.substring(c.search(/\bclass\b/i) + 5);//获取{}之间的文本r = r.substring(r.indexOf('{')+1, r.lastIndexOf('}'));r = r.replace(/;/g,''); //去除所有行末的分号var a = r.split('\n');//按行转换为数组r = '';for (var i = 0; i < a.length; i++){r += a[i].replace( /(\w+)\s+(\w+)/, "$2\t$1\t?\n");}//r = r.substring(0, r.length-1);//删除最后一个换行符return tranCppType2Masm32Type(r);
}//tranStructMem(c)var taCppClass = document.getElementById('taCppClass');
var taMASM32 = document.getElementById('taMASM32');function tran()
{var v = taCppClass.value;if (""==v.trim()){taCppClass.value = "请先将C++代码输入或粘贴到这里";return;}//taMASM32.value = v;if (!isCppClass(v)){taMASM32.value = '不是C++ Class定义';return;}//生成masm32注释taMASM32.value += ';' + v.replace(/\n/g, '\n;') + '\n';	var clsName = getClassName(v);if (''==clsName){taMASM32.value += '未能获取类名';return;}taMASM32.value += '\n' + clsName + ' STRUCT\n';//v = v.replace(/[\t\s]+/g,' ');//var m = extractMember(v);taMASM32.value += tranStructMem(v);}//tran()
</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/63590.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写一个指令(v-focus2end)使输入框文本在聚焦时焦点在文本最后一个位置

项目反馈输入框内容比较多时候&#xff0c;让鼠标光标在最后一个位置&#xff0c;心想什么奇葩需求&#xff0c;后面试了一下&#xff0c;是有点影响体验&#xff0c;于是就有了下面的效果&#xff0c;我目前的项目都是若依的架子&#xff0c;用的是vue2版本。vue3的朋友想要使…

OneFlow 中的 Softmax

Softmax 是深度学习模型中的常见算子。PyTorch 的 Softmax 算子直接调用 cuDNN 的接口。而 OneFlow 内部针对输入数据的类别数量&#xff0c;采用3个 kernel 来分别处理&#xff0c;在多数情况下都可以获得比 cuDNN 更优的性能表现。测试结果可见 如何实现一个高效的Softmax CU…

Kubernetes Calico

Calico以其性能、灵活性和网络策略而闻名&#xff0c;不仅涉及在主机和Pod之间提供网络连接&#xff0c;而且还涉及网络安全性和策略管理。(还可以配置防火墙规则来隔离不同应用的网络) 对于同网段通信&#xff0c;基于第3层&#xff0c;Calico使用BGP路由协议在主机之间路由数…

uni-app:实现点击按钮,进行数据累加展示(解决数据过多,导致出错)

效果 代码 核心代码 一、标签显示 <!-- 加载更多 --> <view class"load_more" v-if"info.length > pageNum * pageSize" tap"loadMore">加载更多 </view> v-if"info.length > pageNum * pageSize"&#xf…

网站SSL安全证书是什么及其重要性

网站SSL安全证书具体来说是一个数字文件&#xff0c;是由受信任的数字证书颁发机构&#xff08;CA机构&#xff09;进行审核颁发的&#xff0c;其中包含CA发布的信息&#xff0c;该信息表明该网站已使用加密连接进行了安全保护。 网站SSL安全证书也被称为SSL证书、https证书和…

多区域平台lazada,虾皮电商商品详情API接口返回值说明

Lazada和虾皮&#xff08;Shopee&#xff09;都是知名的电商平台&#xff0c;主要在东南亚地区运营。以下是关于它们的一些信息&#xff1a; Lazada&#xff08;来赞达&#xff09;&#xff1a; Lazada成立于2012年&#xff0c;起初是一个全球性的电子商务平台&#xff0c;后来…

Dubbo 2.7.0 CompletableFuture 异步

了解Java中Future演进历史的同学应该知道&#xff0c;Dubbo 2.6.x及之前版本中使用的Future是在java 5中引入的&#xff0c;所以存在以上一些功能设计上的问题&#xff0c;而在java 8中引入的CompletableFuture进一步丰富了Future接口&#xff0c;很好的解决了这些问题。 Dubb…

并发编程面试题2

并发编程面试题2 一、AQS高频问题&#xff1a; 1.1 AQS是什么&#xff1f; AQS就是一个抽象队列同步器&#xff0c;abstract queued sychronizer&#xff0c;本质就是一个抽象类。 AQS中有一个核心属性state&#xff0c;其次还有一个双向链表以及一个单项链表。 首先state…

vue使用ElementUI

1.安装 npm i element-ui -S 2.引入 2.1完整引入 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.use(ElementUI); 2.2按需引入 说明&#xff1a;为了输入时候有提示&#xff0c;建…

途乐证券-最准确的KDJ改良指标?

KDJ目标是技术剖析的一种重要目标之一&#xff0c;它是利用随机目标&#xff08;%R&#xff09;发展而来的&#xff0c;是一种反映商场超买和超卖状况的买卖目标。KDJ目标由快线&#xff08;K线&#xff09;、慢线&#xff08;D线&#xff09;和随机值&#xff08;J线&#xff…

【JavaEE基础学习打卡02】是时候了解JavaEE了

目录 前言一、为什么要学习JavaEE二、JavaEE规范介绍1.什么是规范&#xff1f;2.什么是JavaEE规范&#xff1f;3.JavaEE版本 三、JavaEE应用程序模型1.模型前置说明2.模型具体说明 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好者&#xff0c;小白白。我们的天…