3 自主项目
本章节将列出自我实现的一些实践项目。
本章节将列出自我实现的一些实践项目。
项目地址:https://github.com/irscript/AirVM
项目地址:https://gitee.com/irscript/airlang
dump: parser.air
package Test{
main(
arg string[] final
) int32
{
i int32 =
0
;
j int32 =
1
;
f flt32 =
0
;
f2 flt32 =
0
;
ires int32 =
i
+
j
;
fres flt32 =
f2
+
f
;
i16 int16 =
0
;
u16 uint16 =
0
;
i32 int32 =
i16
+
u16
;
i32
++
;
return
0
;
}
}
dump: parser.air
package Test{
@static
@public
main(
arg string[] final
) int32
{
i int32 =
0 :T= int32
;
j int32 =
1 :T= int32
;
f flt32 =
0.000000 :T= flt32
;
f2 flt32 =
0.000000 :T= flt32
;
ires int32 =
i :T= int32
+
j :T= int32
:T= int32
;
fres flt32 =
f2 :T= flt32
+
f :T= flt32
:T= flt32
;
i16 int16 =
0 :T= int16
;
u16 uint16 =
0 :T= uint16
;
i32 int32 =
cast<
int32
>(
i16 :T= int16
)
+
cast<
int32
>(
u16 :T= uint16
)
:T= int32
;
i32 :T= int32
++
:T= int32
;
return
0 :T= int32
;
}
}
Test.main(string[] final)int32
{
def-arg arg : string[] final
%$entry:
{
def-var i : int32
assign<i32> 0 => i
def-var j : int32
assign<i32> 1 => j
def-var f : flt32
assign<f32> 0.000000 => f
def-var f2 : flt32
assign<f32> 0.000000 => f2
def-var ires : int32
def-var %0 : int32
add<i32> i, j => %0
assign<i32> %0 => ires
def-var fres : flt32
def-var %1 : flt32
add<f32> f2, f => %1
assign<f32> %1 => fres
def-var i16 : int16
assign<i16> 0 => i16
def-var u16 : uint16
assign<u16> 0 => u16
def-var i32 : int32
def-var %2 : int32
extend<i16=>i32> i16 => %2
def-var %3 : int32
extend<u16=>i32> u16 => %3
def-var %4 : int32
add<i32> %2, %3 => %4
assign<i32> %4 => i32
def-var %5 : int32
assign<i32> i32 => %5
inc<i32> i32 => i32
return<i32> 0
}
%$end:
}
基于opengl的的GUI库设计和实现。 项目地址:https://gitee.com/irscript/gui
时常需要一些小工具,来完成一些功能,故特此开发一些工具。
项目地址:https://gitee.com/irscript/ToolSet
多语言映射编译工具
把符合定义规范的文件编译成 C语言代码和自定义二进制文件
输入命令行格式: i18n -i infile infile2 -o outfile [-c] [-t]
-i :指示后面是输入文件
-o :指示后面是输出文件
-c :指示编译格式,无 -c 时,表示编译成二进制格式,否则编译成C语言代码
-t :指示强制分配枚举值,同时生成的C语言代码中只有枚举字符串的值
-v :只是文件的版本号
输入文件格式
枚举名称,枚举值,字符串
menu_edit, 1 , "编辑"
menu_copy, 2 , "复制"
注:
#字符开始的一行会被跳过
文本编码最好为 UTF-8 编码
枚举值为0或者为空时,表示自动分配枚举值
输出文件格式
代码文件
枚举声明文件
enum{ menu_edit=1, menu_copy=2,};
静态数组文件
cstring gTslArr[]={"编辑","复制"}
kuint32 gTslEnum[]={menu_edit,menu_copy,};
二进制文件格式
-------------------------------------------------------------------
| 文件头 | 单元偏移数组 |EMS翻译单元 | EMS翻译单元 | ... |
-------------------------------------------------------------------
注:填充整数时采用字节序列为 小端 的顺序
文件头:
魔数:4 byte 为 i18n 字母的值
哈希值:4 byte crc32 文件内容的哈希值
翻译版本:4 byte 无符号,表示翻译文件版本号
EMS总数:4 byte 无符号,表示翻译单元的总数
枚举值是否连续: 4 byte 无符号,表示枚举值是否连续
翻译数据大小:4 byte 无符号,表示翻译数据的总大小
EMS翻译单元格式
枚举值:4 byte 无符号
字符串长度:2 byte 无符号,包括 null 字符
字符串数据:0xFFFF 长的字符串数据,编码和文本编码一致(建议文本采用UTF-8编码),两字节对齐
window平台下的自解压原理案例,可用于实现自定义安装包。
将文件转成C语言代码。