最近想做个工具来做一些lua代码检测,比如统计某函数体里的a函数的调用次数,调用绑定事件后是否有把其返回值在某退出函数里解绑定,或者某函数调用的参数是不是和协议文档里的有对应上(这个还是建议直接从协议文档生成lua代码的好).
大学时就用正则表达式做过java代码的解析了,这次想换个实现姿势,也想弄个通用点的,大致想法就是提取lua代码中的函数体和表达式信息,并转化成一些字符串列表方便查询。比如把一个函数调用拆成函数名、参数列表和返回值列表几个部分。还好lua是开源,干脆就从它的语法解析器下手,大部分工作它都做好了,我们只需要在某个时机把字符串保存下来。
为了方便查询、扩展结构和好看的打印,所以我用json格式存放解析后的信息。
表达式有好多类型,比如函数调用、赋值、判断语句等,暂时只需要用到函数调用的,以后有空再实现其它类型吧。
比如传入lua代码:
function func1()
local result_val = self:func2("arge")
end
将生成json代码:
"func_name": "func1"
最近想做个工具来做一些lua代码检测,比如统计某函数体里的a函数的调用次数,调用绑定事件后是否有把其返回值在某退出函数里解绑定,或者某函数调用的参数是不是和协议文档里的有对应上(这个还是建议直接从协议文档生成lua代码的好).大学时就用正则表达式做过java代码的解析了,这次想换个实现姿势,也想弄个通用点的,大致想法就是提取lua代码中的函数体和表达式信息,并转化成一些字符串列表方便查询。比如把一...
config.
lua
print('--In
Lua
--')local a = -10
print('--math.abs(a)--',math.abs(a))width = 1080
height = 720name = "iphone"
numStr = 12345function test1()
print('--function test1--')
endfunction test2(
1.脚本不要大写大写字母或者下划线开头做变量,因为它们被用来做保留字(环境变量啥的)。
2.变量的创建,直接使用一个变量即可,不存在就创建,没有赋
值
就认为变量的
值
为nil。删除一个全局变量,将其
值
赋
值
为nil,即一个变量是否存在看其
值
是否为nil。nil在用来作比较时,应该加上双引号”nil”如 type(x)==”nil”,type(type(X))==string
3.对一个数字字符串进...
2、第一种获取方法:通过GetFunction方法获取
Lua
Function function =
Lua
Mgr.GetInstance().
Lua
State.GetFunction("testFun");
//
调用
function.Call();
3、第二种方法:通过[
函数
名
通过
调用
含有一个内部
函数
加上该外部
函数
持有的外部局部变量(upvalue)的外部
函数
(就是工厂)产生的一个实例
函数
外部
函数
+外部
函数
创建的upvalue+内部
函数
(闭包
函数
)
function test()
local Test=0
return function()--//尾
调用
Test =Test + 1
return Test
主要利用到
lua
中的debug库中的getinfo方法。
在使用该方法之前,先了解一下
lua
中栈层的概念。一个栈层是一个数字,它表示某一时刻某个活动的
函数
,即一个正在
调用
还未
返回
的
函数
。
调用
调试库的
函数
是层1,
调用
这个
函数
的
函数
是层2。
debug.getinfo(function[,what]) 第一个
参数
是一个
函数
或是栈层,
返回
值
是一个table,关于该
函数
或该栈层上
函数
的相关
信息
,来看
对于
Lua
调用
Mosquitto库,需要使用
Lua
的C API进行封装,然后通过
Lua
脚本进行
调用
。Mosquitto库提供了一些
函数
,其中mosquitto.new
函数
用于创建一个Mosquitto客户端实例。下面是该
函数
的详细解释:
函数
原型:
struct mosquitto *mosquitto_new(const char *id, bool clean_session, void *userdata)
函数
参数
:
- id:字符串类型,表示客户端标识符,如果id为NULL,则Mosquitto库将自动为客户端生成一个唯一的标识符。
- clean_session:布尔类型,表示是否启用清除会话功能。如果设置为true,则在客户端断开连接时,Mosquitto服务器将删除与客户端相关的所有
信息
。如果设置为false,则在客户端断开连接时,Mosquitto服务器将保留与客户端相关的
信息
,以便客户端重新连接。
- userdata:指针类型,表示用户数据,可以传递任何类型的数据,Mosquitto库不会对其进行处理,只是简单地将其传递给回调
函数
,以便用户在回调
函数
中使用。
函数
返回
值
:
- 成功:
返回
一个指向mosquitto结构体的指针,表示创建的Mosquitto客户端实例。
- 失败:
返回
NULL,表示创建失败。
示例
代码
:
#include <mosquitto.h>
#include <stdio.h>
int main(int argc, char *argv[])
struct mosquitto *mosq = NULL;
mosq = mosquitto_new("client1", true, NULL);
if(mosq){
printf("Mosquitto client created successfully.\n");
mosquitto_destroy(mosq);
}else{
printf("Failed to create Mosquitto client.\n");
return 0;
在上面的示例
代码
中,我们创建了一个名为client1的Mosquitto客户端实例,并启用了清除会话功能。如果创建成功,则打印“Mosquitto client created successfully.”,否则打印“Failed to create Mosquitto client.”。最后,我们使用mosquitto_destroy
函数
销毁Mosquitto客户端实例,释放内存。
static public UnityEngine.Object GUIDToObject(string guid)
if (string.IsNullOrEmpty(guid)) return null;
if (s_GetInstanceIDFromGUID == null)
s_GetInstanceIDFromGUID = typeof(AssetDatabase).GetMethod("GetInstanceIDFromGUID", BindingFlags.Static | BindingFlags.NonPublic);
//s_GetInstanceIDFromGUID为null 怎么解决啊
int id = (int)s_GetInstanceIDFromGUID.Invoke(null, new object[] { guid });
if (id != 0) return EditorUtility.InstanceIDToObject(id);
string path = AssetDatabase.GUIDToAssetPath(guid);
if (string.IsNullOrEmpty(path)) return null;
return AssetDatabase.LoadAssetAtPath(path, typeof(UnityEngine.Object));
在windows上编译PC和Android平台的xlua库(并加入第三方lua库lpeg,sproto,lua-crypt)
一弈尘一:
在windows上编译PC和Android平台的xlua库(并加入第三方lua库lpeg,sproto,lua-crypt)
一弈尘一:
在windows上编译PC和Android平台的xlua库(并加入第三方lua库lpeg,sproto,lua-crypt)
一弈尘一: