抽象语法树节点.class.e.txt 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. .版本 2
  2. .支持库 spec
  3. .支持库 eAPI
  4. .程序集 抽象语法树节点, , 公开
  5. .程序集变量 当前节点指针, 长整数型
  6. .程序集变量 已初始化, 逻辑型
  7. .子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用
  8. 已初始化 = 假
  9. ' {
  10. ' char 函数名[16], // 定长16, 再长不支持了
  11. ' int32_t 参数量,
  12. ' int32_t 参数数组容量, // 参数数组指针后有多大容量
  13. ' uint64_t 参数数组指针, // 长整数, 未来迁移到x64时兼容
  14. ' }
  15. ' // 此结构单个长度为 16+8+8 = 32 字节
  16. .子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用
  17. .如果真 (已初始化)
  18. 调试输出 (格式化文本 (“警告: %x : %s 未释放内存而销毁”, 到整数 (当前节点指针), 获取函数名 ()))
  19. .如果真结束
  20. .子程序 初始化内存, , 公开
  21. .参数 函数名, 文本型, 可空
  22. 当前节点指针 = 到长整数 (申请内存 (#语法树节点_长度, 真))
  23. .如果真 (是否为空 (函数名) = 假)
  24. 设置函数名 (函数名)
  25. .如果真结束
  26. 设置参数指针地址 (申请内存 (#语法树节点_参数容量初始值 × #指针大小, 真))
  27. 设置参数容量 (#语法树节点_参数容量初始值)
  28. 已初始化 = 真
  29. .子程序 释放结构内存, , 公开
  30. .如果真 (获取参数容量 () ≠ 0)
  31. 释放内存 (获取参数指针地址 ())
  32. .如果真结束
  33. 释放内存 (当前节点指针)
  34. 已初始化 = 假
  35. .子程序 从内存初始化, 抽象语法树节点, 公开
  36. .参数 地址, 长整数型
  37. .局部变量 res, 抽象语法树节点
  38. res.设置当前节点指针 (地址)
  39. 返回 (res)
  40. .子程序 获取当前节点指针, 长整数型, 公开
  41. 返回 (当前节点指针)
  42. .子程序 设置当前节点指针, , 公开
  43. .参数 地址, 长整数型
  44. 当前节点指针 = 地址
  45. .子程序 设置函数名, , 公开
  46. .参数 函数名, 文本型, , 最长实际上是 #语法树节点_函数名最大长度-1
  47. .局部变量 字节数组, 字节型, , "16"
  48. .局部变量 i
  49. .局部变量 函数名长度, 整数型
  50. 重定义数组 (字节数组, 假, #语法树节点_函数名最大长度)
  51. 函数名长度 = 取文本长度 (函数名)
  52. .计次循环首 (#语法树节点_函数名最大长度, i)
  53. .判断开始 (i = #语法树节点_函数名最大长度 或 i > 函数名长度)
  54. 字节数组 [i] = 到字节 (0)
  55. .默认
  56. 字节数组 [i] = 取代码 (函数名, i)
  57. .判断结束
  58. .计次循环尾 ()
  59. 写到内存 (字节数组, 当前节点指针 + #语法树节点_函数名偏移, #语法树节点_函数名最大长度)
  60. .子程序 获取函数名, 文本型, 公开
  61. 返回 (指针到文本 (当前节点指针 + #语法树节点_函数名偏移))
  62. .子程序 设置参数数量, , 公开
  63. .参数 量, 长整数型
  64. 写到内存 (量, 当前节点指针 + #语法树节点_参数量偏移, 4)
  65. .子程序 获取参数数量, 整数型, 公开
  66. .局部变量 字节数组, 通用型, , "0"
  67. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数量偏移, 4), #整数型, ))
  68. .子程序 设置参数容量, , 公开
  69. .参数 量, 整数型
  70. 写到内存 (量, 当前节点指针 + #语法树节点_参数容量偏移, 4)
  71. .子程序 获取参数容量, 整数型, 公开
  72. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数容量偏移, 4), #整数型, ))
  73. .子程序 设置参数指针地址, , 公开
  74. .参数 地址, 长整数型
  75. 写到内存 (地址, 当前节点指针 + #语法树节点_参数指针偏移, #指针大小)
  76. .子程序 获取参数指针地址, 长整数型, 公开, 已经不在本结构体了, 在远处了
  77. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数指针偏移, #指针大小), #长整数型, ))
  78. .子程序 获取结构体字节集, 字节集, 公开
  79. 返回 (指针到字节集 (当前节点指针, #语法树节点_长度))
  80. .子程序 获取参数数组字节集, 字节集, 公开
  81. 返回 (指针到字节集 (获取参数指针地址 (), 获取参数数量 () × #指针大小))
  82. .子程序 扩容参数指针, 长整数型, 公开
  83. .参数 新长度, 整数型, 可空
  84. .局部变量 旧参数指针地址, 长整数型
  85. .局部变量 旧参数数组打包, 字节集
  86. .局部变量 新参数指针地址, 长整数型
  87. .如果真 (是否为空 (新长度))
  88. 新长度 = 获取参数容量 () × #语法树节点_参数容量扩张系数
  89. .如果真结束
  90. 旧参数指针地址 = 获取参数指针地址 ()
  91. 旧参数数组打包 = 获取参数数组字节集 ()
  92. 新参数指针地址 = 申请内存 (新长度 × #指针大小, 真)
  93. 写到内存 (旧参数数组打包, 新参数指针地址, 获取参数数量 () × #指针大小)
  94. 释放内存 (旧参数指针地址)
  95. 设置参数指针地址 (新参数指针地址)
  96. 设置参数容量 (新长度)
  97. 返回 (新参数指针地址)
  98. .子程序 添加参数节点, , 公开
  99. .参数 节点, 抽象语法树节点
  100. .局部变量 当前参数数量, 整数型
  101. 当前参数数量 = 获取参数数量 ()
  102. .如果真 (当前参数数量 ≥ 获取参数容量 ())
  103. 扩容参数指针 ()
  104. .如果真结束
  105. 写到内存 (节点.获取当前节点指针 (), 获取参数指针地址 () + 当前参数数量 × #指针大小, )
  106. 设置参数数量 (当前参数数量 + 1)
  107. .子程序 获取参数节点, 抽象语法树节点, 公开
  108. .参数 i, 整数型, 可空
  109. .如果真 (是否为空 (i))
  110. i = 获取参数数量 ()
  111. .如果真结束
  112. 返回 (从内存初始化 (指针到整数 (获取参数指针地址 () + (i - 1) × #指针大小)))
  113. .子程序 生成展示文本, 文本型, 公开
  114. 返回 (格式化文本 (“%s | 基地址: %x | 参数数量: %d | 参数容量: %d | 参数数组地址: %x ”, 获取函数名 (), 到整数 (获取当前节点指针 ()), 到整数 (获取参数数量 ()), 到整数 (获取参数容量 ()), 到整数 (获取参数指针地址 ())))