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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. .版本 2
  2. .支持库 spec
  3. .支持库 eAPI
  4. .程序集 抽象语法树节点, , 公开
  5. .程序集变量 当前节点指针, 长整数型, 数组
  6. .程序集变量 已初始化, 逻辑型, 数组
  7. .程序集变量 失败, 逻辑型, 数组
  8. .子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用
  9. 已初始化 = 假
  10. ' {
  11. ' char 函数名[16], // 定长16, 再长不支持了
  12. ' int32_t 参数量,
  13. ' int32_t 参数数组容量, // 参数数组指针后有多大容量
  14. ' uint64_t 参数数组指针, // 长整数, 未来迁移到x64时兼容
  15. ' }
  16. ' // 此结构单个长度为 16+8+8 = 32 字节
  17. .子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用
  18. .如果真 (已初始化)
  19. ' 调试输出 (格式化文本 (“警告: %x : %s 未释放内存而销毁”, 到整数 (当前节点指针), 获取函数名 ()))
  20. .如果真结束
  21. .子程序 初始化内存, , 公开
  22. .参数 函数名, 文本型, 可空
  23. .参数 父节点地址, 长整数型, 可空
  24. 当前节点指针 = 到长整数 (申请内存 (#语法树节点_长度, 真))
  25. .如果真 (是否为空 (函数名) = 假)
  26. 设置函数名 (函数名)
  27. .如果真结束
  28. .如果真 (是否为空 (父节点地址) = 假)
  29. 设置父节点指针地址 (父节点地址)
  30. .如果真结束
  31. ' 调试输出 (“设置参数指针地址”)
  32. 设置参数指针地址 (申请内存 (#语法树节点_参数容量初始值 × #指针大小, 真))
  33. 设置参数容量 (#语法树节点_参数容量初始值)
  34. 已初始化 = 真
  35. .子程序 初始化否, 逻辑型
  36. 返回 (已初始化)
  37. .子程序 释放结构内存, , 公开
  38. .如果真 (获取参数容量 () ≠ 0)
  39. 释放内存 (获取参数指针地址 ())
  40. .如果真结束
  41. 释放内存 (当前节点指针)
  42. 已初始化 = 假
  43. .子程序 生成子节点, 抽象语法树节点, 公开
  44. .参数 子节点函数名, 文本型, 可空
  45. .局部变量 ast, 抽象语法树节点, 数组
  46. .如果 (是否为空 (子节点函数名))
  47. ast.设置函数名 (子节点函数名)
  48. .否则
  49. ast.设置函数名 (格式化文本 (“%s 的子节点”, 获取函数名 ()))
  50. .如果结束
  51. ast.设置父节点指针地址 (获取当前节点指针 ())
  52. 返回 (ast)
  53. .子程序 生成匹配失败节点, 抽象语法树节点, 公开
  54. .局部变量 ast, 抽象语法树节点, 数组
  55. ast = 生成子节点 (格式化文本 (“%s 的失败子节点”, 获取函数名 ()))
  56. ast._设置失败 ()
  57. 返回 (ast)
  58. .子程序 失败, 逻辑型, 公开
  59. 返回 (失败)
  60. .子程序 成功, 逻辑型, 公开
  61. 返回 (失败 = 假)
  62. .子程序 _设置失败, , 公开
  63. 失败 = 真
  64. 已初始化 = 假
  65. .子程序 从内存初始化, 抽象语法树节点, 公开
  66. .参数 地址, 长整数型
  67. .局部变量 res, 抽象语法树节点, 数组
  68. res.设置当前节点指针 (地址)
  69. 返回 (res)
  70. .子程序 获取当前节点指针, 长整数型, 公开
  71. 返回 (当前节点指针)
  72. .子程序 设置当前节点指针, , 公开
  73. .参数 地址, 长整数型
  74. 当前节点指针 = 地址
  75. .子程序 设置函数名, , 公开
  76. .参数 函数名, 文本型, , 最长实际上是 #语法树节点_函数名最大长度-1
  77. .局部变量 字节数组, 字节型, 数组, "16"
  78. .局部变量 i, , 数组
  79. .局部变量 函数名长度, 整数型, 数组
  80. 重定义数组 (字节数组, 假, #语法树节点_函数名最大长度)
  81. 函数名长度 = 取文本长度 (函数名)
  82. .计次循环首 (#语法树节点_函数名最大长度, i)
  83. .判断开始 (i = #语法树节点_函数名最大长度 或 i > 函数名长度)
  84. 字节数组 [i] = 到字节 (0)
  85. .默认
  86. 字节数组 [i] = 取代码 (函数名, i)
  87. .判断结束
  88. .计次循环尾 ()
  89. 写到内存 (字节数组, 当前节点指针 + #语法树节点_函数名偏移, #语法树节点_函数名最大长度)
  90. .子程序 获取函数名, 文本型, 公开
  91. 返回 (指针到文本 (当前节点指针 + #语法树节点_函数名偏移))
  92. .子程序 设置语类, , 公开
  93. .参数 类, 整数型
  94. .局部变量 当前语类, 整数型
  95. .局部变量 新类, 整数型
  96. 当前语类 = 获取语类 ()
  97. 新类 = 到整数 (当前语类 + 类)
  98. ' 调试输出 (当前语类, 类, 新类)
  99. .如果 (位与 (当前语类, 类) ≠ 0)
  100. ' 调试输出 (“警告: 重复设置语类”, 类)
  101. .否则
  102. 写到内存 (新类, 当前节点指针 + #语法树节点_语类, 4)
  103. .如果结束
  104. .子程序 清理语类, , 公开
  105. .参数 类, 整数型
  106. .局部变量 当前语类, 整数型
  107. .局部变量 新类, 整数型
  108. 当前语类 = 获取语类 ()
  109. 新类 = 到整数 (当前语类 - 类)
  110. ' 调试输出 (当前语类, 类, 新类)
  111. .如果 (位与 (当前语类, 类) = 0)
  112. ' 调试输出 (“警告: 尝试清除不存在语类”, 类)
  113. .否则
  114. 写到内存 (新类, 当前节点指针 + #语法树节点_语类, 4)
  115. .如果结束
  116. .子程序 获取语类, 整数型, 公开
  117. .局部变量 字节数组, 通用型, 数组, "0"
  118. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_语类, 4), #整数型, ))
  119. .子程序 包含语类, 逻辑型, 公开
  120. .参数 类, 整数型
  121. .局部变量 当前语类, 整数型
  122. 当前语类 = 获取语类 ()
  123. 返回 (位与 (当前语类, 类) ≠ 0)
  124. .子程序 设置词类, , 公开
  125. .参数 类, 整数型
  126. 写到内存 (类, 当前节点指针 + #语法树节点_词类, 4)
  127. .子程序 获取词类, 整数型, 公开
  128. .局部变量 字节数组, 通用型, 数组, "0"
  129. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_词类, 4), #整数型, ))
  130. .子程序 设置参数数量, , 公开
  131. .参数 量, 长整数型
  132. 写到内存 (量, 当前节点指针 + #语法树节点_参数量偏移, 4)
  133. .子程序 获取参数数量, 整数型, 公开
  134. .局部变量 字节数组, 通用型, 数组, "0"
  135. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数量偏移, 4), #整数型, ))
  136. .子程序 设置参数容量, , 公开
  137. .参数 量, 整数型
  138. 写到内存 (量, 当前节点指针 + #语法树节点_参数容量偏移, 4)
  139. .子程序 获取参数容量, 整数型, 公开
  140. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数容量偏移, 4), #整数型, ))
  141. .子程序 设置参数指针地址, , 公开
  142. .参数 地址, 长整数型
  143. 写到内存 (地址, 当前节点指针 + #语法树节点_参数指针偏移, #指针大小)
  144. .子程序 获取参数指针地址, 长整数型, 公开, 已经不在本结构体了, 在远处了
  145. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数指针偏移, #指针大小), #长整数型, ))
  146. .子程序 获取结构体字节集, 字节集, 公开
  147. 返回 (指针到字节集 (当前节点指针, #语法树节点_长度))
  148. .子程序 获取参数数组字节集, 字节集, 公开
  149. 返回 (指针到字节集 (获取参数指针地址 (), 获取参数数量 () × #指针大小))
  150. .子程序 扩容参数指针, 长整数型, 公开
  151. .参数 新长度, 整数型, 可空
  152. .局部变量 旧参数指针地址, 长整数型, 数组
  153. .局部变量 旧参数数组打包, 字节集, 数组
  154. .局部变量 新参数指针地址, 长整数型, 数组
  155. .如果真 (是否为空 (新长度))
  156. 新长度 = 获取参数容量 () × #语法树节点_参数容量扩张系数
  157. .如果真结束
  158. 旧参数指针地址 = 获取参数指针地址 ()
  159. 旧参数数组打包 = 获取参数数组字节集 ()
  160. 新参数指针地址 = 申请内存 (新长度 × #指针大小, 真)
  161. 写到内存 (旧参数数组打包, 新参数指针地址, 获取参数数量 () × #指针大小)
  162. 释放内存 (旧参数指针地址)
  163. 设置参数指针地址 (新参数指针地址)
  164. 设置参数容量 (新长度)
  165. 返回 (新参数指针地址)
  166. .子程序 添加参数节点, , 公开
  167. .参数 节点, 抽象语法树节点
  168. .局部变量 当前参数数量, 整数型, 数组
  169. 当前参数数量 = 获取参数数量 ()
  170. .如果真 (当前参数数量 ≥ 获取参数容量 ())
  171. 扩容参数指针 ()
  172. .如果真结束
  173. 节点.设置父节点指针地址 (获取当前节点指针 ())
  174. 写到内存 (节点.获取当前节点指针 (), 获取参数指针地址 () + 当前参数数量 × #指针大小, )
  175. 设置参数数量 (当前参数数量 + 1)
  176. .子程序 插入参数节点, , 公开
  177. .参数 节点, 抽象语法树节点
  178. .局部变量 当前参数数量, 整数型, 数组
  179. .局部变量 新参数指针地址, 整数型, 数组
  180. .局部变量 旧参数数组打包, 字节集, 数组
  181. .局部变量 旧参数指针地址, 长整数型, 数组
  182. 当前参数数量 = 获取参数数量 ()
  183. .如果真 (当前参数数量 ≥ 获取参数容量 ())
  184. 扩容参数指针 ()
  185. .如果真结束
  186. 旧参数指针地址 = 获取参数指针地址 ()
  187. 旧参数数组打包 = 获取参数数组字节集 ()
  188. 新参数指针地址 = 申请内存 (获取参数容量 () × #指针大小, 真)
  189. 写到内存 (到字节集 (节点.获取当前节点指针 ()) + 旧参数数组打包, 新参数指针地址, (当前参数数量 + 1) × #指针大小)
  190. 释放内存 (旧参数指针地址)
  191. 设置参数指针地址 (新参数指针地址)
  192. 设置参数数量 (当前参数数量 + 1)
  193. .子程序 生成自词节点, 抽象语法树节点, 公开
  194. .参数 词, 词
  195. .局部变量 n, 抽象语法树节点, 数组
  196. n.初始化内存 (词.内容, )
  197. n.设置词类 (词.类型)
  198. 返回 (n)
  199. .子程序 添加词节点, , 公开
  200. .参数 词, 词
  201. 添加文本节点 (词.内容)
  202. .子程序 添加文本节点, , 公开
  203. .参数 文本, 文本型
  204. .局部变量 n, 抽象语法树节点, 数组
  205. n.初始化内存 (文本)
  206. 添加参数节点 (n)
  207. .子程序 获取参数节点, 抽象语法树节点, 公开
  208. .参数 i, 整数型, 可空
  209. .如果真 (是否为空 (i))
  210. i = 获取参数数量 ()
  211. .如果真结束
  212. 返回 (从内存初始化 (指针到整数 (获取参数指针地址 () + (i - 1) × #指针大小)))
  213. .子程序 生成展示文本, 文本型, 公开
  214. .局部变量 词类展示名集合, 文本型, , "0"
  215. .局部变量 语类展示名集合, 文本型, , "0"
  216. .局部变量 语类, 整数型
  217. .局部变量 语类展示名, 文本型
  218. .局部变量 i, 整数型
  219. .局部变量 当前掩码, 整数型
  220. ' 返回 (格式化文本 (“%s | 基地址: %x | 参数数量: %d | 参数容量: %d | 参数数组地址: %x ”, 获取函数名 (), 到整数 (获取当前节点指针 ()), 到整数 (获取参数数量 ()), 到整数 (获取参数容量 ()), 到整数 (获取参数指针地址 ())))
  221. 语类展示名集合 = { “语类_未定义”, “语类_定义”, “语类_函数调用”, “语类_函数原型”, “语类_形式参数”, “语类_实际参数”, “语类_根” }
  222. 语类 = 获取语类 ()
  223. .如果 (语类 = 0)
  224. 语类展示名 = 语类展示名 + 语类展示名集合 [语类 + 1]
  225. .否则
  226. .计次循环首 (取数组成员数 (语类展示名集合), i)
  227. 当前掩码 = 左移 (1, i) ÷ 2
  228. .如果真 (位与 (当前掩码, 语类) ≠ 0)
  229. 语类展示名 = 语类展示名 + 语类展示名集合 [i + 1] + “ ”
  230. .如果真结束
  231. .计次循环尾 ()
  232. .如果结束
  233. 词类展示名集合 = { “词类_未定义”, “词类_数字”, “词类_整数部分”, “词类_小数部分”, “词类_标识符”, “词类_算符”, “词类_括号”, “词类_注释”, “词类_逗号”, “词类_双等号”, “词类_单等号”, “词类_空格”, “词类_结尾” }
  234. 返回 (格式化文本 (“%s | %s | %s| 参数数量: %d ”, 获取函数名 (), 词类展示名集合 [获取词类 () + 1], 语类展示名, 到整数 (获取参数数量 ())))
  235. .子程序 设置父节点, , 公开
  236. .参数 父节点, 抽象语法树节点
  237. 设置父节点指针地址 (父节点.获取当前节点指针 ())
  238. .子程序 设置父节点指针地址, , 公开
  239. .参数 地址, 长整数型
  240. 写到内存 (地址, 当前节点指针 + #语法树节点_父节点指针偏移, #指针大小)
  241. .子程序 获取父节点指针地址, 长整数型, 公开, 已经不在本结构体了, 在远处了
  242. 返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_父节点指针偏移, #指针大小), #长整数型, ))
  243. .子程序 获取父节点, 抽象语法树节点, 公开
  244. 返回 (从内存初始化 (获取父节点指针地址 ()))