tecscde 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rubocop.yml +125 -0
  4. data/.rubocop_todo.yml +188 -0
  5. data/CHANGELOG.md +3 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE +46 -0
  8. data/LICENSE.ja +32 -0
  9. data/README.ja.md +200 -0
  10. data/README.md +35 -0
  11. data/Rakefile +27 -0
  12. data/bin/tecscde +64 -0
  13. data/glade/tecscde-cell-property.glade +205 -0
  14. data/glade/tecscde-celltype-property.glade +172 -0
  15. data/glade/tecscde-celltype.glade +414 -0
  16. data/glade/tecscde-export.glade +161 -0
  17. data/glade/test-cell-plugin.rb +51 -0
  18. data/glade/test-cell-property.rb +35 -0
  19. data/glade/test-export.rb +35 -0
  20. data/glade/test-palette.rb +26 -0
  21. data/lib/tcflow.rb +148 -0
  22. data/lib/tecscde.rb +65 -0
  23. data/lib/tecscde/NewCell.png +0 -0
  24. data/lib/tecscde/SelectArrow.png +0 -0
  25. data/lib/tecscde/attr_tree_view.rb +253 -0
  26. data/lib/tecscde/cell_plugin_dialog.glade +294 -0
  27. data/lib/tecscde/cell_plugin_dialog.rb +89 -0
  28. data/lib/tecscde/celltype_tree_view.rb +105 -0
  29. data/lib/tecscde/change_set_control.rb +35 -0
  30. data/lib/tecscde/change_set_control/change_set.rb +32 -0
  31. data/lib/tecscde/change_set_control/change_set_manager.rb +62 -0
  32. data/lib/tecscde/command.rb +35 -0
  33. data/lib/tecscde/control.rb +491 -0
  34. data/lib/tecscde/highlighted_objects.rb +180 -0
  35. data/lib/tecscde/logger.rb +74 -0
  36. data/lib/tecscde/main_view_and_model.rb +80 -0
  37. data/lib/tecscde/palette.glade +553 -0
  38. data/lib/tecscde/palette.rb +174 -0
  39. data/lib/tecscde/preferences.glade +117 -0
  40. data/lib/tecscde/preferences.rb +44 -0
  41. data/lib/tecscde/tecs_model.rb +1137 -0
  42. data/lib/tecscde/tecs_model/hbar.rb +68 -0
  43. data/lib/tecscde/tecs_model/tm_c_port.rb +122 -0
  44. data/lib/tecscde/tecs_model/tm_c_port_array.rb +98 -0
  45. data/lib/tecscde/tecs_model/tm_cell.rb +496 -0
  46. data/lib/tecscde/tecs_model/tm_e_port.rb +126 -0
  47. data/lib/tecscde/tecs_model/tm_e_port_array.rb +78 -0
  48. data/lib/tecscde/tecs_model/tm_join.rb +293 -0
  49. data/lib/tecscde/tecs_model/tm_join_bar.rb +146 -0
  50. data/lib/tecscde/tecs_model/tm_port.rb +238 -0
  51. data/lib/tecscde/tecs_model/tm_port_array.rb +246 -0
  52. data/lib/tecscde/tecs_model/tm_region.rb +107 -0
  53. data/lib/tecscde/tecs_model/tm_uneditable.rb +68 -0
  54. data/lib/tecscde/tecs_model/vbar.rb +68 -0
  55. data/lib/tecscde/templates/_cell_info.cde.erb +15 -0
  56. data/lib/tecscde/templates/_join_info.cde.erb +28 -0
  57. data/lib/tecscde/templates/main.cde.erb +49 -0
  58. data/lib/tecscde/tm_object.rb +91 -0
  59. data/lib/tecscde/version.rb +4 -0
  60. data/lib/tecscde/view.rb +58 -0
  61. data/lib/tecscde/view/cairo_matrix.rb +90 -0
  62. data/lib/tecscde/view/canvas.rb +59 -0
  63. data/lib/tecscde/view/constants.rb +114 -0
  64. data/lib/tecscde/view/main_view.rb +1245 -0
  65. data/lib/tecsflow.rb +475 -0
  66. data/lib/tecsflow/C_parser.tab.rb +2471 -0
  67. data/lib/tecsflow/C_parser.y.rb +1087 -0
  68. data/lib/tecsflow/classes.rb +421 -0
  69. data/lib/tecsgen.rb +581 -0
  70. data/lib/tecsgen/core/C_parser.tab.rb +2477 -0
  71. data/lib/tecsgen/core/C_parser.y +1032 -0
  72. data/lib/tecsgen/core/bnf-deb.tab.rb +5193 -0
  73. data/lib/tecsgen/core/bnf.tab.rb +5193 -0
  74. data/lib/tecsgen/core/bnf.y +2211 -0
  75. data/lib/tecsgen/core/componentobj.rb +7901 -0
  76. data/lib/tecsgen/core/ctypes.rb +226 -0
  77. data/lib/tecsgen/core/expression.rb +1031 -0
  78. data/lib/tecsgen/core/gen_xml.rb +374 -0
  79. data/lib/tecsgen/core/generate.rb +5206 -0
  80. data/lib/tecsgen/core/location.rb +116 -0
  81. data/lib/tecsgen/core/messages.rb +101 -0
  82. data/lib/tecsgen/core/optimize.rb +456 -0
  83. data/lib/tecsgen/core/plugin.rb +332 -0
  84. data/lib/tecsgen/core/pluginModule.rb +165 -0
  85. data/lib/tecsgen/core/syntaxobj.rb +1234 -0
  86. data/lib/tecsgen/core/tecs_lang.rb +306 -0
  87. data/lib/tecsgen/core/tecsgen.rb +453 -0
  88. data/lib/tecsgen/core/tecsinfo.rb +860 -0
  89. data/lib/tecsgen/core/tool_info.rb +258 -0
  90. data/lib/tecsgen/core/types.rb +1632 -0
  91. data/lib/tecsgen/core/unjoin_plugin.rb +218 -0
  92. data/lib/tecsgen/core/value.rb +650 -0
  93. data/lib/tecsgen/messages/messages_console_en_US.rb +1171 -0
  94. data/lib/tecsgen/messages/messages_console_ja_JP.rb +1171 -0
  95. data/lib/tecsgen/messages/messages_file_en_US.rb +334 -0
  96. data/lib/tecsgen/messages/messages_file_ja_JP.rb +163 -0
  97. data/lib/tecsgen/plugin/ATK1AlarmPlugin.rb +196 -0
  98. data/lib/tecsgen/plugin/ATK1DelayTaskPlugin.rb +106 -0
  99. data/lib/tecsgen/plugin/ATK1EventPlugin.rb +147 -0
  100. data/lib/tecsgen/plugin/ATK1ISRPlugin.rb +174 -0
  101. data/lib/tecsgen/plugin/ATK1KernelPlugin.rb +287 -0
  102. data/lib/tecsgen/plugin/ATK1ResourcePlugin.rb +124 -0
  103. data/lib/tecsgen/plugin/ATK1TaskPlugin.rb +220 -0
  104. data/lib/tecsgen/plugin/C2TECSBridgePlugin.rb +210 -0
  105. data/lib/tecsgen/plugin/CellPlugin.rb +61 -0
  106. data/lib/tecsgen/plugin/CelltypePlugin.rb +72 -0
  107. data/lib/tecsgen/plugin/CompositePlugin.rb +66 -0
  108. data/lib/tecsgen/plugin/DomainPlugin.rb +89 -0
  109. data/lib/tecsgen/plugin/HRP2AlarmHandlerPlugin.rb +76 -0
  110. data/lib/tecsgen/plugin/HRP2Cache.rb +1 -0
  111. data/lib/tecsgen/plugin/HRP2CyclicHandlerPlugin.rb +75 -0
  112. data/lib/tecsgen/plugin/HRP2DataqueuePlugin.rb +68 -0
  113. data/lib/tecsgen/plugin/HRP2EventflagPlugin.rb +68 -0
  114. data/lib/tecsgen/plugin/HRP2FixedSizeMemoryPoolPlugin.rb +68 -0
  115. data/lib/tecsgen/plugin/HRP2HandlerPlugin.rb +117 -0
  116. data/lib/tecsgen/plugin/HRP2KernelObjectPlugin.rb +372 -0
  117. data/lib/tecsgen/plugin/HRP2ObjectPlugin.rb +94 -0
  118. data/lib/tecsgen/plugin/HRP2Plugin.rb +140 -0
  119. data/lib/tecsgen/plugin/HRP2PostHook.rb +111 -0
  120. data/lib/tecsgen/plugin/HRP2PriorityDataqueuePlugin.rb +66 -0
  121. data/lib/tecsgen/plugin/HRP2RPCPlugin.rb +319 -0
  122. data/lib/tecsgen/plugin/HRP2SVCPlugin.rb +473 -0
  123. data/lib/tecsgen/plugin/HRP2SemaphorePlugin.rb +67 -0
  124. data/lib/tecsgen/plugin/HRP2TaskPlugin.rb +200 -0
  125. data/lib/tecsgen/plugin/HRPHandlerPlugin.rb +125 -0
  126. data/lib/tecsgen/plugin/HRPKernelObjectManager.rb +72 -0
  127. data/lib/tecsgen/plugin/HRPKernelObjectPlugin.rb +333 -0
  128. data/lib/tecsgen/plugin/HRPObjectPlugin.rb +93 -0
  129. data/lib/tecsgen/plugin/HRPPlugin.rb +356 -0
  130. data/lib/tecsgen/plugin/HRPRPCPlugin.rb +407 -0
  131. data/lib/tecsgen/plugin/HRPSVCPlugin.rb +859 -0
  132. data/lib/tecsgen/plugin/HRPTaskPlugin.rb +107 -0
  133. data/lib/tecsgen/plugin/Mruby2CBridgePlugin.rb +86 -0
  134. data/lib/tecsgen/plugin/MrubyBridgeCellPlugin.rb +264 -0
  135. data/lib/tecsgen/plugin/MrubyBridgeCelltypePlugin.rb +293 -0
  136. data/lib/tecsgen/plugin/MrubyBridgeCompositePlugin.rb +49 -0
  137. data/lib/tecsgen/plugin/MrubyBridgePlugin.rb +67 -0
  138. data/lib/tecsgen/plugin/MrubyBridgeSignaturePlugin.rb +1307 -0
  139. data/lib/tecsgen/plugin/MrubyInfoBridgePlugin.rb +14 -0
  140. data/lib/tecsgen/plugin/MrubyInfoBridgeSignaturePlugin.rb +994 -0
  141. data/lib/tecsgen/plugin/MultiPlugin.rb +57 -0
  142. data/lib/tecsgen/plugin/NotifierPlugin.rb +1217 -0
  143. data/lib/tecsgen/plugin/OpaqueMarshalerPlugin.rb +81 -0
  144. data/lib/tecsgen/plugin/OpaqueRPCPlugin.rb +323 -0
  145. data/lib/tecsgen/plugin/RPCPlugin.rb +266 -0
  146. data/lib/tecsgen/plugin/RepeatCellPlugin.rb +166 -0
  147. data/lib/tecsgen/plugin/RepeatJoinPlugin.rb +130 -0
  148. data/lib/tecsgen/plugin/SharedOpaqueRPCPlugin.rb +357 -0
  149. data/lib/tecsgen/plugin/SharedRPCPlugin.rb +329 -0
  150. data/lib/tecsgen/plugin/SignaturePlugin.rb +77 -0
  151. data/lib/tecsgen/plugin/TECS2CBridgePlugin.rb +178 -0
  152. data/lib/tecsgen/plugin/TECSInfoPlugin.rb +280 -0
  153. data/lib/tecsgen/plugin/ThroughPlugin.rb +333 -0
  154. data/lib/tecsgen/plugin/TracePlugin.rb +484 -0
  155. data/lib/tecsgen/plugin/lib/GenHRP2Marshaler.rb +761 -0
  156. data/lib/tecsgen/plugin/lib/GenOpaqueMarshaler.rb +1107 -0
  157. data/lib/tecsgen/plugin/lib/GenParamCopy.rb +365 -0
  158. data/lib/tecsgen/plugin/lib/GenTransparentMarshaler.rb +683 -0
  159. data/lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb +283 -0
  160. data/lib/tecsgen/plugin/lib/MrubyBridgeSignaturePluginModule.rb +277 -0
  161. data/lib/tecsgen/version.rb +6 -0
  162. data/samples/FigureSamples/active/active.cde +104 -0
  163. data/samples/FigureSamples/active/active.cdl +20 -0
  164. data/samples/FigureSamples/active/active.pdf +0 -0
  165. data/samples/FigureSamples/active/active.png +0 -0
  166. data/samples/FigureSamples/active/gen/tmp_C_src.c +36 -0
  167. data/samples/FigureSamples/active/gen/tmp_cygwin_tecs.h +1908 -0
  168. data/samples/FigureSamples/active/gen/tmp_plugin_post_code.cdl +0 -0
  169. data/samples/FigureSamples/allocator/allocator-internal.png +0 -0
  170. data/samples/FigureSamples/allocator/allocator.cde +171 -0
  171. data/samples/FigureSamples/allocator/allocator.cdl +58 -0
  172. data/samples/FigureSamples/allocator/allocator.png +0 -0
  173. data/samples/FigureSamples/basic/Makefile +87 -0
  174. data/samples/FigureSamples/basic/SimpleSample-trace.cdl +50 -0
  175. data/samples/FigureSamples/basic/SimpleSample.cde +91 -0
  176. data/samples/FigureSamples/basic/SimpleSample.cdl +47 -0
  177. data/samples/FigureSamples/basic/basic.cde +93 -0
  178. data/samples/FigureSamples/basic/basic.cdl +46 -0
  179. data/samples/FigureSamples/basic/basic.png +0 -0
  180. data/samples/FigureSamples/callback/callback.cde +130 -0
  181. data/samples/FigureSamples/callback/callback.cdl +29 -0
  182. data/samples/FigureSamples/callback/callback.png +0 -0
  183. data/samples/FigureSamples/carray/carray.cde +144 -0
  184. data/samples/FigureSamples/carray/carray.cdl +38 -0
  185. data/samples/FigureSamples/carray/carray.png +0 -0
  186. data/samples/FigureSamples/cearray/cearray.cde +314 -0
  187. data/samples/FigureSamples/cearray/cearray.cdl +60 -0
  188. data/samples/FigureSamples/cearray/cearray.png +0 -0
  189. data/samples/FigureSamples/composite/composite-internal.png +0 -0
  190. data/samples/FigureSamples/composite/composite.cde +216 -0
  191. data/samples/FigureSamples/composite/composite.cdl +95 -0
  192. data/samples/FigureSamples/composite/composite.png +0 -0
  193. data/samples/FigureSamples/earray/earray.cde +142 -0
  194. data/samples/FigureSamples/earray/earray.cdl +38 -0
  195. data/samples/FigureSamples/earray/earray.png +0 -0
  196. data/samples/FigureSamples/join/Makefile +87 -0
  197. data/samples/FigureSamples/join/join.cde +132 -0
  198. data/samples/FigureSamples/join/join.cdl +40 -0
  199. data/samples/FigureSamples/join/join.png +0 -0
  200. data/samples/FigureSamples/relay/Makefile +99 -0
  201. data/samples/FigureSamples/relay/relay-internal.png +0 -0
  202. data/samples/FigureSamples/relay/relay.cde +284 -0
  203. data/samples/FigureSamples/relay/relay.cdl +52 -0
  204. data/samples/FigureSamples/relay/relay.png +0 -0
  205. data/samples/FigureSamples/rpc/Makefile +123 -0
  206. data/samples/FigureSamples/rpc/rpc-expand.png +0 -0
  207. data/samples/FigureSamples/rpc/rpc.cde +245 -0
  208. data/samples/FigureSamples/rpc/rpc.png +0 -0
  209. data/samples/FigureSamples/rpc/rpc_sample.cdl +53 -0
  210. data/samples/SimpleSample/Makefile +25 -0
  211. data/samples/SimpleSample/SimpleSample/Makefile +86 -0
  212. data/samples/SimpleSample/SimpleSample/Makefile-trace +91 -0
  213. data/samples/SimpleSample/SimpleSample/README.txt +106 -0
  214. data/samples/SimpleSample/SimpleSample/SimpleSample-trace.cdl +50 -0
  215. data/samples/SimpleSample/SimpleSample/SimpleSample.cdl +45 -0
  216. data/samples/SimpleSample/SimpleSample/src/tSample.c +77 -0
  217. data/samples/SimpleSample/SimpleSample/src/tSimple.c +48 -0
  218. data/samples/SimpleSample/SimpleSample/src/tecs-types.h +27 -0
  219. data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile +51 -0
  220. data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile-trace +91 -0
  221. data/samples/SimpleSample/SimpleSampleOpaqueRPC/README.txt +106 -0
  222. data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample-trace.cdl +80 -0
  223. data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample.cdl +77 -0
  224. data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSample/Makefile +112 -0
  225. data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSimple/Makefile +109 -0
  226. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSample.c +80 -0
  227. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSimple.c +47 -0
  228. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tTaskMain.c +66 -0
  229. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tecs-types.h +27 -0
  230. data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile +125 -0
  231. data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile-trace +130 -0
  232. data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample-trace.cdl +54 -0
  233. data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample.cdl +53 -0
  234. data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSample.c +80 -0
  235. data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSimple.c +54 -0
  236. data/tecscde.gemspec +41 -0
  237. metadata +353 -0
@@ -0,0 +1,306 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2014 by TOPPERS Project
6
+ #--
7
+ # 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
8
+ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9
+ # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10
+ # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11
+ # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
12
+ # スコード中に含まれていること.
13
+ # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14
+ # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15
+ # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
16
+ # の無保証規定を掲載すること.
17
+ # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18
+ # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
19
+ # と.
20
+ # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21
+ # 作権表示,この利用条件および下記の無保証規定を掲載すること.
22
+ # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
23
+ # 報告すること.
24
+ # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25
+ # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26
+ # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27
+ # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
28
+ # 免責すること.
29
+ #
30
+ # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31
+ # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32
+ # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33
+ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
34
+ # の責任を負わない.
35
+ #
36
+ # $Id: tecs_lang.rb 2061 2014-05-31 22:15:33Z okuma-top $
37
+ #++
38
+
39
+ #== 言語に関する変数を設定
40
+ # メッセージファイルの読み込みも行う (読み込みに失敗した場合、デフォルトの文字コードに変更する)
41
+ class TECS_LANG
42
+ # ハッシュのタグは case insensitive のため、大文字の文字列とする
43
+ CHARSET_ALIAS = {
44
+ "UJIS" => :eucJP,
45
+ "UTF-8" => :utf8,
46
+ "EUCJP" => :eucJP, # 以下 case insensitive にするため
47
+ "SJIS" => :sjis,
48
+ "UTF8" => :utf8,
49
+ "ISO8859-1" => :"iso8859-1"
50
+ }
51
+ LANG_ALIAS = {
52
+ "C" => :en_US,
53
+ "EN_US" => :en_US, # 以下 case insensitive にするため
54
+ "JA_JP" => :ja_JP
55
+ }
56
+ SUITABLE_CHARSET = {
57
+ :ja_JP => [:eucJP, :sjis, :utf8],
58
+ :en_US => [:"iso8859-1", :utf8, nil]
59
+ }
60
+
61
+ #=== LANG のパース
62
+ # lang::String "ja_JP.eucJP@cjknarrow", "C" など
63
+ # RETURN:: [ :ja_JP, :eucJP, :cjknarrow ]
64
+ def self.parse_lang(lang)
65
+ lang =~ /([^\.@]*)(\.([^@]*))?(@(.*))?/
66
+
67
+ lang_terri = $1.to_sym if !$1.nil? && $1 != ""
68
+ # set_kcode_binary により、C.UTF-8 のみを特別扱いする必要がなくなった
69
+ # if lang_terri == :C then # LANG=C.* は、すべて 1 byte 文字コードとして扱う
70
+ # codeset = nil
71
+ # modifier = nil
72
+ # else
73
+ codeset = $3.to_sym if !$3.nil? && $3 != ""
74
+ modifier = $5.to_sym if !$5.nil? && $5 != ""
75
+ # end
76
+ [lang_terri, codeset, modifier]
77
+ end
78
+
79
+ #=== lang, charset の別明解決および妥当性のチェック
80
+ # lang::Symbol : :en_US, :ja_JP など
81
+ # charset::Symbol : :eucJP, :utf8 など
82
+ # RETURN:
83
+ # [ lang, charset, result ]::  result = false の場合 lang, charset は不適切
84
+ def self.resolve_alias_and_check(lang, charset)
85
+ if LANG_ALIAS[lang.to_s.upcase]
86
+ ln = LANG_ALIAS[lang.to_s.upcase]
87
+ else
88
+ ln = lang
89
+ end
90
+
91
+ if CHARSET_ALIAS[charset.to_s.upcase]
92
+ cs = CHARSET_ALIAS[charset.to_s.upcase]
93
+ else
94
+ cs = charset
95
+ end
96
+
97
+ if SUITABLE_CHARSET[ln].nil? || SUITABLE_CHARSET[ln].index(cs).nil?
98
+ res = false
99
+ else
100
+ res = true
101
+ end
102
+
103
+ # p ln, cs, res
104
+ [ln, cs, res]
105
+ end
106
+
107
+ #=== codepage を取り出す
108
+ # codepage は3〜5桁の整数として仮定
109
+ def self.get_win_codepage
110
+ cmd_pipe = IO.popen("cmd /c chcp", "r")
111
+ cmd_pipe.read =~ /([0-9]{3,5})/
112
+ cp = $1
113
+ cmd_pipe.close
114
+ return cp
115
+ end
116
+
117
+ #=== codepage から LANG の設定文字列に変換
118
+ def self.codepage_to_lang(cp)
119
+ if cp == "932"
120
+ "ja_JP.sjis"
121
+ else
122
+ "en_US"
123
+ end
124
+ end
125
+
126
+ #=== 言語、文字コードに関する変数を設定
127
+ # 以下の順にチェックされ、一番最後に設定された値が採用される
128
+ # ・デフォルト
129
+ # ・codepage (exerb 版で TERM 未設定または TERM=cygwin の場合のみ)
130
+ # ・LANG 環境変数
131
+ # ・TECSGEN_LANG 環境変数
132
+ # ・TECSGEN_FILE_LANG 環境変数 (ファイルの文字コードのみ)
133
+ # ・-k オプション (ファイルの文字コードのみ)
134
+ def self.set_lang_var
135
+ if ENV["LANG"]
136
+ # 非 exerb 版では LANG 環境変数を見る
137
+ # cygwin console では codepage に従って出力した方が平和なため
138
+
139
+ $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["LANG"])
140
+ $LANG_CONSOLE = $LANG_FILE
141
+ $CHARSET_CONSOLE = $CHARSET_FILE
142
+ end
143
+
144
+ if ENV["TECSGEN_LANG"]
145
+ $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["TECSGEN_LANG"])
146
+ $LANG_CONSOLE = $LANG_FILE
147
+ $CHARSET_CONSOLE = $CHARSET_FILE
148
+ end
149
+
150
+ if ENV["TECSGEN_FILE_LANG"]
151
+ $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["TECSGEN_FILE_LANG"])
152
+ end
153
+
154
+ self.set_lang_by_option
155
+ end
156
+
157
+ #=== -k オプションからファイル用の言語、文字コード変数を設定
158
+ def self.set_lang_by_option
159
+ if $kcode.nil?
160
+ return
161
+ end
162
+
163
+ code = $kcode
164
+ found = false
165
+ res = $CODE_TYPE_ARRAY.index(code)
166
+ if res.nil?
167
+ print "-k: illegal kcode type #{code}. (#{$CODE_TYPE_ARRAY.join(", ")})\n"
168
+ exit 1
169
+ end
170
+
171
+ case $kcode
172
+ when "euc"
173
+ $CHARSET_FILE = :eucJP
174
+ $LANG_FILE = :ja_JP
175
+ when "sjis"
176
+ $CHARSET_FILE = :sjis
177
+ $LANG_FILE = :ja_JP
178
+ when "utf8"
179
+ $CHARSET_FILE = :utf8
180
+ $LANG_FILE = :ja_JP
181
+ when "none"
182
+ $CHARSET_FILE = nil
183
+ $LANG_FILE = "en_US"
184
+ end
185
+ end
186
+
187
+ # 言語情報から Encoding に関する変数を設定
188
+ def self.set_encoding_var
189
+ # 文字コードの設定
190
+ case $CHARSET_FILE # string: "EUC" | "SJIS" | "NONE" | "UTF8"
191
+ when :eucJP
192
+ $ENCODING_CDL = Encoding::EUC_JP
193
+ $Ruby19_File_Encode = "ASCII-8BIT"
194
+ when :sjis
195
+ $ENCODING_CDL = Encoding::Shift_JIS
196
+ $Ruby19_File_Encode = "Shift_JIS"
197
+ when :utf8
198
+ $ENCODING_CDL = Encoding::UTF_8
199
+ $Ruby19_File_Encode = "ASCII-8BIT"
200
+ else
201
+ $ENCODING_CDL = Encoding::BINARY
202
+ $Ruby19_File_Encode = "ASCII-8BIT"
203
+ end
204
+
205
+ case $CHARSET_CONSOLE
206
+ when :eucJP
207
+ $ENCODING_CONSOLE = Encoding::EUC_JP
208
+ when :sjis
209
+ $ENCODING_CONSOLE = Encoding::Shift_JIS
210
+ when :utf8
211
+ $ENCODING_CONSOLE = Encoding::UTF_8
212
+ else
213
+ $ENCODING_CONSOLE = Encoding::BINARY
214
+ end
215
+
216
+ $ENCODING_TECSGEN = Encoding::UTF_8 # const:
217
+ end
218
+
219
+ #####
220
+ # $LANG_FILE 言語 (C は en_US に変換される)
221
+ # $LANG_CONSOLE 言語 (C は en_US に変換される)
222
+ # $CHARSET_FILE ファイルの文字コード
223
+ # $CHARSET_CONSOLE コンソール文字コード
224
+
225
+ # デフォルトの設定(正規化済みのこと)
226
+ $LANG_FILE_DEFAULT = :en_US
227
+ $CHARSET_FILE_DEFAULT = nil
228
+ $LANG_CONSOLE_DEFAULT = :en_US
229
+ $CHARSET_CONSOLE_DEFAULT = nil
230
+
231
+ $LANG_FILE = $LANG_FILE_DEFAULT
232
+ $CHARSET_FILE = $CHARSET_FILE_DEFAULT
233
+ $LANG_CONSOLE = $LANG_CONSOLE_DEFAULT
234
+ $CHARSET_CONSOLE = $CHARSET_CONSOLE_DEFAULT
235
+
236
+ # -k で指定可能なコード
237
+ $CODE_TYPE_ARRAY = ["euc", "sjis", "none", "utf8"]
238
+
239
+ # 言語を決定する
240
+ self.set_lang_var
241
+
242
+ # 言語、コードのチェックと正規化
243
+ lang_file, charset_file, res =
244
+ self.resolve_alias_and_check($LANG_FILE, $CHARSET_FILE)
245
+ if res == false
246
+ # lang_file, charset_file = lang_file_default, charset_file_default
247
+ lang_file, charset_file = $LANG_FILE_DEFAULT, $CHARSET_FILE_DEFAULT
248
+ end
249
+ lang_console, charset_console, res =
250
+ self.resolve_alias_and_check($LANG_CONSOLE, $CHARSET_CONSOLE)
251
+ if res == false
252
+ # lang_console, charset_console = lang_console_default, charset_console_default
253
+ lang_console, charset_console = $LANG_CONSOLE_DEFAULT, $CHARSET_CONSOLE_DEFAULT
254
+ end
255
+
256
+ # メッセージモジュールをロード
257
+ if require("tecsgen/messages/messages_console_#{lang_console}")
258
+ $LANG_CONSOLE, $CHARSET_CONSOLE = lang_console, charset_console
259
+ else
260
+ require("tecsgen/messages/messages_console_#{$LANG_CONSOLE_DEFAULT}")
261
+ $LANG_CONSOLE, $CHARSET_CONSOLE = $LANG_CONSOLE_DEFAULT, $CHARSET_CONSOLE_DEFAULT
262
+ end
263
+ if require("tecsgen/messages/messages_file_#{lang_file}")
264
+ $LANG_FILE, $CHARSET_FILE = lang_file, charset_file
265
+ else
266
+ require("tecslib/messages/messages_file_#{$LANG_FILE_DEFAULT}")
267
+ $LANG_FILE, $CHARSET_FILE = $LANG_FILE_DEFAULT, $CHARSET_FILE_DEFAULT
268
+ end
269
+
270
+ self.set_encoding_var
271
+
272
+ dbgPrint "LANG_FILE=#{$LANG_FILE}.#{$CHARSET_FILE}, LANG_CONSOLE=#{$LANG_CONSOLE}.#{$CHARSET_CONSOLE}\n"
273
+ dbgPrint "ENCODING_CDL=#{$ENCODING_CDL} ENCODING_CONSOLE=#{$ENCODING_CONSOLE}\n"
274
+ dbgPrint "Ruby19_File_Encode=#{$Ruby19_File_Encode}\n"
275
+
276
+ #=== 単体テスト実行
277
+ if $unit_test
278
+ print "unit test: set_lang_var\n"
279
+ self.set_lang_var
280
+ print "#{$LANG_FILE} #{$LANG_CONSOLE}\n"
281
+ print "#{$CHARSET_FILE} #{$CHARSET_CONSOLE}\n"
282
+
283
+ $LANG_FILE, $CHARSET_FILE, res = self.resolve_alias_and_check($LANG_FILE, $CHARSET_FILE)
284
+ print "#{$LANG_FILE} #{$CHARSET_FILE}, #{res}\n"
285
+ end
286
+ end
287
+
288
+ #= Console クラス
289
+ # 文字コードを変換する
290
+ class Console
291
+ def self.print(str)
292
+ if $ENCODING_CONSOLE == Encoding::BINARY
293
+ STDOUT.print(str)
294
+ else
295
+ STDOUT.print(str.encode($ENCODING_CONSOLE))
296
+ end
297
+ end
298
+
299
+ def self.puts(str)
300
+ if $ENCODING_CONSOLE == Encoding::BINARY
301
+ STDOUT.puts(str)
302
+ else
303
+ STDOUT.puts(str.encode($ENCODING_CONSOLE))
304
+ end
305
+ end
306
+ end
@@ -0,0 +1,453 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2017 by TOPPERS Project
6
+ #--
7
+ # 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
8
+ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9
+ # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10
+ # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11
+ # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
12
+ # スコード中に含まれていること.
13
+ # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14
+ # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15
+ # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
16
+ # の無保証規定を掲載すること.
17
+ # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18
+ # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
19
+ # と.
20
+ # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21
+ # 作権表示,この利用条件および下記の無保証規定を掲載すること.
22
+ # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
23
+ # 報告すること.
24
+ # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25
+ # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26
+ # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27
+ # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
28
+ # 免責すること.
29
+ #
30
+ # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31
+ # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32
+ # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33
+ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
34
+ # の責任を負わない.
35
+ #
36
+ # $Id: tecsgen.rb 2665 2017-07-24 08:59:28Z okuma-top $
37
+ #++
38
+
39
+
40
+ class TECSGEN
41
+ @@b_post_coded = false # ポストコード生成開始後 true
42
+
43
+ #=== import パス (-I) を末尾に追加
44
+ # 既に登録済みであれば、追加しない
45
+ def self.add_import_path(path)
46
+ if $import_path.index(path).nil?
47
+ dbgPrint "add_import_path: '#{path}'\n"
48
+ $import_path << path
49
+ end
50
+ end
51
+
52
+ #=== $(TECSPATH) への置換
53
+ # path::String : ENV[ 'TECSPATH' ] に一致する部分があれば、 "$(TECSPATH)" に置換
54
+ # b_global::Bool : true なら gsub で置換。false なら sub で置換
55
+ def self.subst_tecspath(path, b_global = false)
56
+ tp = $tecspath.dup
57
+ tp.gsub!(/\\/, "\\\\\\\\")
58
+ pattern = /#{tp}/
59
+ substr = "$(TECSPATH)"
60
+ if b_global
61
+ str = path.gsub(pattern, substr)
62
+ else
63
+ str = path.sub(pattern, substr)
64
+ end
65
+ dbgPrint "subst_tecspath #{path}, #{str}\n"
66
+ return str
67
+ end
68
+
69
+ #=== path は絶対パスか?
70
+ # path:: String :
71
+ # '/' または '$' で始まる場合、絶対パスと判定する
72
+ def self.is_absolute_path?(path)
73
+ pa = path[0..0]
74
+ pa2 = path[0..1]
75
+ if pa == "/" || pa == "$" || pa2 =~ /[A-Za-z]:/
76
+ res = true
77
+ else
78
+ res = false
79
+ end
80
+ dbgPrint "is_absolute( #{path} ) = #{res} #{path[0]}\n"
81
+ return res
82
+ end
83
+
84
+ #=== tecsgen のデフォルトを設定
85
+ def self.set_default_config
86
+ Makefile.set_default_config
87
+ end
88
+
89
+ ###
90
+ #== Makefile.templ の出力内容を追加、変更するための操作
91
+ module Makefile
92
+ # 固定されている変数(add_var で変更できない)
93
+ @@fixed_vars = { :INCLUDES => nil, :DEFINES => nil, :TARGET_BASE => nil, :BASE_DIR => nil }
94
+ @@config_mode = false
95
+
96
+ @@vars = { }
97
+ @@vars_default = { }
98
+ @@var_comments = { }
99
+
100
+ @@objs = []
101
+ @@ldflags = ""
102
+ @@search_path = []
103
+ @@pre_tecsgen_target = []
104
+ @@post_tecsgen_target = []
105
+ @@lines = []
106
+
107
+ #=== OTHER_OBJS に追加する
108
+ def self.add_obj(obj)
109
+ @@objs << obj
110
+ end
111
+
112
+ #=== 追加する変数
113
+ # プラグインからは、デフォルト値を変更できる
114
+ # config により
115
+ def self.add_var(var, val, comment = nil)
116
+ if @@fixed_vars[var]
117
+ raise "fixed var '#{var}' cannot be changed"
118
+ end
119
+ if @@config_mode
120
+ @@vars_default[var.to_sym] = val
121
+ @@var_comments_default[var.to_sym] = comment
122
+ else
123
+ @@vars[var.to_sym] = val
124
+ @@var_comments[var.to_sym] = comment
125
+ end
126
+ end
127
+
128
+ #=== LDFLAGS に追加する
129
+ def self.add_ldflag(ldflag)
130
+ @@ldflags += " " + ldflag
131
+ end
132
+
133
+ #=== サーチパスを追加する
134
+ # CFLAGS, vpath に追加する
135
+ def self.add_search_path(path)
136
+ @@search_path << path
137
+ end
138
+
139
+ #=== PRE_TECSGEN_TARGET に追加する
140
+ # PRE_TECSGEN_TARGET に target を追加する
141
+ def self.add_pre_tecsgen_target(target)
142
+ @@pre_tecsgen_target << pre_tecsgen_target
143
+ end
144
+
145
+ #=== POST_TECSGEN_TARGET に追加する
146
+ # POST_TECSGEN_TARGET に target を追加する
147
+ def self.add_post_tecsgen_target(target)
148
+ @@post_tecsgen_target << pre_tecsgen_target
149
+ end
150
+
151
+ #=== 追加する変数
152
+ def self.add_line(line)
153
+ @@lines << line.to_s + "\n"
154
+ end
155
+
156
+ def self.get_objs # Array を返す
157
+ return @@objs.uniq
158
+ end
159
+
160
+ def self.get_vars # Array を返す
161
+ if RUBY_VERSION >= "1.9"
162
+ return (@@vars.keys + @@vars_default.keys).sort.uniq
163
+ else
164
+ # V1.8 では、Symbol の sort ができないので、一旦 String に置換する
165
+ return (@@vars.keys + @@vars_default.keys).map{|s| s.to_s }.sort.uniq.map!{|s| s.to_sym }
166
+ end
167
+ end
168
+
169
+ def self.get_var_val(var)
170
+ return @@vars[var] ? @@vars[var] : @@vars_default[var]
171
+ end
172
+
173
+ def self.get_var_comment(var)
174
+ return @@var_comments[var]
175
+ end
176
+
177
+ def self.get_ldflags # String を返す
178
+ return @@ldflags
179
+ end
180
+
181
+ def self.get_search_path # Array を返す
182
+ return @@search_path.uniq
183
+ end
184
+
185
+ def self.get_pre_tecsgen_target # Array を返す
186
+ return @@pre_tecsgen_target.uniq
187
+ end
188
+
189
+ def self.get_post_tecsgen_target # Array を返す
190
+ return @@post_tecsgen_target.uniq
191
+ end
192
+
193
+ def self.get_lines # 付加する行を得る
194
+ return @@lines.uniq
195
+ end
196
+
197
+ #=== TECSGEN のデフォルト設定を行う
198
+ # Makefile
199
+ # @@fixed_vars で定義されている変数は、変更できず、定数定義されている
200
+ def self.set_default_config
201
+ add_var("TARGET", "$(TARGET_BASE).exe", "default target name")
202
+ add_var("TECSGEN", "tecsgen", "default TECS generator")
203
+ add_var("TIMESTAMP", "$(GEN_DIR)/tecsgen.timestamp", "Time Stamp")
204
+ add_var("CC", "gcc", "default C Compiler")
205
+ add_var("CFLAGS", '$(INCLUDES) $(DEFINES) -D "Inline=static inline"', "default C Compiler options")
206
+ add_var("LD", "gcc", "default Liknker")
207
+ add_var("LDFLAGS", @@ldflags, "default Liknker Options")
208
+ add_var("SRC_DIR", "$(BASE_DIR)/src", "default source directory")
209
+ add_var("_TECS_OBJ_DIR", "$(GEN_DIR)/", "default relocatable object (.o) directory")
210
+ end
211
+ end
212
+
213
+ def self.get_argv
214
+ ARGV
215
+ end
216
+
217
+ #------ TECSGEN CDL analyze and generate ------#
218
+
219
+ def syntax_analisys(argv)
220
+ # ルート namespace (region) を生成
221
+ @root_namespace = Region.new("::")
222
+
223
+ #### 構文解析 (post コードを除く) ####
224
+ # すべての cdl を import する
225
+ argv.each{|f|
226
+ dbgPrint("## Import: #{f}\n")
227
+ TECSGEN.add_import_path(File.expand_path(File.dirname(f)))
228
+ Import.new(f, false, false)
229
+ }
230
+
231
+ # すべての構文解釈が完了したことの報告
232
+ # 実際には、後からプラグインの生成する CDL のパースが行われる
233
+ # エラー行数の決定方法の変更のために行う
234
+ Generator.end_all_parse
235
+ dbgPrint("## End all parse (except Post Code)\n")
236
+ end # syntax_analisys
237
+
238
+ #=== TECSGEN#semantics_analisys_1
239
+ # semantics check. only cells here
240
+ # other objects (signature, celltype, typedef, etc ) are checked while syntax analisys
241
+ def semantics_analisys_1
242
+ #### 意味解析1 (post コードを除く) ####
243
+ dbgPrint("## Creating reverse join \n")
244
+ Cell.create_reverse_join
245
+
246
+ DescriptorType.check_signature
247
+ Signature.set_descriptor_list
248
+ Celltype.check_dynamic_join
249
+
250
+ # 0 set_definition_join は2回呼び出される(1回目)
251
+ dbgPrint("## Checking all join\n")
252
+ @root_namespace.set_definition_join
253
+ # @root_namespace.set_require_join ### いったん見合わせ。重複エラーを見逃す
254
+ # through プラグインで生成されたセルにも require も生成できる (set_definition_join の後ろで実施)
255
+
256
+ #### post コードの生成と構文解析 ####
257
+ @@b_post_coded = true # ポストコード生成開始後 true
258
+ # 引数がなければ、プラグインのポストコードを出力しない
259
+ if ARGV.length > 0
260
+ dbgPrint("## Generating Post Code\n")
261
+ # プラグインのポストコードの出力と import
262
+ tmp_file_name = "#{$gen}/tmp_plugin_post_code.cdl"
263
+ file = nil
264
+ begin
265
+ file = CFile.open(tmp_file_name, "w")
266
+ rescue
267
+ Generator.error("G9999 fail to create #{tmp_file_name}")
268
+ end
269
+
270
+ if file
271
+ # through プラグインのポストコード生成
272
+ PluginModule.gen_plugin_post_code file
273
+
274
+ begin
275
+ file.close
276
+ rescue
277
+ Generator.error("G9999 fail to close #{tmp_file_name}")
278
+ end
279
+ dbgPrint("## Import Post Code\n")
280
+ Import.new(tmp_file_name.to_s)
281
+ end
282
+ end
283
+
284
+ #### 意味解析1 (post コード) ####
285
+ dbgPrint("## Creating reverse join (for post code) \n")
286
+ Cell.create_reverse_join
287
+
288
+ # Join の定義の設定とチェック
289
+ # 0 # 前方参照対応
290
+ # 0 set_definition_join は2回呼び出される(2回目) post_code で生成された
291
+ dbgPrint("## Checking all join (for cells generated by Post Code\n")
292
+ @root_namespace.set_definition_join
293
+ @root_namespace.set_max_entry_port_inner_cell
294
+
295
+ dbgPrint("## Set require join\n")
296
+ @root_namespace.set_require_join # mikan post の前にも
297
+ # ポストコードで生成されたセルの require のjoin を生成
298
+ # mikan require で through が適用されて、ポストコードが必要となっても出力されない
299
+ end # semantics_analisys_1
300
+
301
+ def semantics_analisys_2
302
+ #### 意味解析2 ####
303
+ Cell.make_cell_list2
304
+ dbgPrint("## Set fixed join\n")
305
+ Cell.create_reverse_require_join
306
+ # create_reverse_require_join は set_detinition_join に埋め込むことができない
307
+ # namespace に依存しない出現順で行う
308
+ # mikan through プラグインが適用されポストコードに影響を与える場合が考慮できていない
309
+ # mikan post code に影響のあるものであれば、早くに reverse_require_join の結合が必要
310
+ dbgPrint("## Setting port reference count\n")
311
+ @root_namespace.set_port_reference_count
312
+
313
+ dbgPrint("## Checking all join\n")
314
+ @root_namespace.check_join
315
+
316
+ # mikan プラグインで生成されたコンポーネントの set_def_and_check_join
317
+
318
+ dbgPrint("## Checking referenced but undefined cell\n")
319
+ @root_namespace.check_ref_but_undef
320
+ end # semantics_analisys_2
321
+
322
+ def optimize_and_generate
323
+ #### Region link root ごとにオプティマイズおよび生成 ####
324
+ Region.get_link_roots.each {|region|
325
+
326
+ n_cells = region.get_n_cells
327
+
328
+ dbgPrint "#{region.get_name} has #{n_cells} cells\n"
329
+ if $verbose
330
+ print "=====================================\n"
331
+ print "=== Region.path_str: #{region.get_namespace_path.get_path_str}\n"
332
+ print "=====================================\n"
333
+ else
334
+ dbgPrint "Region.path_str: #{region.get_namespace_path.get_path_str}\n"
335
+ end
336
+
337
+ if $region_list.length > 0
338
+ if $region_list[region.get_namespace_path.get_path_str]
339
+ $region_list[region.get_namespace_path.get_path_str] = false
340
+ else
341
+ next
342
+ end
343
+ end
344
+
345
+ # セルが一つもなければ生成しない
346
+ # セルの生成がない場合
347
+ if region.get_n_cells == 0
348
+ if $region_list.length > 0
349
+ Generator.warning("W9999 $1: specified to generate but has no cell", region.get_name)
350
+ end
351
+ if region != @root_namespace
352
+ next
353
+ end
354
+ end
355
+
356
+ $generating_region = region
357
+ if Region.get_link_roots.length > 1
358
+ if region.get_name == "::"
359
+ $gen = $gen_base
360
+ else
361
+ $gen = $gen_base + "/" + region.get_global_name.to_s
362
+ begin
363
+ if !File.directory?($gen)
364
+ Dir.mkdir($gen)
365
+ end
366
+ rescue
367
+ print("Cannot mkdir #{$gen}\n")
368
+ exit 1
369
+ end
370
+ end
371
+ else
372
+ $gen = $gen_base
373
+ end
374
+
375
+ dbgPrint("## Unset optimize variables\n")
376
+ @root_namespace.reset_optimize # 最適化をリセットする
377
+
378
+ if Generator.get_n_error == 0
379
+ # エラーが発生していたら、設定しない
380
+ dbgPrint("## Set cell id\n")
381
+ @root_namespace.set_cell_id_and_domain # セルの ID とドメイン情報を設定(linkunit 毎に0からつける)
382
+
383
+ # エラーが発生していたら、最適化は実施しない
384
+ if !$unopt
385
+ dbgPrint("## Optimizing: Link Region=#{@root_namespace.get_name}\n")
386
+ @root_namespace.optimize
387
+ end
388
+ end
389
+
390
+ if $show_tree
391
+ # エラーが発生していても表示(エラー発生時は最適化されていないので注意)
392
+ print "##### show_tree LinkRegion=#{region.get_name} #####\n"
393
+ @root_namespace.show_tree(0)
394
+ print "##### END LinkRegion=#{region.get_name} #####\n\n"
395
+ end
396
+
397
+ # 構文解釈、意味解析でエラー発生していたら、コード生成をしない
398
+ if Generator.get_n_error != 0
399
+ print_report
400
+ exit 1
401
+ end
402
+
403
+ #### コード生成 ####
404
+ begin
405
+ dbgPrint("## Generating: Link Region=#{@root_namespace.get_name}\n")
406
+ @root_namespace.generate
407
+ dbgPrint("## Generating Post: Link Region=#{@root_namespace.get_name}\n")
408
+ @root_namespace.generate_post
409
+ rescue
410
+ # 通常ここへは来ない (generate, generate_post で処置される)
411
+ Generator.error("G9999 fail to generate")
412
+ end
413
+ }
414
+ end # optimize_and_generate
415
+
416
+ def finalize
417
+ dbgPrint("## Generating XML\n")
418
+ # Region.gen_xml @root_namespace
419
+ ##
420
+ # Namespace.gen_XML @root_namespace
421
+
422
+ $region_list.each{|region_path_str, val|
423
+ if val == true
424
+ Generator.warning("W9999 $1: not link root, -G ignored", region_path_str)
425
+ end
426
+ }
427
+
428
+ # update する
429
+ # APPFile で生成されたファイルは、もし変化があれば、ここで更新する
430
+ # コード生成段階でエラーが発生すれば、更新しない
431
+ # CFile で生成されたものは、更新されている
432
+ if Generator.get_n_error == 0
433
+ begin
434
+ AppFile.update
435
+ rescue => evar
436
+ Generator.error("G9999 Fail to update. (error occurred while renaming generated files)")
437
+ print_exception(evar)
438
+ end
439
+ end
440
+
441
+ print_report
442
+ if Generator.get_n_error != 0
443
+ STDERR.print "error occurred while generating. some file can be corrupt in #{$gen_base}\n"
444
+ exit 1
445
+ end
446
+
447
+ open("#{$gen_base}/tecsgen.timestamp", "w"){|io| }
448
+ end # finalize
449
+
450
+ def self.post_coded?
451
+ @@b_post_coded
452
+ end
453
+ end # class TECSGEN