原始代码

  • 保留最初代码是为了保留思维路程

设计思路是逐行解析,每行只处理一个代码语法,所以一行不允许写入多个关键字,

如:

me          # 正确语法
me me    # 不允许

有两个文件,一个是 iota2str , 功能是把 Ducky Peripherals mod 中 focal_port 里的核心的 图案列表读取出来转换成 lua表格式的字符串,以用来在另一个文件中使用

另一个文件是 hexCompiler ,其中的 hexMap 是关键字到图案的映射表,使用需要带一个参数,而参数则是你想编译的文件文件名,代码默认如果检测到 focal_port,则会向其写入最终的输出iota

源码文件一行一个命令

目前提供的 hexMap 并不是完善版本,具体映射表最好还是自己设置,每个人的语言习惯都不同,所以只提供部分映射以供参考

iota2str - Pastebin.com

hex compiler - Pastebin.com

source_code:

{
me
pos
me
sight
me
me
me
pos
{
    {
        unpack
    }
}
}

output:

一个通过Ducky Peripherals实现的咒术编译器-第1张图片

无定型图案生成版

后续添加了生成数字图案和移除栈指定元素的图案的版本,提供两个版本,除了数字图案生成规则之外代码一致,语法匹配切换成了正则表达式,可以自由拓展。

移除指定栈元素语法定义:

rm 位置

详细可以见参考代码

hexCompiler_multiPattern - Pastebin.com :

通过堆栈式的十进制遍历每一位来生成计算图案列表,如果数字位数为 N > 1,图案列表长度为 4(N-1) + 2, N = 1 时长度为 1


hexcompiler_infinityTri - Pastebin.com :

因为Ducky Peripherals 允许生成重叠图案,于是就有这个版本,通过直接重叠绘画以一个图案实现数字常量,图案列表长度为 1


参考代码:

{
me
rm 1
me
sight
    {
        0
        12
        456
    }
rm 2
}

添加包, 函数和注释功能

注释

注释可以是整行注释,也可以注释在代码行后面,关键字是 #

注释代码:

# this is a comment
get_sightCastBlock() # get the sight cast block pos
dig                            # dig pos block

函数

添加了函数功能,函数在文件中定义,没有参数,更类似 C 的宏定义替换。定义函数以 @func 函数名 开始,以 @end 结束,调用时,使用 函数名加括号: 函数名() 来实现函数调用。如果要调用函数,需要保证函数的定义在调用之前。

@func get_sightCastBlock
    me
    pos
    me
    sight
    get_block
@end

get_sightCastBlock()

出于对复用功能的考虑,提供了包。包是函数的集合,是一种特殊的文件,与普通文件相比,就是只有函数定义,没有其他普通代码,一个文件中不允许出现在函数体之外的代码,否则会解析不正常。使用 @include 文件路径 关键字来导入包。

这里提供一个示范,将函数写在 tools 中,但是在tst中去调用该函数。

tools:

@func get_sightCastBlock
    me
    pos
    me
    sight
    get_block
@end

tst:

@include tools
get_sightCastBlock()

输出:一个通过Ducky Peripherals实现的咒术编译器-第2张图片

源代码:HexCompiler - Pastebin.com

一些工具

为了更好的在游戏内进行即时编辑,制作了两个工具,并且将之前的编译器文件中的共用表提出作为单独的文件,也是为了更方便的修改,编译器使用方式和之前一致,只不过hexMap表需要在hexMap文件中进行编辑和完善,下面提供的两个工具都依赖于hexMap文件中的hexMap映射表

hex.lua - Pastebin.com

hexMap - Pastebin.com

代码编辑器

hedit 是我对cc自带的edit进行修改以实现在编辑时自动语法补全和高亮对应的关键词,使用和edit一样,只不过run被我替换成 compile,如果运行 hedit 的电脑连接了 focal_port 外设,则会显示 compile 选项,这会将当前的文件编译成iota写入 focal_port 中,其中的语法高亮和补全依赖于 hexMap中已经实现的映射

hedit.lua - Pastebin.com

辅助工具

iotaTools 文件是一个三个功能合一的工具,使用方式为 : iotaTools <命令> <参数>

可以对focal_port 中存有图案列表的iota进行一些方便的操作

命令的类型有:

  1. toStr:和之前的iota2str工具一致,将focal_port中的iota 转换为字符串存入 data 文件中

  2. dec: 反编译工具,读取 focal_port 中的 iota,根据你自己实现的hexMap映射转译为你定义的代码格式,其中不存在的映射会将angles 值替代填入,反编译出的代码会存入 dec_out 文件中

  3. append: 辅助完善hexMap工具,读取 focal_port 中的 iota,会查找该iota中在你的hexMap中不存在的映射,并添加对应缺省key值的映射到hexMap尾部,并存入 newHexMap 文件中,如果参数指定 overWrite,则会直接覆写 hexMap文件,该方法支持图案列表而不只单个图案

iotaTools.lua - Pastebin.com

启动脚本

这个启动脚本是为了让程序可以自动补全路径,以及命令,如果不运行,无法自动匹配对应的程序路径和参数,只需要保存这个启动脚本为 startup.lua即可,或是将其加入你自己的启动脚本,如果不使用它,每个程序在运行一次后也可以进行路径补全或者参数补全。

hexStartup - Pastebin.com

如果要使得功能 正常运行,除hexStartup.lua文件之外的代码文件需要保持名字与pastebin上的文件名一致,或是从github下载后保持文件名不变

后续更新

之后如果有代码更新,则推到github上,也方便记录更新内容

HexCastCompiler -(github)