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,1032 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2018 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: C_parser.y.rb 2810 2018-03-11 13:20:03Z okuma-top $
37
+ #++
38
+
39
+ class C_parser
40
+ rule
41
+ # トップレベルの構文要素は C_parser
42
+ all: C_parser
43
+
44
+ # Expr
45
+ ########################## 式 ##########################
46
+ # K&Rの文法(プログラミング言語C 第2版 付録)と一部異なる
47
+ # argument_expression_list(関数引数), assignment_expression(代入)がない
48
+ # 式の result は、すべて配列で第一要素が識別シンボル、第二要素以下が引数
49
+
50
+ primary_expression
51
+ : namespace_identifier
52
+ { result = [ :IDENTIFIER, val[0] ] } #1ok
53
+ # : IDENTIFIER # mikan namespace への対応
54
+ # { result = [ :IDENTIFIER, val[0] ] }
55
+ # | TRUE
56
+ # { result = [ :BOOL_CONSTANT, true ] }
57
+ # | FALSE
58
+ # { result = [ :BOOL_CONSTANT, false ] }
59
+ | INTEGER_CONSTANT
60
+ { result = [ :INTEGER_CONSTANT, val[0] ] }
61
+ | FLOATING_CONSTANT
62
+ { result = [ :FLOATING_CONSTANT, val[0] ] }
63
+ | OCTAL_CONSTANT
64
+ { result = [ :OCTAL_CONSTANT, val[0] ] }
65
+ | HEX_CONSTANT
66
+ { result = [ :HEX_CONSTANT, val[0] ] }
67
+ | CHARACTER_LITERAL
68
+ { result = [ :CHARACTER_LITERAL, val[0] ] }
69
+ | string_literal_list
70
+ { result = [ :STRING_LITERAL_LIST, val[0] ] }
71
+ | '(' expression ')'
72
+ { result = [ :PARENTHESES, val[1].get_elements ] }
73
+
74
+ string_literal_list
75
+ : STRING_LITERAL
76
+ { result = [val[0]] }
77
+ | string_literal_list STRING_LITERAL
78
+ { result << val[1] }
79
+
80
+ # 関数呼び出しと後置インクリメント、デクリメント演算子がない
81
+ postfix_expression
82
+ : primary_expression
83
+ | primary_expression '(' argument_list ')'
84
+ | primary_expression type_qualifier '(' argument_list ')' # intended __asm volatile ( " MNEMONIC OPERAND" );
85
+ | postfix_expression '[' expression ']'
86
+ { result = [ :OP_SUBSC, val[0], val[2] ] }
87
+ | postfix_expression '.' IDENTIFIER
88
+ { result = [ :OP_DOT, val[0], val[2] ] }
89
+ | postfix_expression '->' IDENTIFIER
90
+ { result = [ :OP_REF, val[0], val[2] ] }
91
+ | postfix_expression '++' { result = val[0] } # ++, -- は無視する
92
+ | postfix_expression '--' { result = val[0] }
93
+
94
+ argument_list
95
+ :
96
+ | expression
97
+ | argument_list ',' expression
98
+
99
+
100
+ # 前置インクリメント、デクリメント演算子がない
101
+ unary_expression
102
+ : postfix_expression
103
+ | unary_operator cast_expression
104
+ { result = [ val[0], val[1] ] }
105
+ | SIZEOF unary_expression
106
+ { result = [ :OP_SIZEOF_EXPR, val[1] ] }
107
+ | SIZEOF '(' type_name ')'
108
+ { result = [ :OP_SIZEOF_TYPE, val[1] ] }
109
+ | '++' unary_expression { result = val[1] } # ++, -- は無視する
110
+ | '--' unary_expression { result = val[1] }
111
+
112
+ unary_operator
113
+ : '&' { result = :OP_U_AMP }
114
+ | '*' { result = :OP_U_ASTER }
115
+ | '+' { result = :OP_U_PLUS }
116
+ | '-' { result = :OP_U_MINUS }
117
+ | '~' { result = :OP_U_TILDE }
118
+ | '!' { result = :OP_U_EXCLAM }
119
+
120
+ cast_expression
121
+ : unary_expression
122
+ | '(' type_name ')' cast_expression
123
+ { result = [ :CAST, val[1], val[3] ] }
124
+
125
+ multiplicative_expression
126
+ : cast_expression
127
+ | multiplicative_expression '*' cast_expression
128
+ { result = [ :OP_MULT, val[0], val[2] ] }
129
+ | multiplicative_expression '/' cast_expression
130
+ { result = [ :OP_DIV, val[0], val[2] ] }
131
+ | multiplicative_expression '%' cast_expression
132
+ { result = [ :OP_REMAIN, val[0], val[2] ] }
133
+
134
+ additive_expression
135
+ : multiplicative_expression
136
+ | additive_expression '+' multiplicative_expression
137
+ { result = [ :OP_ADD, val[0], val[2] ] }
138
+ | additive_expression '-' multiplicative_expression
139
+ { result = [ :OP_SUB, val[0], val[2] ] }
140
+
141
+ shift_expression
142
+ : additive_expression
143
+ | shift_expression '<<' additive_expression
144
+ { result = [ :OP_LSFT, val[0], val[2] ] }
145
+ | shift_expression '>>' additive_expression
146
+ { result = [ :OP_RSFT, val[0], val[2] ] }
147
+
148
+ relational_expression
149
+ : shift_expression
150
+ | relational_expression '<' shift_expression
151
+ { result = [ :OP_LT, val[0], val[2] ] }
152
+ | relational_expression '>' shift_expression
153
+ { result = [ :OP_GT, val[0], val[2] ] }
154
+ | relational_expression '<=' shift_expression
155
+ { result = [ :OP_LE, val[0], val[2] ] }
156
+ | relational_expression '>=' shift_expression
157
+ { result = [ :OP_GE, val[0], val[2] ] }
158
+
159
+ equality_expression
160
+ : relational_expression
161
+ | equality_expression '==' relational_expression
162
+ { result = [ :OP_EQ, val[0], val[2] ] }
163
+ | equality_expression '!=' relational_expression
164
+ { result = [ :OP_NE, val[0], val[2] ] }
165
+
166
+ and_expression
167
+ : equality_expression
168
+ | and_expression '&' equality_expression
169
+ { result = [ :OP_AND, val[0], val[2] ] }
170
+
171
+ exclusive_or_expression
172
+ : and_expression
173
+ | exclusive_or_expression '^' and_expression
174
+ { result = [ :OP_EOR, val[0], val[2] ] }
175
+
176
+ inclusive_or_expression
177
+ : exclusive_or_expression
178
+ | inclusive_or_expression '|' exclusive_or_expression
179
+ { result = [ :OP_OR, val[0], val[2] ] }
180
+
181
+ logical_and_expression
182
+ : inclusive_or_expression
183
+ | logical_and_expression '&&' inclusive_or_expression
184
+ { result = [ :OP_LAND, val[0], val[2] ] }
185
+
186
+ logical_or_expression
187
+ : logical_and_expression
188
+ | logical_or_expression '||' logical_and_expression
189
+ { result = [ :OP_LOR, val[0], val[2] ] }
190
+
191
+ conditional_expression
192
+ : logical_or_expression
193
+ | logical_or_expression '?' expression ':' conditional_expression
194
+ { result = [ :OP_CEX, val[0], val[2].get_elements, val[4] ] }
195
+
196
+
197
+ expression
198
+ : conditional_expression
199
+ {
200
+ result = Expression.new( val[0] )
201
+ # result.print
202
+ }
203
+ | expression ',' conditional_expression
204
+ {
205
+ result = Expression.new( val[2] ) # ',' の後ろを採用
206
+ }
207
+
208
+ constant_expression
209
+ : conditional_expression
210
+ {
211
+ result = Expression.new( val[0] )
212
+ # result.print
213
+ # res = result.eval_const( nil )
214
+
215
+ # if res then
216
+ # puts "val: #{res}"
217
+ # else
218
+ # puts "val: nil"
219
+ # end
220
+ }
221
+
222
+
223
+
224
+ # Types
225
+ ########################## 宣言 ##########################
226
+ # 宣言もK&Rと一部異なる
227
+
228
+ # declarationはセルの属性で使われる
229
+ # K&Rとの違い: storage classが指定できない、型が省略できない
230
+ declaration
231
+ : declaration_specifiers init_declarator_list ';'
232
+ # : type_specifier_qualifier_list init_declarator_list ';'
233
+
234
+ # declaration_specifiersは関数のパラメータで使われるが、
235
+ # type_specifier_qualifier_listで十分かもしれない
236
+
237
+ declaration_specifiers
238
+ : storage_class
239
+ {
240
+ result = CIntType.new( -3 ) # storage class は無視
241
+ }
242
+ | type_specifier
243
+ | type_qualifier
244
+ {
245
+ result = CIntType.new( -3 )
246
+ result.set_qualifier val[0]
247
+ }
248
+ | storage_class declaration_specifiers
249
+ {
250
+ result = val[1] # storage class は無視
251
+ }
252
+ | type_specifier declaration_specifiers
253
+ {
254
+ result = val[1].merge val[0]
255
+ }
256
+ | type_qualifier declaration_specifiers
257
+ {
258
+ val[1].set_qualifier val[0]
259
+ result = val[1]
260
+ }
261
+
262
+
263
+ init_declarator_list
264
+ : init_declarator
265
+ { result = [val[0]] }
266
+ | init_declarator_list ',' init_declarator
267
+ { result << val[2] }
268
+
269
+ init_declarator
270
+ : declarator
271
+ | declarator '=' initializer
272
+ { val[0].set_initializer( val[2] ) }
273
+
274
+ type_specifier
275
+ : VOID { set_no_type_name true; result = CVoidType.new }
276
+ | FLOAT { set_no_type_name true; result = CFloatType.new(-32) }
277
+ | DOUBLE { set_no_type_name true; result = CFloatType.new(-64) }
278
+ | BOOL { set_no_type_name true; result = CBoolType.new }
279
+ | struct_specifier { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
280
+ | union_specifier { set_no_type_name true; result = CVoidType.new } # void が宣言されたとする
281
+ | enum_specifier { set_no_type_name true; result = CVoidType.new } # void が宣言されたとする
282
+ | TYPE_NAME { set_no_type_name true; result = CDefinedType.new( val[0].val ) }
283
+
284
+ | CHAR { set_no_type_name true; result = CIntType.new(-11 ) }
285
+ | SHORT { set_no_type_name true; result = CIntType.new( -2 ) }
286
+ | INT { set_no_type_name true; result = CIntType.new( -3 ) }
287
+ | LONG { set_no_type_name true; result = CIntType.new( -4 ) }
288
+ | SIGNED
289
+ {
290
+ set_no_type_name true
291
+ result = CIntType.new( -3 )
292
+ result.set_sign :SIGNED
293
+ }
294
+ | UNSIGNED
295
+ {
296
+ set_no_type_name true
297
+ result = CIntType.new( -3 )
298
+ result.set_sign :UNSIGNED
299
+ }
300
+
301
+ # mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
302
+ struct_specifier # mikan
303
+ # : STRUCT struct_tag '{'
304
+ : struct_term struct_tag '{'
305
+ { StructType.set_define( true ) }
306
+ struct_declaration_list '}'
307
+ {
308
+ StructType.end_of_parse
309
+ result = val[1]
310
+ }
311
+ # | STRUCT
312
+ | struct_term
313
+ {
314
+ result = CStructType.new()
315
+ StructType.set_define( true )
316
+ }
317
+ '{' struct_declaration_list '}'
318
+ {
319
+ StructType.end_of_parse
320
+ result = val[1]
321
+ }
322
+ # | STRUCT struct_tag # mikan struct_tag は namespace 対応が必要
323
+ | struct_term struct_tag # mikan struct_tag は namespace 対応が必要
324
+ {
325
+ StructType.set_define( false )
326
+ StructType.end_of_parse
327
+ result = val[1]
328
+ }
329
+
330
+ struct_term
331
+ : STRUCT { set_no_type_name true }
332
+
333
+ struct_declaration_list
334
+ : struct_declaration
335
+ | struct_declaration_list struct_declaration
336
+
337
+ struct_tag:
338
+ IDENTIFIER
339
+ {
340
+ result = CStructType.new( val[0].val )
341
+ set_no_type_name true
342
+ }
343
+
344
+ # ポインタ修飾子を追加
345
+ struct_declaration
346
+ : declaration_specifiers struct_declarator_list ';'
347
+ # : type_specifier_qualifier_list struct_declarator_list ';'
348
+ {
349
+ val[1].each { |i| # i: Decl
350
+ i.set_type( val[0] )
351
+ i.set_kind( :MEMBER )
352
+ i.check
353
+ CStructType.new_member( i )
354
+ }
355
+ result = val[1]
356
+ }
357
+ | union_specifier ';' # 無名
358
+ | struct_specifier ';' # 無名
359
+
360
+
361
+
362
+ # K&Rのspecifier_qualifier_listと同じ
363
+ # 名前がまぎらわしかったのでtype_を付けた
364
+ type_specifier_qualifier_list
365
+ : type_specifier
366
+ | type_specifier type_specifier_qualifier_list
367
+ {
368
+ result = val[1].merge val[0]
369
+ }
370
+ | type_qualifier
371
+ {
372
+ result = CIntType.new( -3 )
373
+ result.set_qualifier val[0]
374
+ }
375
+ | type_qualifier type_specifier_qualifier_list
376
+ {
377
+ val[1].set_qualifier val[0]
378
+ result = val[1]
379
+ }
380
+
381
+ struct_declarator_list
382
+ : struct_declarator
383
+ { result = [ val[0] ] }
384
+ | struct_declarator_list ',' struct_declarator
385
+ { result << val[2] }
386
+
387
+ # ビットフィールドは使えない
388
+ struct_declarator
389
+ : declarator
390
+
391
+
392
+
393
+ union_specifier
394
+ # : UNION union_tag '{' union_declaration_list '}'
395
+ # | UNION '{' union_declaration_list '}'
396
+ # | UNION union_tag # mikan struct_tag は namespace 対応が必要
397
+ : union_term union_tag '{' union_declaration_list '}'
398
+ | union_term '{' union_declaration_list '}'
399
+ | union_term union_tag # mikan struct_tag は namespace 対応が必要
400
+
401
+ union_term
402
+ : UNION { set_no_type_name true }
403
+
404
+ union_declaration_list
405
+ : union_declaration
406
+ | union_declaration_list union_declaration
407
+
408
+ union_tag:
409
+ IDENTIFIER
410
+
411
+ union_declaration
412
+ : declaration_specifiers union_declarator_list ';'
413
+ | union_specifier ';' # 無名
414
+ | struct_specifier ';' # 無名
415
+
416
+ union_declarator_list
417
+ : union_declarator
418
+ | union_declarator_list ',' union_declarator
419
+
420
+ # ビットフィールドは使えない
421
+ union_declarator
422
+ : declarator
423
+
424
+
425
+
426
+ # enumの種類を追加
427
+ enum_specifier # mikan
428
+ : enum_type '{' enumerator_list '}'
429
+ | enum_type IDENTIFIER '{' enumerator_list '}'
430
+ | enum_type IDENTIFIER
431
+
432
+ enum_type
433
+ : ENUM { result = CEnumType.new( -1 ) }
434
+ # | ENUM8 { result = CEnumType.new( 8 ) }
435
+ # | ENUM16 { result = CEnumType.new( 16 ) }
436
+ # | ENUM32 { result = CEnumType.new( 32 ) }
437
+ # | ENUM64 { result = CEnumType.new( 64 ) }
438
+ # | ENUM128 { result = CEnumType.new( 128 ) }
439
+
440
+ enumerator_list
441
+ : enumerator
442
+ | enumerator_list ',' enumerator
443
+
444
+ enumerator
445
+ : IDENTIFIER
446
+ | IDENTIFIER '=' constant_expression
447
+
448
+ type_qualifier
449
+ : CONST { result = :CONST }
450
+ | VOLATILE { result = :VOLATILE }
451
+
452
+ declarator
453
+ : pointer direct_declarator
454
+ {
455
+ val[1].set_type( val[0] )
456
+ result = val[1]
457
+ }
458
+ | direct_declarator
459
+ | pointer TYPE_NAME # 関数ポインタの typedef が二重定義の場合
460
+ {
461
+ result = Decl.new( val[1].val )
462
+ result.set_type( val[0] )
463
+ }
464
+
465
+ direct_declarator # mikan
466
+ : IDENTIFIER
467
+ { result = Decl.new( val[0].val ) }
468
+ | '(' declarator ')'
469
+ { result = val[1] }
470
+ | direct_declarator '[' constant_expression ']'
471
+ {
472
+ val[0].set_type( CArrayType.new( val[2] ) )
473
+ result = val[0]
474
+ }
475
+ | direct_declarator '[' ']'
476
+ {
477
+ val[0].set_type( CArrayType.new )
478
+ result = val[0]
479
+ }
480
+ | direct_declarator '(' parameter_type_list ')'
481
+ {
482
+ # Generator.warning( "W6001 need 'void' for no parameter" )
483
+ val[0].set_type( CFuncType.new )
484
+ result = val[0]
485
+ }
486
+
487
+ # | direct_declarator '(' identifier_list ')' # これは何のために必要? 060211
488
+ | direct_declarator '(' ')'
489
+ {
490
+ # Generator.warning( "W6002 need 'void' for no parameter" )
491
+ val[0].set_type( CFuncType.new )
492
+ result = val[0]
493
+ }
494
+
495
+ pointer
496
+ : '*'
497
+ { result = CPtrType.new }
498
+ | '*' type_qualifier
499
+ {
500
+ result = CPtrType.new
501
+ result.set_qualifier( val[1] )
502
+ }
503
+ | '*' pointer
504
+ {
505
+ val[1].set_type(CPtrType.new)
506
+ result = val[1]
507
+ }
508
+ | '*' type_qualifier pointer
509
+ {
510
+ ptrtype = CPtrType.new
511
+ ptrtype.set_qualifier( val[1] )
512
+ val[2].set_type( ptrtype )
513
+ result = val[2]
514
+ }
515
+
516
+
517
+ parameter_type_list
518
+ : parameter_list
519
+ | parameter_list ',' '.' '.' '.'
520
+ # mikan 可変長パラメータ, ... の間のスペースが許される(手抜き)
521
+
522
+ parameter_list
523
+ : parameter_declaration
524
+ # { result = ParamList.new( val[0] ) }
525
+ | parameter_list ',' parameter_declaration
526
+ # {
527
+ # val[0].add_param( val[2] )
528
+ # # result = val[0] 不要
529
+ # }
530
+
531
+
532
+ # パラメータ修飾子を追加
533
+ parameter_declaration
534
+ : declaration_specifiers declarator
535
+ # {
536
+ # decl = ParamDecl.new( val[1], val[0], [] )
537
+ # val[1].set_kind( :PARAMETER )
538
+ # result = decl
539
+ # }
540
+
541
+ # 以下はエラーとする
542
+ # | declaration_specifiers # 仮引数なしは、とりあえず扱わない 060210
543
+ # {
544
+ # unless val[0].kind_of?( VoidType ) then
545
+ # Generator.error( "B1001 need parameter name" )
546
+ # end
547
+ # result = nil
548
+ # }
549
+ | declaration_specifiers abstract_declarator # 仮引数なし
550
+ | declaration_specifiers # 仮引数なし
551
+
552
+
553
+ #identifier_list # 060211 不用になった
554
+ # : IDENTIFIER
555
+ # | identifier_list ',' IDENTIFIER
556
+
557
+ type_name
558
+ : type_specifier_qualifier_list
559
+ | type_specifier_qualifier_list abstract_declarator
560
+
561
+ abstract_declarator # mikan
562
+ : pointer
563
+ | direct_abstract_declarator
564
+ | pointer direct_abstract_declarator
565
+
566
+ direct_abstract_declarator
567
+ : '(' abstract_declarator ')'
568
+ | '[' ']'
569
+ | '[' constant_expression ']'
570
+ | direct_abstract_declarator '[' ']'
571
+ | direct_abstract_declarator '[' constant_expression ']'
572
+ | '(' ')'
573
+ {
574
+ Generator.warning( "W6003 need 'void' for no parameter" )
575
+ }
576
+ | '(' parameter_type_list ')'
577
+ | direct_abstract_declarator '(' ')'
578
+ {
579
+ Generator.warning( "W6004 need 'void' for no parameter" )
580
+ }
581
+ | direct_abstract_declarator '(' parameter_type_list ')'
582
+
583
+ # assignment_expressionをconstant_expressionに変更
584
+ initializer # mikan
585
+ : constant_expression
586
+ { result = val[0] }
587
+ | '{' initializer_list '}'
588
+ { result = val[1] }
589
+ | '{' initializer_list ',' '}'
590
+ { result = val[1] }
591
+ | C_EXP '(' STRING_LITERAL ')'
592
+ { result = C_EXP.new( val[2] ) }
593
+
594
+ initializer_list
595
+ : initializer
596
+ {
597
+ result = [ val[0] ]
598
+ }
599
+ | initializer_list ',' initializer
600
+ {
601
+ val[0] << val[2]
602
+ result = val[0]
603
+ }
604
+
605
+
606
+ ########################## ここからはCDL独自 ##########################
607
+
608
+ #トップレベルの構文規則
609
+ C_parser
610
+ :
611
+ | C_parser extension_statement
612
+
613
+ extension_statement
614
+ : statement
615
+ | EXTENSION statement
616
+
617
+ statement
618
+ : typedef
619
+ | func_def
620
+ | enum_specifier ';'
621
+ | struct_specifier ';'
622
+ | declaration
623
+ | ';'
624
+ | error # エラー回復ポイント
625
+
626
+ typedef
627
+ : TYPEDEF type_specifier_qualifier_list declarator_list ';'
628
+ {
629
+ val[2].each{ |i|
630
+ i.set_kind( :TYPEDEF )
631
+ }
632
+ Typedef.new_decl_list( val[1], val[2] )
633
+ # val[1].show_tree 0
634
+ }
635
+
636
+ declarator_list
637
+ : declarator
638
+ { result = [ val[0] ] }
639
+ | declarator_list ',' declarator
640
+ { result << val[2] }
641
+
642
+ func_def
643
+ : declaration_specifiers declarator compoundstatement
644
+
645
+ infunc_statement_list
646
+ :
647
+ | infunc_statement_list infunc_statement
648
+
649
+ infunc_statement
650
+ : declaration
651
+ | ifstatement
652
+ | whilestatement
653
+ | dowhilestatement
654
+ | forstatement
655
+ | switchstatement
656
+ | labelstatement
657
+ | compoundstatement
658
+ | gotostatement
659
+ | expressionstatement
660
+ | asm_statement
661
+ | ';'
662
+
663
+ ifstatement
664
+ : IF '(' expression ')' infunc_statement
665
+ | IF '(' expression ')' infunc_statement ELSE infunc_statement
666
+
667
+ whilestatement
668
+ : WHILE '(' expression ')' infunc_statement
669
+
670
+ dowhilestatement
671
+ : DO infunc_statement WHILE '(' expression ')' ';'
672
+
673
+ forstatement
674
+ : FOR '(' expression ';' expression ';' expression ')' infunc_statement
675
+
676
+ switchstatement
677
+ : SWITCH '(' expression ')' infunc_statment
678
+
679
+ labelstatement
680
+ : IDENTIFIER ':' infunc_statement
681
+ | CASE constant_expression ':' infunc_statement
682
+ | DEFAULT ':' infunc_statement
683
+
684
+ compoundstatement
685
+ : '{' infunc_statement_list '}'
686
+
687
+ gotostatement
688
+ : GOTO IDENTIFIER ';'
689
+ | CONTINUE ';'
690
+ | BREAK ';'
691
+ | RETURN expression ';'
692
+ | RETURN ';'
693
+
694
+ expressionstatement
695
+ : expression ';'
696
+ | unary_expression assignment_operator expression ';'
697
+
698
+ assignment_operator
699
+ : '='
700
+ | '+='
701
+ | '-='
702
+ | '*='
703
+ | '/='
704
+ | '%='
705
+ | '<<='
706
+ | '>>='
707
+ | '&='
708
+ | '|='
709
+ | '^='
710
+
711
+ storage_class
712
+ : __INLINE__
713
+ | INLINE
714
+ | __INLINE
715
+ | CINLINE
716
+ | EXTERN
717
+ | STATIC
718
+ | AUTO
719
+ | REGISTER
720
+
721
+ namespace_identifier
722
+ : IDENTIFIER { result = NamespacePath.new( val[0].val, false ) }
723
+ | '::' IDENTIFIER { result = NamespacePath.new( val[1].val, true ) }
724
+ | namespace_identifier '::' IDENTIFIER
725
+ { result = val[0].append!( val[2].val ) }
726
+
727
+ asm_statement
728
+ : _ASM {
729
+ while true
730
+ # ';' が表れるまで、トークンを読み飛ばす。
731
+ # gcc の構文拡張に対応すべきだが、単純な実装として、';' まで読み飛ばす。
732
+ # トークン単位で読み飛ばしているので、文字列やコメント内の ';' は対象にならない。
733
+ token = next_token
734
+ if token[1].val == ";"
735
+ break
736
+ end
737
+ # p "skip: #{token[1].val}"
738
+ end
739
+ }
740
+
741
+ end
742
+
743
+ ---- inner
744
+
745
+ RESERVED = {
746
+ # keyword
747
+ 'typedef' => :TYPEDEF,
748
+ 'struct' => :STRUCT,
749
+ 'union' => :UNION,
750
+ 'sizeof' => :SIZEOF,
751
+ 'throw' => :THROW,
752
+
753
+ # specifier
754
+ # types
755
+ 'void' => :VOID,
756
+ 'char' => :CHAR,
757
+ 'short' => :SHORT,
758
+
759
+ 'volatile'=> :VOLATILE,
760
+ 'const' => :CONST,
761
+ 'extern' => :EXTERN,
762
+
763
+ 'long' => :LONG,
764
+ 'float' => :FLOAT,
765
+ 'double' => :DOUBLE,
766
+ 'signed' => :SIGNED,
767
+ 'unsigned'=> :UNSIGNED,
768
+
769
+ 'int' => :INT,
770
+ 'enum' => :ENUM,
771
+
772
+ 'if' => :IF,
773
+ 'else' => :ELSE,
774
+ 'while' => :WHILE,
775
+ 'do' => :DO,
776
+ 'for' => :FOR,
777
+ 'case' => :CASE,
778
+ 'default' => :DEFAULT,
779
+ 'goto' => :GOTO,
780
+ 'continue' => :CONTINUE,
781
+ 'break' => :BREAK,
782
+ 'return' => :RETURN,
783
+ '__inline__' => :__INLINE__,
784
+ 'inline' => :INLINE,
785
+ '__inline' => :__INLINE,
786
+ 'Inline' => :CINLINE, # inline starting with Capital letter
787
+ 'static' => :STATIC,
788
+ 'register' => :REGISTER,
789
+ 'auto' => :AUTO,
790
+ '__extension__' => :EXTENSION,
791
+ '__asm__' => :_ASM
792
+
793
+ }
794
+
795
+ @@generator_nest = -1
796
+ @@generator_stack = []
797
+ @@current_locale = []
798
+
799
+ def finalize
800
+
801
+ # mikan Namespace.pop
802
+ Celltype.pop
803
+ Cell.pop
804
+ CompositeCelltype.pop
805
+ Region.pop
806
+
807
+ end
808
+
809
+ def set_plugin( plugin )
810
+ @plugin = plugin
811
+ end
812
+
813
+ def self.get_plugin
814
+ @@generator_stack[@@generator_nest].get_plugin
815
+ end
816
+
817
+ def get_plugin
818
+ @plugin
819
+ end
820
+
821
+ def parse(files)
822
+
823
+ # mikan Namespace.push
824
+ Celltype.push
825
+ Cell.push
826
+ CompositeCelltype.push
827
+ Region.push
828
+
829
+ @@generator_nest += 1
830
+ @@generator_stack[@@generator_nest] = self
831
+ @b_no_type_name = false
832
+
833
+ begin
834
+
835
+ @q = []
836
+ comment = false
837
+ # b_asm = false
838
+
839
+ # 800U, 0xffLL など (整数リテラルに共通の修飾子)
840
+ integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
841
+
842
+ files.each {|file|
843
+ lineno = 1
844
+ begin
845
+ #2.0 IO.foreach(file) {|line|
846
+ TECSIO.foreach(file) {|line|
847
+ col = 1
848
+ line.rstrip!
849
+
850
+ until line.empty?
851
+
852
+ if comment
853
+ case line
854
+ # コメント終了
855
+ when /\A\*\//
856
+ comment = false
857
+ when /\A./
858
+ ;
859
+ end
860
+ else
861
+ case line
862
+ # 空白、プリプロセスディレクティブ
863
+ when /\A\s+/
864
+ ;
865
+ # 識別子
866
+ when /\A[a-zA-Z_]\w*/
867
+ word = $&
868
+ @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
869
+ # 16 進数定数
870
+ when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
871
+ @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
872
+ # 8 進数定数
873
+ when /\A0[0-7]+#{integer_qualifier}/
874
+ @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
875
+ # 浮動小数定数
876
+ when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
877
+ @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
878
+ # 整数定数
879
+ when /\A\d+#{integer_qualifier}/
880
+ # when /\A\d+/
881
+ @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
882
+ # 文字
883
+ when /\A'(?:[^'\\]|\\.)'/
884
+ @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
885
+ # 文字列
886
+ # "#include #include #include \"../systask/logtask.cfg\" 最後の " 忘れ)で無限ループ
887
+ # when /\A"(?:[^"\\]+|\\.)*"/
888
+ when /\A"(?:[^"\\]|\\.)*"/ # これはうまく行くようだ
889
+ @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
890
+ # 行コメント
891
+ when /\A\/\/.*$/
892
+ # 読み飛ばすだけ
893
+ # コメント開始
894
+ when /\A\/\*/
895
+ comment = true
896
+ when /\A>>=/, /\A<<=/, /\A>>/, /\A<</
897
+ @q << [$&, Token.new($&, file, lineno, col)]
898
+ when /\A\+=/, /\A\-=/, /\A\*=/, /\A\/=/, /\A%=/, /\A&=/, /\A\|=/, /\A\^=/
899
+ @q << [$&, Token.new($&, file, lineno, col)]
900
+ when /\A::/, /\A==/, /\A!=/, /\A>=/, /\A<=/, /\A\->/, /\A\+\+/, /\A\-\-/
901
+ @q << [$&, Token.new($&, file, lineno, col)]
902
+ when /\A./
903
+ @q << [$&, Token.new($&, file, lineno, col)]
904
+ else
905
+ raise
906
+ end
907
+ end
908
+
909
+ line = $'
910
+ col += $&.length
911
+ end
912
+
913
+ lineno += 1
914
+ }
915
+
916
+ rescue => evar
917
+ Generator.error( "B1002 while open or reading \'$1\'" , file )
918
+ print_exception( evar )
919
+ end
920
+ }
921
+
922
+ # 終了の印
923
+ @q << nil
924
+
925
+ @yydebug = true
926
+ do_parse
927
+
928
+ ensure
929
+ @@generator_nest -= 1
930
+ end
931
+
932
+ end
933
+
934
+
935
+ def next_token
936
+ token = @q.shift
937
+
938
+ if token then
939
+ @@current_locale[@@generator_nest] = token[1].locale
940
+
941
+ case token[1].val
942
+ when ";", ":", ",", "(", ")", "{", "}"
943
+ set_no_type_name false
944
+ when ".", "->"
945
+ set_no_type_name true
946
+ end
947
+
948
+ # TYPE_NAME トークンへ置き換え
949
+ if @b_no_type_name == false
950
+ if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
951
+ token[0] = :TYPE_NAME
952
+ locale = @@current_locale[@@generator_nest]
953
+ #print( "#{locale[0]}: line #{locale[1]} : #{token[0]} '#{token[1].val}: type_name'\n" )
954
+ end
955
+ end
956
+
957
+ if $debug then # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
958
+ locale = @@current_locale[@@generator_nest]
959
+ if token then
960
+ print( "#{locale[0]}: line #{locale[1]} : #{token[0]} '#{token[1].val}'\n" )
961
+ else
962
+ print( "#{locale[0]}: line #{locale[1]} : EOF\n" )
963
+ end
964
+ end
965
+ end
966
+
967
+ token
968
+ end
969
+
970
+ def on_error(t, v, vstack)
971
+ if v == "$" then
972
+ Generator.error( "B1003 Unexpected EOF" )
973
+ else
974
+ Generator.error( "B1004 syntax error near \'$1\'" , v.val )
975
+ end
976
+
977
+ end
978
+
979
+ def self.current_locale
980
+ @@current_locale[ @@generator_nest ]
981
+ end
982
+
983
+ @@n_error = 0
984
+ @@n_warning = 0
985
+ @@n_info = 0
986
+
987
+ # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
988
+ def self.error( msg )
989
+ @@n_error += 1
990
+ locale = @@current_locale[ @@generator_nest ]
991
+
992
+ if locale then
993
+ Console.puts "error: #{locale[0]}: line #{locale[1]} #{msg}"
994
+ else
995
+ Console.puts "error: #{msg}"
996
+ end
997
+ end
998
+
999
+ # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
1000
+ def self.warning( msg )
1001
+ @@n_warning += 1
1002
+ locale = @@current_locale[ @@generator_nest ]
1003
+ Console.puts "warning: #{locale[0]}: line #{locale[1]} #{msg}"
1004
+ end
1005
+
1006
+ # このメソッドは構文解析、意味解析からのみ呼出し可
1007
+ def self.info( msg )
1008
+ @@n_info += 1
1009
+ locale = @@current_locale[ @@generator_nest ]
1010
+ Console.puts "info: #{locale[0]}: line #{locale[1]} #{msg}"
1011
+ end
1012
+
1013
+ def self.get_n_error
1014
+ @@n_error
1015
+ end
1016
+
1017
+ def self.get_n_warning
1018
+ @@n_warning
1019
+ end
1020
+
1021
+ def self.get_nest
1022
+ @@generator_nest
1023
+ end
1024
+
1025
+ def set_no_type_name b_no_type_name
1026
+ locale = @@current_locale[ @@generator_nest ]
1027
+ #print "b_no_type_name=#{b_no_type_name} #{locale[0]}: line #{locale[1]}\n"
1028
+ @b_no_type_name = b_no_type_name
1029
+ end
1030
+
1031
+ ---- footer
1032
+