自主项目 的子部分

3.2 编译器设计与实现


项目地址:https://gitee.com/irscript/airlang

  • c 系语法。
  • 前端基本实现。
  • 中端优化未实现。
  • 汇编代码生成未实现。
  • 可作为参考示例。

语法树打印

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
        ;
    }
}

IR 转换

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:
}

待续

3.3 GUI设计与实现


基于opengl的的GUI库设计和实现。 项目地址:https://gitee.com/irscript/gui

  • 支持中文输入。
  • 主题可配置。
  • 当前仅是个demo。
  • 支持utf8编码。

运行截图: alt text alt text

3.4 工具设计与实现


时常需要一些小工具,来完成一些功能,故特此开发一些工具。

项目地址: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平台下的自解压原理案例,可用于实现自定义安装包。

文件转2进制

将文件转成C语言代码。