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,226 @@
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: ctypes.rb 2665 2017-07-24 08:59:28Z okuma-top $
37
+ #++
38
+
39
+ # CType は C_parser で定義される型を扱う CIntType, CFloatType などに include するもの
40
+ # CIntType は IntType を継承するなど、C の型では TECS の型を継承する
41
+ module CType
42
+
43
+ #=== 構文要素 type_specifier が複数指定されている場合に merge する
44
+ # merge は const(CIntType) unsigned(CIntTtype), long(CIntType), などと他の型をマージする
45
+ # const, unsigned, long などは、単体で int (CIntType) 型になりうる
46
+ #
47
+ # mikan C の文法を厳密にはチェックしていない long struct 等もできてしまう
48
+ def merge(another)
49
+ # p "self: #{self.class} kind_of( IntType ): #{self.kind_of?( IntType )} another: #{another.class}"
50
+
51
+ # signed, unsigned が Symbol として来る事は無くなった
52
+ # if another.instance_of? Symbol then
53
+ # # ここで Symbol は :SIGNED, :UNSIGNED のいずれか
54
+ #
55
+ # # CIntType か?
56
+ # if self.instance_of? CIntType then
57
+ # self.set_sign another
58
+ # return self
59
+ # else
60
+ # cdl_error( "C1001 $1: mismatch, suitable for int types" , another )
61
+ # return self
62
+ # end
63
+ # elsif self.instance_of?( CIntType ) && another.instance_of?( CIntType )then
64
+ if self.instance_of?(CIntType) && another.instance_of?(CIntType)
65
+ if another.get_bit_size != -3
66
+ if @bit_size == -4 && another.get_bit_size == -4
67
+ @bit_size = -5 # long long
68
+ else
69
+ # self は int 型、another の bit_size が (int 以外であれば)そちらにする
70
+ # mikan 上記以外で 両方 -3 でなければ、本来エラー
71
+ @bit_size = another.get_bit_size
72
+ end
73
+ end
74
+
75
+ if another.get_sign
76
+ # another で sign が指定されていれば、そちらのものを採用する mikan 矛盾のチェック
77
+ @sign = another.get_sign
78
+ end
79
+
80
+ # if another.get_qualifier then
81
+ # # another で qualifier が指定されていれば、そちらのものを採用する mikan 矛盾のチェック
82
+ # @qualifier = another.get_qualifier
83
+ # end
84
+ if another.is_const?
85
+ @b_const = true
86
+ end
87
+ if another.is_volatile?
88
+ @b_volatile = true
89
+ end
90
+
91
+ return self
92
+ elsif self.instance_of?(CIntType)
93
+ return another.merge self
94
+ elsif self.instance_of?(CDefinedType)
95
+ # mikan unsigned などとの merge の不正検出
96
+ if another.is_const?
97
+ @b_const = true
98
+ end
99
+ if another.is_volatile?
100
+ @b_volatile = true
101
+ end
102
+
103
+ # if self.get_type.get_type_str == another.get_type_str &&
104
+ # self.get_type.get_type_str_post == another.get_type_str_post
105
+ # # p "typedef #{another.get_type_str} #{self.get_type_str}#{another.get_type_str_post} ;"
106
+ # else
107
+ # cdl_error( "C1002 $1 not compatible with previous one $2" , self.get_type_str, another.get_type_str )
108
+ # end
109
+ return self
110
+ elsif self.instance_of?(CStructType)
111
+ if another.is_const?
112
+ @b_const = true
113
+ end
114
+ if another.is_volatile?
115
+ @b_volatile = true
116
+ end
117
+ return self
118
+ elsif self.instance_of?(CFloatType)
119
+ # mikan long double
120
+ # TECS には long double を表現する手段がない (double80_t を定義すればよいか?)
121
+ # cdl_warning( "C1003 $1 & $2 incompatible (\'long double\' is not supported.). Treated as $3." , self.class, another.class, self.class )
122
+ # cdl_warning( "W9999 $1 & $2 incompatible (\'long double\' is not supported.). Treated as $3." , self.get_type_str, another.get_type_str, self.get_type_str )
123
+ self.to_long
124
+ return self
125
+ else
126
+ raise "merge: unknown type"
127
+ end
128
+ end
129
+
130
+ #=== qualifier を設定する
131
+ # 元の Type クラスでは矛盾チェックしない(TECSの本来の文法では重複指定できないため)
132
+ def set_qualifier(qual)
133
+ if @qualifier
134
+ cdl_error("C1004 $1: qualifier redefined. previous one: $2", qual, @qualifier)
135
+ end
136
+ super(qual)
137
+ end
138
+
139
+ end
140
+
141
+ class CDefinedType < DefinedType
142
+ include CType
143
+
144
+ def initialize(type_name)
145
+ super(type_name)
146
+ end
147
+ end
148
+
149
+ class CVoidType < VoidType
150
+ include CType
151
+ end
152
+
153
+ class CBoolType < BoolType
154
+ include CType
155
+ end
156
+
157
+ class CIntType < IntType
158
+ include CType
159
+
160
+ def initialize(bit_size)
161
+ # p super.class mikan super.class が Symbol だ、なぜ?
162
+ super(bit_size)
163
+ end
164
+
165
+ def set_sign(sign, b_uint = false)
166
+ super(sign, b_uint)
167
+ # p "CInt: set_sign: #{get_type_str} #{sign}"
168
+ end
169
+ end
170
+
171
+ class CFloatType < FloatType
172
+ include CType
173
+
174
+ def initialize(bit_size)
175
+ super
176
+ end
177
+
178
+ def to_long
179
+ if @bit_size != -64
180
+ cdl_warning("W9999 long specified for $1", get_type_str)
181
+ else
182
+ @bit_size = -128 # @bit_size = -128 : long double
183
+ end
184
+ end
185
+ end
186
+
187
+ class CEnumType < EnumType # mikan
188
+ include CType
189
+
190
+ def initialize(bit_size)
191
+ super(bit_size)
192
+ end
193
+ end
194
+
195
+ class CStructType < StructType
196
+ include CType
197
+
198
+
199
+ def initialize(tag = nil)
200
+ super(tag)
201
+ end
202
+ end
203
+
204
+ class CFuncType < FuncType
205
+ include CType
206
+
207
+ def initialize(paramlist = nil)
208
+ super(paramlist)
209
+ end
210
+ end
211
+
212
+ class CArrayType < ArrayType
213
+ include CType
214
+
215
+ def initialize(subscript = nil)
216
+ super(subscript)
217
+ end
218
+ end
219
+
220
+ class CPtrType < PtrType
221
+ include CType
222
+
223
+ def initialize(referto = nil)
224
+ super(referto)
225
+ end
226
+ end
@@ -0,0 +1,1031 @@
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: expression.rb 2633 2017-04-02 06:02:05Z okuma-top $
37
+ #++
38
+
39
+ class Expression < Node
40
+ # @elements # array
41
+
42
+ def initialize(elements, locale = nil)
43
+ super()
44
+ if locale
45
+ @locale = locale
46
+ end
47
+
48
+ @elements = elements
49
+ end
50
+
51
+ def print
52
+ # puts "expr: #{@elements}"
53
+ puts "expr_string: #{self}"
54
+ end
55
+
56
+ #=== Expression# to_s
57
+ # C 言語ソース向きの文字列を生成 (globa_name)
58
+ def to_s
59
+ elements_to_s(@elements)
60
+ end
61
+
62
+ #=== Expression# to_str
63
+ # C 言語ソース向きの文字列を生成 (globa_name)
64
+ def to_str(name_list, pre, post)
65
+ elements_to_s(@elements, name_list, pre, post)
66
+ end
67
+
68
+ #=== Expression#to_CDL_str
69
+ # CDL 表現の文字列を生成
70
+ def to_CDL_str
71
+ return to_s
72
+ end
73
+
74
+ #=== 定数式として評価する(トライしてみる)
75
+ #
76
+ # このメソッドは、定数式を評価する
77
+ # ・attribute, var の初期化子
78
+ # ・size_is, count_is 引数
79
+ # ・配列の添数
80
+ #
81
+ # name_list(NamedList|Nil): 式から参照可能なリスト.
82
+ # NamedList の要素は size_is, count_is の引数評価の場合 ParamDecl (関数仮引数)
83
+ #
84
+ # name_list2(NamedList|Nil) : NamedList の要素は Decl (attribute, var) である.省略時 nil
85
+ #
86
+ # RETURN: 評価した定数.評価できなかった場合は nil を返す
87
+ #
88
+ # 型は get_type で、評価する(定数として求められないときに使用できる)
89
+ # Array を返すのは attr{ int *a = {1, 2, 3}; int *b = a; }; の b の右辺を評価した場合
90
+
91
+ def eval_const(name_list, name_list2 = nil)
92
+ val = elements_eval_const(@elements, name_list, name_list2, 0)
93
+ if val.is_a? IntegerVal
94
+ return val.to_i
95
+ elsif val.is_a? FloatVal
96
+ return val.to_f
97
+ elsif val.is_a? BoolVal
98
+ return val.to_i
99
+ elsif val.is_a? PointerVal
100
+ return val.to_i # mikan エラー V1008 が発生してしまう
101
+ # elsif val.kind_of? EnumVal then
102
+ # enum mikan
103
+ else
104
+ # C_EXP, Array または nil :そのまま返す
105
+ return val
106
+ end
107
+ end
108
+
109
+ #=== 定数式として評価する2(トライしてみる)
110
+ #
111
+ # IntegerVal, FloatVal をそのまま返す(eval_const では Integer, Float に変換)
112
+ def eval_const2(name_list, name_list2 = nil, nest = 0)
113
+ val = elements_eval_const(@elements, name_list, name_list2, nest)
114
+ end
115
+
116
+ #=== 式の型を評価する
117
+ #
118
+ # eval_const で値が得られない場合、型を導出可能であれば型を得る
119
+ # param を含んだ式は定数値を求められないが、型を得ることはできる
120
+ # 未定義変数を含んだ型は、得ることができない (ダミー型定義が返る)
121
+ def get_type(namedList) # 名前空間の NamedList を指定
122
+ elements_get_type(@elements, namedList)
123
+ end
124
+
125
+ def check_dir_for_param(namedList, dir, spec)
126
+ elements_check_dir_for_param(@elements, namedList, dir, spec)
127
+ end
128
+
129
+ def get_elements
130
+ @elements
131
+ end
132
+
133
+ def show_tree(indent)
134
+ # mikan override してしまった print を呼出す方法がわからないのでこうした
135
+ str = ""
136
+ indent.times { str += " " }
137
+ puts "#{str}#{self}"
138
+ end
139
+
140
+ ## private
141
+
142
+ #=== 式を文字列に変換
143
+ # name_list:: attribute (Celltype::@attribute_list), struct の @member_list を仮定している
144
+ def elements_to_s(elements, name_list = nil, pre = nil, post = nil)
145
+ if elements.instance_of? Token
146
+ return elements.to_s # OP_DOT, OP_REF の右辺
147
+ end
148
+
149
+ case elements[0]
150
+ when :IDENTIFIER
151
+ nsp = elements[1]
152
+ # if nsp.is_name_only? && name_list && name_list.get_item( nsp.get_name ) then
153
+ if nsp.is_name_only? && name_list && name_list.get_item(nsp.get_name)
154
+ return "#{pre}#{nsp.get_name}#{post}"
155
+ else
156
+ # return elements[1].get_global_name
157
+ return nsp.get_path_str
158
+ end
159
+ when :INTEGER_CONSTANT, :FLOATING_CONSTANT, :OCTAL_CONSTANT, :HEX_CONSTANT, :CHARACTER_LITERAL, :STRING_LITERAL_LIST, :BOOL_CONSTANT
160
+ return elements[1].to_s
161
+ when :PARENTHESES
162
+ return "(#{elements_to_s(elements[1], name_list, pre, post)})"
163
+ when :OP_SUBSC
164
+ return "#{elements_to_s(elements[1], name_list, pre, post)}[#{elements[2]}]"
165
+ when :OP_DOT
166
+ return "#{elements_to_s(elements[1], name_list, pre, post)}.#{elements_to_s(elements[2], name_list, pre, post)}"
167
+ when :OP_REF
168
+ return "#{elements_to_s(elements[1], name_list, pre, post)}->#{elements_to_s(elements[2], name_list, pre, post)}"
169
+ when :OP_SIZEOF_EXPR
170
+ return "sizeof(#{elements_to_s(elements[1], name_list, pre, post)})"
171
+ when :OP_SIZEOF_TYPE
172
+ return "sizeof(#{elements[1]}) mikan"
173
+ when :OP_U_AMP
174
+ return "&#{elements_to_s(elements[1], name_list, pre, post)}"
175
+ when :OP_U_ASTER
176
+ return "*#{elements_to_s(elements[1], name_list, pre, post)}"
177
+ when :OP_U_PLUS
178
+ return "+#{elements_to_s(elements[1], name_list, pre, post)}"
179
+ when :OP_U_MINUS
180
+ return "-#{elements_to_s(elements[1], name_list, pre, post)}"
181
+ when :OP_U_TILDE
182
+ return "~#{elements_to_s(elements[1], name_list, pre, post)}"
183
+ when :OP_U_EXCLAM
184
+ return "!#{elements_to_s(elements[1], name_list, pre, post)}"
185
+ when :CAST
186
+ return "(#{elements[1].get_type_str})#{elements_to_s(elements[2], name_list, pre, post)}"
187
+ when :OP_MULT
188
+ return "#{elements_to_s(elements[1], name_list, pre, post)}*#{elements_to_s(elements[2], name_list, pre, post)}"
189
+ when :OP_DIV
190
+ return "#{elements_to_s(elements[1], name_list, pre, post)}/#{elements_to_s(elements[2], name_list, pre, post)}"
191
+ when :OP_REMAIN
192
+ return "#{elements_to_s(elements[1], name_list, pre, post)}%#{elements_to_s(elements[2], name_list, pre, post)}"
193
+ when :OP_ADD
194
+ return "#{elements_to_s(elements[1], name_list, pre, post)}+#{elements_to_s(elements[2], name_list, pre, post)}"
195
+ when :OP_SUB
196
+ return "#{elements_to_s(elements[1], name_list, pre, post)}-#{elements_to_s(elements[2], name_list, pre, post)}"
197
+ when :OP_LSFT
198
+ return "#{elements_to_s(elements[1], name_list, pre, post)}<<#{elements_to_s(elements[2], name_list, pre, post)}"
199
+ when :OP_RSFT
200
+ return "#{elements_to_s(elements[1], name_list, pre, post)}>>#{elements_to_s(elements[2], name_list, pre, post)}"
201
+ when :OP_LT
202
+ return "#{elements_to_s(elements[1], name_list, pre, post)}<#{elements_to_s(elements[2], name_list, pre, post)}"
203
+ when :OP_GT
204
+ return "#{elements_to_s(elements[1], name_list, pre, post)}>#{elements_to_s(elements[2], name_list, pre, post)}"
205
+ when :OP_LE
206
+ return "#{elements_to_s(elements[1], name_list, pre, post)}<=#{elements_to_s(elements[2], name_list, pre, post)}"
207
+ when :OP_GE
208
+ return "#{elements_to_s(elements[1], name_list, pre, post)}>=#{elements_to_s(elements[2], name_list, pre, post)}"
209
+ when :OP_EQ
210
+ return "#{elements_to_s(elements[1], name_list, pre, post)}==#{elements_to_s(elements[2], name_list, pre, post)}"
211
+ when :OP_NE
212
+ return "#{elements_to_s(elements[1], name_list, pre, post)}!=#{elements_to_s(elements[2], name_list, pre, post)}"
213
+ when :OP_AND
214
+ return "#{elements_to_s(elements[1], name_list, pre, post)}&#{elements_to_s(elements[2], name_list, pre, post)}"
215
+ when :OP_EOR
216
+ return "#{elements_to_s(elements[1], name_list, pre, post)}^#{elements_to_s(elements[2], name_list, pre, post)}"
217
+ when :OP_OR
218
+ return "#{elements_to_s(elements[1], name_list, pre, post)}|#{elements_to_s(elements[2], name_list, pre, post)}"
219
+ when :OP_LAND
220
+ return "#{elements_to_s(elements[1], name_list, pre, post)}&&#{elements_to_s(elements[2], name_list, pre, post)}"
221
+ when :OP_LOR
222
+ return "#{elements_to_s(elements[1], name_list, pre, post)}||#{elements_to_s(elements[2], name_list, pre, post)}"
223
+ when :OP_CEX
224
+ return "#{elements_to_s(elements[1], name_list, pre, post)}?#{elements_to_s(elements[2], name_list, pre, post)}:#{elements_to_s(elements[3], name_list, pre, post)}"
225
+ else
226
+ raise "Unknown expression element: #{elemets[0]}. try -t and please report"
227
+ end
228
+ return ""
229
+ end
230
+
231
+ #=== Expression# 逆ポーランド文字列化
232
+ # param_list:: ParamlList 関数の引数リスト
233
+ def get_rpn(param_list = nil, name_list2 = nil)
234
+ return elements_rpn(@elements, param_list, name_list2)
235
+ end
236
+
237
+ #=== Expression# 逆ポーランド文字列化 (private)
238
+ # name_list:: ParamlList 関数の引数リスト
239
+ def elements_rpn(elements, name_list = nil, name_list2 = nil)
240
+ if elements.instance_of? Token
241
+ print "rpn: #{elements}\n"
242
+ return elements.to_s # OP_DOT, OP_REF の右辺
243
+ end
244
+
245
+ case elements[0]
246
+ when :IDENTIFIER
247
+ nsp = elements[1]
248
+ # if nsp.is_name_only? && name_list && name_list.find( nsp.get_name ) then
249
+ if nsp.is_name_only?
250
+ count = 0
251
+ # p "search: #{nsp.get_name}"
252
+ name_list.get_items.each{|nm, val|
253
+ # p " : #{nm.get_name} #{nsp.get_name.class} #{nm.get_name.class}"
254
+ if nsp.get_name == nm.get_name
255
+ return " $#{count}"
256
+ end
257
+ count += 1
258
+ }
259
+ raise "not found parameter"
260
+ else
261
+ # return elements[1].get_global_name
262
+ raise "not unexpected parameter"
263
+ end
264
+ when :INTEGER_CONSTANT, :FLOATING_CONSTANT, :OCTAL_CONSTANT, :HEX_CONSTANT, :CHARACTER_LITERAL, :STRING_LITERAL_LIST, :BOOL_CONSTANT
265
+ return elements[1].to_s
266
+ when :PARENTHESES
267
+ return elements_rpn(elements[1], name_list, name_list2)
268
+ when :OP_SUBSC
269
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[1], "", name_list, name_list2) + " []"
270
+ when :OP_DOT
271
+ return elements_rpn(elements[1], name_list, name_list2) + " ."
272
+ when :OP_REF
273
+ return elements_rpn(elements[1], name_list, name_list2) + " ->"
274
+ when :OP_SIZEOF_EXPR
275
+ return elements_rpn(elements[1], name_list, name_list2) + " #s"
276
+ when :OP_SIZEOF_TYPE
277
+ return elements_rpn(elements[1], name_list, name_list2) + " #S"
278
+ when :OP_U_AMP
279
+ return elements_rpn(elements[1], name_list, name_list2) + " #&"
280
+ when :OP_U_ASTER
281
+ return elements_rpn(elements[1], name_list, name_list2) + " #*"
282
+ when :OP_U_PLUS
283
+ return elements_rpn(elements[1], name_list, name_list2) + " #+"
284
+ when :OP_U_MINUS
285
+ return elements_rpn(elements[1], name_list, name_list2) + " #-"
286
+ when :OP_U_TILDE
287
+ return elements_rpn(elements[1], name_list, name_list2) + " #~"
288
+ when :OP_U_EXCLAM
289
+ return elements_rpn(elements[1], name_list, name_list2) + " #!"
290
+ when :CAST
291
+ return elements_rpn(elements[1], name_list, name_list2) + " #(" + elements_rpn(elements[2], "", name_list, name_list2) + ")"
292
+ when :OP_MULT
293
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " *"
294
+ when :OP_DIV
295
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " /"
296
+ when :OP_REMAIN
297
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " %"
298
+ when :OP_ADD
299
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " +"
300
+ when :OP_SUB
301
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " -"
302
+ when :OP_LSFT
303
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " <<"
304
+ when :OP_RSFT
305
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " >>"
306
+ when :OP_LT
307
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " <"
308
+ when :OP_GT
309
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " >"
310
+ when :OP_LE
311
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " <="
312
+ when :OP_GE
313
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " >="
314
+ when :OP_EQ
315
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " =="
316
+ when :OP_NE
317
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " !="
318
+ when :OP_AND
319
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " &"
320
+ when :OP_EOR
321
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " ^"
322
+ when :OP_OR
323
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " |"
324
+ when :OP_LAND
325
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " &&"
326
+ when :OP_LOR
327
+ return elements_rpn(elements[1], name_list, name_list2) + " " + elements_rpn(elements[2], "", name_list, name_list2) + " ||"
328
+ when :OP_CEX
329
+ return elements_rpn(elements[1], name_list, name_list2) + " " +
330
+ elements_rpn(elements[2], name_list, name_list2) + " " +
331
+ elements_rpn(elements[3], name_list, name_list2) + " ?:"
332
+ else
333
+ raise "Unknown expression element: #{elemets[0]}. try -t and please report"
334
+ end
335
+ return ""
336
+ end
337
+
338
+ # 定数式(elements)を評価する
339
+ #
340
+ # このメソッドは Expression クラスのメソッドである必要はない(関数化できる)
341
+ #
342
+ # elements は式の要素
343
+ #
344
+ # name_list, name_list2 は eval_const を参照
345
+ #
346
+ # RETURN: 評価した定数、評価できなかった場合は nil を返す
347
+
348
+ MAX_NEST_LEVEL = 64 # 簡易のループ検出(参照のネストを 64 まで許可する)
349
+ def elements_eval_const(elements, name_list, name_list2 = nil, nest = nil)
350
+ case elements[0]
351
+ when :IDENTIFIER
352
+ nsp = elements[1]
353
+
354
+ # #809 の修正しかけ (別の問題が解決しきれていない)
355
+ # nest += 1 # 参照がループになっていないかのチェック
356
+ # # mikan 本当にループしているかどうかではなく、単純に多数の参照を繰り返していることで判定している
357
+ # if nest > MAX_NEST_LEVEL then
358
+ # cdl_error( "E9999: '$1' too many reference (maybe loop) max=$1" , nsp.to_s, MAX_NEST_LEVEL )
359
+ # return
360
+ # end
361
+ if nsp.is_name_only?
362
+ if name_list
363
+ object = name_list.get_item(nsp.get_name)
364
+ end
365
+
366
+ if object.nil? && name_list2
367
+ object = name_list2.get_item(nsp.get_name)
368
+ end
369
+ end
370
+
371
+ # 見つからなければ定数定義から探す
372
+ if object.nil?
373
+ object = Namespace.find(nsp)# mikan namespace の対応 #1
374
+ end
375
+
376
+ # この実装は、もう少し整理されるべき
377
+ # これが呼出されるのは、以下の場合
378
+ # ・attribute, var の右辺式の評価
379
+ # ・size_is 引数の評価:関数パラメータの場合とattribute, var の場合がある
380
+ # 以下のエラーチェックでは、これらがごっちゃになって誤りを検出しようとしている
381
+
382
+ # IDENTIFIER は見つからなかった?
383
+ if object.nil?
384
+ cdl_error("E1001 $1: not found", nsp.get_path_str)
385
+ # raise "E1001" # bug trap
386
+ return nil
387
+ elsif object.instance_of?(Join)
388
+ # Join の場合: cell の中の attribute, var, call のどれかが見つかった
389
+ # Decl (attribute, var) でない?
390
+ if !object.get_definition.instance_of?(Decl)
391
+ cdl_error("E1002 $1: not constant (port)", nsp.get_path_str)
392
+ return nil
393
+ end
394
+ return object.get_rhs.eval_const2(name_list, name_list2, nest)
395
+ elsif !object.instance_of?(Decl)
396
+ # Decl でない場合: 定数でもない
397
+ if !object.instance_of?(ParamDecl)
398
+ # mikan paramdecl は無視する
399
+ # ParamList から呼ばれたとき
400
+ cdl_error("E1003 $1: not constant", nsp.get_path_str)
401
+ else
402
+ # ParamDecl
403
+ object.referenced
404
+ end
405
+ return nil
406
+ else # Decl
407
+ object.referenced
408
+ if object.get_initializer.nil?
409
+ # 初期化子の存在しない変数 # mikan ここへくるのは、通常ありえないはず(未検証)
410
+ return IntegerVal.new(0)
411
+ else
412
+ # Decl の右辺の評価
413
+ # mikan size_is 引数に現れる変数の型が適切かのチェックする
414
+ if object.get_initializer.instance_of?(Expression) || object.get_initializer.instance_of?(C_EXP)
415
+ return object.get_initializer.eval_const2(name_list, name_list2, nest)
416
+ else
417
+ # Array の場合
418
+ return object.get_initializer
419
+ end
420
+ end
421
+ end
422
+ when :BOOL_CONSTANT
423
+ if elements[1].instance_of?(TrueClass)
424
+ return BoolVal.new(true)
425
+ elsif elements[1].instance_of?(FalseClass)
426
+ return BoolVal.new(false)
427
+ else
428
+ throw("BOOL constant error")
429
+ end
430
+ when :INTEGER_CONSTANT
431
+ return IntegerVal.new(elements[1].val)
432
+ when :FLOATING_CONSTANT
433
+ return FloatVal.new(elements[1].val)
434
+ when :OCTAL_CONSTANT
435
+ return IntegerVal.new(elements[1].val.oct, elements[1].val)
436
+ when :HEX_CONSTANT
437
+ return IntegerVal.new(elements[1].val.hex, elements[1].val)
438
+ when :CHARACTER_LITERAL
439
+ str = elements[1].val.gsub(/'/, "")
440
+ # 2.0 if str.jlength == 1
441
+ len = str.length
442
+ if len == 1
443
+ sum = 0
444
+ str.each_byte {|b| sum = sum * 256 + b }
445
+ return IntegerVal.new(sum, elements[1].val)
446
+ else
447
+ # 2.0 if str[0] == 92 then
448
+ if str[0] == 92 || str[0] == "\\"
449
+ case str[1]
450
+ # 2.0 when 48 # '0'
451
+ when 48, "0" # '0'
452
+ return IntegerVal.new(0, elements[1].val)
453
+ # 2.0 when 110 # 'n'
454
+ when 110, "n" # 'n'
455
+ return IntegerVal.new(10, elements[1].val)
456
+ # 2.0 when 114 # 'r'
457
+ when 114, "r" # 'r'
458
+ return IntegerVal.new(13, elements[1].val)
459
+ # 2.0 when 116 # 't'
460
+ when 116, "t" # 't'
461
+ return IntegerVal.new(15, elements[1].val)
462
+ # 2.0 when 92 # '\\'
463
+ when 92, '\\' # '\\'
464
+ return IntegerVal.new(92, elements[1].val)
465
+ end
466
+ end
467
+ end
468
+ # 2.0 printf( "c=%c\n", str[1] )
469
+ printf("len=%d c=%c\n", len, str[1])
470
+ raise Error
471
+
472
+ when :STRING_LITERAL_LIST
473
+ return StringVal.new(elements[1])
474
+ when :PARENTHESES
475
+ return elements_eval_const(elements[1], name_list, name_list2, nest)
476
+ when :OP_SUBSC
477
+ cdl_error("E1004 cannot evaluate \'[]\' operator")
478
+ return nil
479
+ when :OP_DOT
480
+ cdl_error("E1005 cannot evaluate \'.\' operator")
481
+ return nil
482
+ when :OP_REF
483
+ cdl_error("E1006 cannot evaluate \'->\' operator")
484
+ return nil
485
+ when :OP_SIZEOF_EXPR
486
+ if Generator.parsing_C?
487
+ cdl_info("I9999 cannot evaluate \'sizeof\' operator. this might causes later error.")
488
+ else
489
+ cdl_error("E1007 cannot evaluate \'sizeof\' operator")
490
+ end
491
+ return nil
492
+ when :OP_SIZEOF_TYPE
493
+ if Generator.parsing_C?
494
+ cdl_info("I9999 cannot evaluate \'sizeof\' operator. this might causes later error.")
495
+ else
496
+ cdl_error("E1008 cannot evaluate \'sizeof\' operator")
497
+ end
498
+ return nil
499
+ when :OP_U_AMP
500
+ cdl_error("E1009 cannot evaluate \'&\' operator")
501
+ return nil
502
+ when :OP_U_ASTER
503
+ # cdl_error( "E1010 cannot evaluate \'*\' operator" )
504
+ val = elements_eval_const(elements[1], name_list, name_list2, nest)
505
+ return nil if !evaluable?(val)
506
+ return val
507
+ when :OP_U_PLUS
508
+ val = elements_eval_const(elements[1], name_list, name_list2, nest)
509
+ return nil if !evaluable?(val)
510
+ if val.respond_to?("+@")
511
+ return + val
512
+ else
513
+ cdl_error("E1011 cannot evaluate unary + for $1", val.class)
514
+ return nil
515
+ end
516
+ when :OP_U_MINUS
517
+ val = elements_eval_const(elements[1], name_list, name_list2, nest)
518
+ return nil if !evaluable?(val)
519
+ if val.respond_to?("-@")
520
+ return - val
521
+ else
522
+ return nil
523
+ end
524
+ when :OP_U_TILDE
525
+ val = elements_eval_const(elements[1], name_list, name_list2, nest)
526
+ return nil if !evaluable?(val)
527
+ # p "val.respond_to?( \"-@\" )=#{val.respond_to?( "-@" )} #{val.class}"
528
+ # p "val.respond_to?( \"~@\" )=#{val.respond_to?( "~@" )}"
529
+ # 2.0 if val.respond_to?( "~@" ) then # Ruby 1.9, 2.0 preview 版では例外が発生してしまう
530
+ if val.is_a? IntegerVal
531
+ return ~ val
532
+ else
533
+ return nil
534
+ end
535
+ when :OP_U_EXCLAM
536
+ val = elements_eval_const(elements[1], name_list, name_list2, nest)
537
+ return nil if !evaluable?(val)
538
+ val = val.cast(BoolType.new)
539
+ if val.respond_to?("not")
540
+ return val.not
541
+ else
542
+ return nil
543
+ end
544
+ return nil
545
+ when :CAST
546
+ val = elements_eval_const(elements[2], name_list, name_list2, nest)
547
+ # return nil if val == nil
548
+ return nil if !evaluable?(val)
549
+ return val.cast(elements[1])
550
+ when :OP_MULT
551
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
552
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
553
+ # return nil if( rhs == nil || lhs == nil )
554
+ return nil if !evaluable?(rhs, lhs)
555
+ return lhs * rhs
556
+ when :OP_DIV
557
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
558
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
559
+ # return nil if( rhs == nil || lhs == nil )
560
+ return nil if !evaluable?(rhs, lhs)
561
+ return lhs / rhs
562
+ when :OP_REMAIN
563
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
564
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
565
+ # return nil if( rhs == nil || lhs == nil )
566
+ return nil if !evaluable?(rhs, lhs)
567
+ return lhs % rhs
568
+ when :OP_ADD
569
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
570
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
571
+ # return nil if( rhs == nil || lhs == nil )
572
+ return nil if !evaluable?(rhs, lhs)
573
+ return lhs + rhs
574
+ when :OP_SUB
575
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
576
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
577
+ # return nil if( rhs == nil || lhs == nil )
578
+ return nil if !evaluable?(rhs, lhs)
579
+ return lhs - rhs
580
+ when :OP_LSFT
581
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
582
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
583
+ # return nil if( rhs == nil || lhs == nil )
584
+ return nil if !evaluable?(rhs, lhs)
585
+ return lhs << rhs
586
+ when :OP_RSFT
587
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
588
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
589
+ # return nil if( rhs == nil || lhs == nil )
590
+ return nil if !evaluable?(rhs, lhs)
591
+ return lhs >> rhs
592
+ when :OP_LT
593
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
594
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
595
+ # return nil if( rhs == nil || lhs == nil )
596
+ return nil if !evaluable?(rhs, lhs)
597
+ return lhs < rhs
598
+ when :OP_GT
599
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
600
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
601
+ # return nil if( rhs == nil || lhs == nil )
602
+ return nil if !evaluable?(rhs, lhs)
603
+ return lhs > rhs
604
+ when :OP_LE
605
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
606
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
607
+ # return nil if( rhs == nil || lhs == nil )
608
+ return nil if !evaluable?(rhs, lhs)
609
+ return lhs <= rhs
610
+ when :OP_GE
611
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
612
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
613
+ # return nil if( rhs == nil || lhs == nil )
614
+ return nil if !evaluable?(rhs, lhs)
615
+ return lhs >= rhs
616
+ when :OP_EQ
617
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
618
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
619
+ # return nil if( rhs == nil || lhs == nil )
620
+ return nil if !evaluable?(rhs, lhs)
621
+ return lhs.eq(rhs)
622
+ when :OP_NE
623
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
624
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
625
+ # return nil if( rhs == nil || lhs == nil )
626
+ return nil if !evaluable?(rhs, lhs)
627
+ return lhs.neq(rhs)
628
+ when :OP_AND
629
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
630
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
631
+ # return nil if( rhs == nil || lhs == nil )
632
+ return nil if !evaluable?(rhs, lhs)
633
+ return lhs & rhs
634
+ when :OP_EOR
635
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
636
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
637
+ # return nil if( rhs == nil || lhs == nil )
638
+ return nil if !evaluable?(rhs, lhs)
639
+ return lhs ^ rhs
640
+ when :OP_OR
641
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
642
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
643
+ # return nil if( rhs == nil || lhs == nil )
644
+ return nil if !evaluable?(rhs, lhs)
645
+ return lhs | rhs
646
+ when :OP_LAND
647
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
648
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
649
+ # return nil if( rhs == nil || lhs == nil )
650
+ return nil if !evaluable?(rhs, lhs)
651
+ return lhs.lAND(rhs)
652
+ when :OP_LOR
653
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
654
+ rhs = elements_eval_const(elements[2], name_list, name_list2, nest)
655
+ # return nil if( rhs == nil || lhs == nil )
656
+ return nil if !evaluable?(rhs, lhs)
657
+ return lhs.lOR(rhs)
658
+ when :OP_CEX
659
+ lhs = elements_eval_const(elements[1], name_list, name_list2, nest)
660
+ mhs = elements_eval_const(elements[2], name_list, name_list2, nest)
661
+ rhs = elements_eval_const(elements[3], name_list, name_list2, nest)
662
+ # return nil if( rhs == nil || mhs == nil || lhs == nil )
663
+ return nil if !evaluable?(rhs, mhs, lhs)
664
+ if lhs.cast(BoolType.new).val
665
+ return mhs
666
+ else
667
+ return rhs
668
+ end
669
+ end
670
+ return nil
671
+ end
672
+
673
+ def elements_get_type(elements, namedList)
674
+ type = elements_get_type_sub(elements, namedList)
675
+ # 返された方が DefinedType の場合 元の型を返す
676
+ if type.is_a?(DefinedType)
677
+ type = type.get_type
678
+ end
679
+ return type
680
+ end
681
+
682
+ def elements_get_type_sub(elements, namedList)
683
+ case elements[0]
684
+ when :IDENTIFIER
685
+ nsp = elements[1]
686
+ if nsp.is_name_only?
687
+ paramdecl = namedList.get_item(nsp.get_name)
688
+ else
689
+ paramdecl = nil
690
+ end
691
+ unless paramdecl
692
+ cdl_error("E1012 $1: not found in parameter list", nsp.get_path_str)
693
+ return IntType.new(32) # dummy result
694
+ end
695
+ return paramdecl.get_type
696
+ # mikan get_type
697
+ # when :INTEGER_CONSTANT
698
+ # when :FLOATING_CONSTANT
699
+ # when :OCTAL_CONSTANT
700
+ # when :HEX_CONSTANT
701
+ # when :CHARACTER_LITERAL
702
+ # when :STRING_LITERAL_LIST
703
+ # when :PARENTHESES
704
+ # when :OP_SUBSC
705
+ # when :OP_DOT
706
+ # when :OP_REF
707
+ # when :OP_SIZEOF_EXPR
708
+ # when :OP_SIZEOF_TYPE
709
+ # when :OP_U_AMP
710
+ when :OP_U_ASTER
711
+ type = elements_get_type(elements[1], namedList)
712
+ unless type.is_a?(PtrType)
713
+ cdl_error("E1013 \'*\': operand is not pointer value")
714
+ return IntType.new(8) # IntType を返しておく
715
+ end
716
+ return type.get_referto
717
+
718
+ when :OP_U_PLUS, :OP_U_MINUS
719
+ # mikan operand が適切な型かチェックしていない
720
+ return elements_get_type(elements[1], namedList)
721
+
722
+ when :OP_ADD, :OP_SUB, :OP_MULT, :OP_DIV, :OP_REMAIN
723
+ # mikan operand が適切な型かチェックしていない&左辺の型を採用している
724
+ return elements_get_type(elements[1], namedList)
725
+
726
+ when :OP_U_TILDE
727
+ # mikan operand が整数かチェックしていない
728
+ return elements_get_type(elements[1], namedList)
729
+ when :OP_AND, :OP_EOR, :OP_OR, :OP_LSFT, :OP_RSFT
730
+ # mikan operand が整数かチェックしていない
731
+ return BoolType.new
732
+ when :OP_U_EXCLAM
733
+ # mikan operand が整数かチェックしていない
734
+ return BoolType.new
735
+
736
+ when :OP_LT, :OP_GT, :OP_LE, :OP_GE, :OP_EQ, :OP_NE, :OP_LAND, :OP_LOR, :OP_CEX, :CAST
737
+ cdl_error("E1014 $1: elements_get_type: sorry not supported", elements[0])
738
+ end
739
+
740
+ return nil
741
+ end
742
+
743
+ # 式が size_is, count_is, string の引数である場合の方向のチェック
744
+ def elements_check_dir_for_param(elements, namedList, dir, spec)
745
+ # dir : 元の引数の方向
746
+ # direct: size_is などの引数の変数の方向
747
+
748
+ case elements[0]
749
+ when :IDENTIFIER
750
+ nsp = elements[1]
751
+ if nsp.is_name_only?
752
+ paramdecl = namedList.get_item(nsp.get_name)
753
+ else
754
+ paramdecl = nil
755
+ end
756
+
757
+ return unless paramdecl # if nil already error in element_get_type
758
+
759
+ direct = paramdecl.get_direction
760
+ judge = false
761
+ case spec
762
+ when "size_is", "string"
763
+ case dir
764
+ when :IN, :OUT, :INOUT, :SEND
765
+ judge = true if direct == :IN || direct == :INOUT
766
+ req_direct = "in or inout"
767
+ when :RECEIVE
768
+ judge = true if direct == :OUT || direct == :INOUT
769
+ req_direct = "out or inout"
770
+ end
771
+
772
+ when "count_is"
773
+ case dir
774
+ when :IN, :SEND
775
+ judge = true if direct == :IN || direct == :INOUT
776
+ req_direct = "in or inout"
777
+ when :OUT, :RECEIVE # mikan out で count_is のみ指定されている場合 in でなくてはならない
778
+ judge = true if direct == :OUT || direct == :INOUT
779
+ req_direct = "out or inout"
780
+ when :INOUT
781
+ judge = true if direct == :INOUT
782
+ req_direct = "inout"
783
+ end
784
+ end
785
+
786
+ if judge == false
787
+ cdl_error("E1015 \'$1\': direction mismatch for $2, $3 required", nsp.get_path_str, spec, req_direct)
788
+ end
789
+
790
+ when :INTEGER_CONSTANT, :FLOATING_CONSTANT, :OCTAL_CONSTANT, :HEX_CONSTANT, :CHARACTER_LITERAL, :STRING_LITERAL_LIST
791
+ return true
792
+
793
+ # 単項演算子
794
+ when :OP_U_ASTER, :OP_SIZEOF_EXPR, :OP_SIZEOF_TYPE, :OP_U_PLUS, :OP_U_MINUS, :OP_U_TILDE, :OP_U_EXCLAM, :CAST, :OP_U_AMP, :PARENTHESES,
795
+ elements_check_dir_for_param(elements[1], namedList, dir, spec)
796
+
797
+ # 2項演算子
798
+ when :OP_SUBSC, :OP_DOT, :OP_REF, :OP_MULT, :OP_DIV, :OP_REMAIN, :OP_ADD, :OP_SUB, :OP_LSFT, :OP_RSFT, :OP_LT, :OP_GT, :OP_LE, :OP_GE, :OP_EQ, :OP_NE, :OP_AND, :OP_EOR, :OP_OR, :OP_LAND, :OP_LOR
799
+ return elements_check_dir_for_param(elements[1], namedList, dir, spec) && elements_check_dir_for_param(elements[2], namedList, dir, spec)
800
+
801
+ # 3項演算子
802
+ when :OP_CEX
803
+ return elements_check_dir_for_param(elements[1], namedList, dir, spec) && elements_check_dir_for_param(elements[2], namedList, dir, spec) && elements_check_dir_for_param(elements[3], namedList, dir, spec)
804
+
805
+ else
806
+ cdl_error("E1016 $1: elements_check_dir_for_param: sorry not supported", elements[0])
807
+ end
808
+ end
809
+
810
+ # Express# get_allocator_rhs_elem
811
+ # alloc_type::Symbol :NORMAL_ALLOC|:INTERNAL_ALLOC|:RELAY_ALLOC
812
+ # 式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す
813
+ # return:
814
+ # :NORMAL_ALLOC [ cell_nsp, ep_name ] # rhs = cell_nsp.ep_name ex) Alloc.eAlloc
815
+ # :INTERNAL_ALLOC [ ep_name ] # rhs = ep_name ex) eAlloc
816
+ # :RELAY_ALLOC [ cp_name, func_name, param_name ] # rhs = cp_name.func_name.param_name
817
+ def get_allocator_rhs_elements(alloc_type)
818
+ ele = @elements
819
+ case alloc_type
820
+ when :NORMAL_ALLOC
821
+ if ele[0] != :OP_DOT || ele[1][0] != :IDENTIFIER # 1
822
+ cdl_error("E1017 $1: rhs not \'Cell.ePort\' form", ele[0].to_s)
823
+ return nil
824
+ end
825
+ cell_nsp = elements[1][1]
826
+ port_name = elements[2].val
827
+ return [cell_nsp, port_name]
828
+ when :INTERNAL_ALLOC
829
+ if ele[0] == :IDENTIFIER
830
+ if ele[1].is_name_only?
831
+ return [ele[1].get_path[0]] # mikan a::b
832
+ else
833
+ cdl_error("E1018 $1: namespace cannot be specified", ele[1].to_s)
834
+ end
835
+ else
836
+ cdl_error("E1019 $1: rhs not in 'allocator_entry_port' form", ele[1].to_s)
837
+ end
838
+ when :RELAY_ALLOC
839
+ if ele[0] != :OP_DOT ||
840
+ ele[1][0] != :OP_DOT || ele[1][1][0] != :IDENTIFIER || !ele[1][1][1].is_name_only? ||
841
+ !ele[1][2].instance_of?(Token) || !ele[2].instance_of?(Token) # 1
842
+ cdl_error("E1020 rhs not in 'call_port.func.param' form ($1)", ele[0].to_s) # S1086
843
+ end
844
+ func_name = ele[1][2]
845
+ cp_name = ele[1][1][1].get_name
846
+ param_name = ele[2].to_sym
847
+ return [cp_name, func_name, param_name]
848
+ end
849
+ return nil
850
+ end
851
+
852
+ # Expression#Expression のクローンを作成する
853
+ def clone_for_composite
854
+ cl = self.clone
855
+ elements = clone_elements @elements
856
+ cl.set_elements elements
857
+ return cl
858
+ end
859
+
860
+ # Expression#elements のクローンを作成
861
+ # elements::Array
862
+ # このメソッドは、Array のディープコピーを行う
863
+ def clone_elements(elements)
864
+ elements = elements.clone
865
+ elements.map!{|ele|
866
+ if ele.instance_of? Array
867
+ clone_elements ele
868
+ else
869
+ ele
870
+ end
871
+ }
872
+ return elements
873
+ end
874
+
875
+ def set_elements(elements)
876
+ @elements = elements
877
+ end
878
+
879
+ #=== Expression#セル結合の式を解析する
880
+ # Cell.eEntry => [ :OP_DOT, [ :IDENTIFIER, token ], token ]
881
+ # Cell.eEntry[expression] => [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ]
882
+ # Return: [ NamespacePath(cell_name), Integer(subscript) or nil, Token(port_name)]
883
+ def analyze_cell_join_expression
884
+ # 右辺の Expression の要素を取り出す
885
+ elements = @elements
886
+ if elements[0] == :OP_SUBSC # 右辺:受け口配列?
887
+ # elements = [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ]
888
+ subscript = elements[2].eval_const(nil) # 受け口配列の添数
889
+ elements = elements[1] # mikan 配列だった場合
890
+ else
891
+ subscript = nil
892
+ end
893
+
894
+ # elements = [ :OP_DOT, [ :IDENTIFIER, token ], token ]
895
+ if elements[0] != :OP_DOT || elements[1][0] != :IDENTIFIER # 1
896
+ return nil
897
+ end
898
+
899
+ nsp = elements[1][1] # NamespacePath
900
+ port_name = elements[2].val
901
+
902
+ return [nsp, subscript, port_name]
903
+ end
904
+
905
+ #=== Expression# セルへの結合の式を生成する
906
+ # nsp:: NamespacePath
907
+ # subscript:: Integer
908
+ # port_name:: Symbol
909
+ # analyze_cell_join_expression と対になっている
910
+ def self.create_cell_join_expression(nsp, subscript, port_name, locale = nil)
911
+ if !port_name.instance_of?(Symbol)
912
+ raise "port_name: not Symbol"
913
+ end
914
+
915
+ if subscript
916
+ elements = [:OP_SUBSC, [:OP_DOT, [:IDENTIFIER, nsp],
917
+ Token.new(port_name, nil, nil, nil)],
918
+ Expression.create_integer_constant(subscript, @locale)]
919
+ else
920
+ elements = [:OP_DOT, [:IDENTIFIER, nsp], Token.new(port_name, nil, nil, nil)]
921
+ end
922
+ return Expression.new(elements, locale)
923
+ end
924
+
925
+ #=== Expression#整数定数の式を生成する
926
+ # val:: Integer : 値: 整数
927
+ def self.create_integer_constant(val, locale = nil)
928
+ if val != Integer(val) || val < 0
929
+ raise "create_integer_constant: not integer or negative: #{val}"
930
+ end
931
+ Expression.new([:INTEGER_CONSTANT, Token.new(val, nil, nil, nil)], locale)
932
+ end
933
+
934
+ #=== Expression#単一の識別子の式を解析する
935
+ # Identifier => [ :IDENTIFIER, token ]
936
+ # Return: NamespacePath(Identifier)
937
+ def analyze_single_identifier
938
+ # 右辺の Expression の要素を取り出す
939
+ elements = @elements
940
+ if elements[0] == :IDENTIFIER
941
+ return elements[1]
942
+ else
943
+ return nil
944
+ end
945
+ end
946
+
947
+ #=== Expression#
948
+ # nsp:: NamespacePath : 参照するもの識別子
949
+ def self.create_single_identifier(nsp, locale)
950
+ if !nsp.instance_of?(NamespacePath)
951
+ raise "create_single_identifier: not NamespacePath: #{nsp}"
952
+ end
953
+ Expression.new([:IDENTIFIER, nsp])
954
+ end
955
+
956
+ #=== 評価可能かチェックする
957
+ # *v:: 可変個引数(任意の型)
958
+ # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する
959
+ def evaluable?(*v)
960
+ v.each{|val|
961
+ if !val.is_a?(BaseVal)
962
+ return false
963
+ end
964
+ }
965
+ return true
966
+ end
967
+
968
+ private :elements_to_s, :elements_eval_const, :elements_get_type
969
+ end
970
+
971
+
972
+ class C_EXP < Node
973
+ # @c_exp_string : string
974
+
975
+ # c_exp_string::String
976
+ # b_renew::Bool : true なら C_EXP の clone 作成(エスケープ処理等をしない)
977
+ def initialize(c_exp_string, b_renew = false)
978
+ if b_renew
979
+ @c_exp_string = c_exp_string
980
+ else
981
+ # 前後の " を取り除く
982
+ # str = c_exp_string.to_s.sub( /^\"(.*)\"$/, "\\1" )
983
+ str = CDLString.remove_dquote c_exp_string.to_s
984
+ @c_exp_string = CDLString.escape str
985
+ end
986
+ end
987
+
988
+ #=== composite 用に C_EXP を clone する
989
+ # ct_name::
990
+ # cell_name::
991
+ # composite の attribute に現れる C_EXP を文字列置換して生成しなおす.
992
+ # この文字列置換は、意味解釈段階で行う.
993
+ # 他の C_EXP の文字列置換は、コード生成段階で行う.
994
+ def clone_for_composite(ct_name, cell_name, locale)
995
+ dbgPrint "C_EXP: #{ct_name} #{cell_name} #{@c_exp_string}\n"
996
+
997
+ @locale = locale
998
+ str = @c_exp_string.gsub(/(^|[^\$])\$ct\$/, "\\1#{ct_name}")
999
+ str = str. gsub(/(^|[^\$])\$cell\$/, "\\1#{cell_name}")
1000
+ str = str. gsub(/(^|[^\$])\$id\$/, "\\1#{ct_name}_#{cell_name}")
1001
+ return C_EXP.new(str, true)
1002
+ end
1003
+
1004
+ def get_c_exp_string
1005
+ @c_exp_string
1006
+ end
1007
+
1008
+ #=== C_EXP を評価する
1009
+ # C_EXP の引き数文字列を返す
1010
+ # 本来 C_EXP は eval_const する対象ではないが、便宜上 eval_const で対応
1011
+ def eval_const(name_list, name_list2 = nil)
1012
+ return self
1013
+ end
1014
+
1015
+ def eval_const2(name_list, name_list2 = nil, nest = nil)
1016
+ return self
1017
+ end
1018
+
1019
+ def to_s
1020
+ @c_exp_string
1021
+ end
1022
+
1023
+ def to_CDL_str
1024
+ return "C_EXP( \"#{self}\" )"
1025
+ end
1026
+
1027
+ def show_tree(indent)
1028
+ indent.times { print " " }
1029
+ puts "C_EXP: #{@c_exp_string}"
1030
+ end
1031
+ end