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,1087 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2019 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 3046 2019-02-13 13:44:43Z okuma-top $
37
+ #++
38
+
39
+ class TCFLOW_Cparser
40
+ rule
41
+ # トップレベルの構文要素は C_parser
42
+ all: C_parser
43
+
44
+ # Expr
45
+ ########################## 式 ##########################
46
+ # K&Rの文法(プログラミング言語C 第2版 付録)に準拠しているが、C_Parser.y.rb から変形して作っている
47
+
48
+ primary_expression
49
+ : IDENTIFIER { result = val[0].val }
50
+ | INTEGER_CONSTANT { result = nil }
51
+ | FLOATING_CONSTANT { result = nil }
52
+ | OCTAL_CONSTANT { result = nil }
53
+ | HEX_CONSTANT { result = nil }
54
+ | CHARACTER_LITERAL { result = nil }
55
+ | string_literal_list { result = nil }
56
+ # | '(' expression ')' { result = val[1] } # 一度は postfix_expression として扱われている
57
+ # # これを扱わないと、ポインタを使った関数呼び出しが出ない
58
+ | '(' expression ')' { result = nil } # 一度は postfix_expression として扱われている
59
+
60
+ string_literal_list
61
+ : STRING_LITERAL
62
+ | string_literal_list STRING_LITERAL
63
+
64
+
65
+ # 関数呼び出しと後置インクリメント、デクリメント演算子がない
66
+ postfix_expression
67
+ : primary_expression { result = val[0] }
68
+ # | primary_expression '(' argument_list ')'
69
+ | postfix_expression '(' argument_list ')' # postfix_expression 化した.func_ptr_array[]() が可能となる
70
+ {
71
+ ####ここのvalにはセル内部変数は無い
72
+ if val[0]
73
+ if @current_function
74
+ @current_function.ref_func val[0].to_sym
75
+ end
76
+ result = "#{val[0]}()".to_sym
77
+ end
78
+ }
79
+ | postfix_expression '[' expression ']' { result = "#{val[0]}[]" }
80
+ | postfix_expression '.' IDENTIFIER { result = "#{val[0]}.#{val[2]}" }
81
+ | postfix_expression '->' IDENTIFIER { result = "#{val[0]}->#{val[2]}" }
82
+ | postfix_expression '++' { result = val[0] }
83
+ | postfix_expression '--' { result = val[0] }
84
+
85
+
86
+ argument_list
87
+ :
88
+ | assignment_expression
89
+ | argument_list ',' assignment_expression
90
+
91
+
92
+ # 前置インクリメント、デクリメント演算子がない
93
+ unary_expression
94
+ : postfix_expression
95
+ {
96
+ #p val[0] #######ここでglobal変数を持つ
97
+ if val[0]
98
+ if /\(\)$/ =~ val[0].to_s then
99
+ # () で終わっているものは関数として報告済み
100
+ else
101
+ if @current_function
102
+ @current_function.ref_var val[0].to_sym ###########
103
+ result = val[0].to_sym
104
+ #p result ####global_var
105
+ end
106
+ end
107
+ end
108
+ }
109
+ | '++' unary_expression { result = nil }
110
+ | '--' unary_expression { result = nil }
111
+ | unary_operator cast_expression { result = val[1] }
112
+ | SIZEOF unary_expression { result = nil }
113
+ | SIZEOF '(' type_name ')' { result = nil }
114
+
115
+ unary_operator
116
+ : '&'
117
+ | '*'
118
+ | '+'
119
+ | '-'
120
+ | '~'
121
+ | '!'
122
+
123
+ cast_expression
124
+ : unary_expression
125
+ | '(' type_name ')' cast_expression { result = val[3] }
126
+
127
+ multiplicative_expression
128
+ : cast_expression
129
+ | multiplicative_expression '*' cast_expression
130
+ | multiplicative_expression '/' cast_expression
131
+ | multiplicative_expression '%' cast_expression
132
+
133
+
134
+ additive_expression
135
+ : multiplicative_expression
136
+ | additive_expression '+' multiplicative_expression
137
+ | additive_expression '-' multiplicative_expression
138
+
139
+ shift_expression
140
+ : additive_expression
141
+ | shift_expression '<<' additive_expression
142
+ | shift_expression '>>' additive_expression
143
+
144
+ relational_expression
145
+ : shift_expression
146
+ | relational_expression '<' shift_expression
147
+ | relational_expression '>' shift_expression
148
+ | relational_expression '<=' shift_expression
149
+ | relational_expression '>=' shift_expression
150
+
151
+ equality_expression
152
+ : relational_expression
153
+ | equality_expression '==' relational_expression
154
+ | equality_expression '!=' relational_expression
155
+
156
+
157
+ and_expression
158
+ : equality_expression
159
+ | and_expression '&' equality_expression
160
+
161
+ exclusive_or_expression
162
+ : and_expression
163
+ | exclusive_or_expression '^' and_expression
164
+
165
+
166
+ inclusive_or_expression
167
+ : exclusive_or_expression
168
+ | inclusive_or_expression '|' exclusive_or_expression
169
+
170
+
171
+ logical_and_expression
172
+ : inclusive_or_expression
173
+ | logical_and_expression '&&' inclusive_or_expression
174
+
175
+ logical_or_expression
176
+ : logical_and_expression
177
+ | logical_or_expression '||' logical_and_expression
178
+
179
+ conditional_expression
180
+ : logical_or_expression
181
+ | logical_or_expression '?' expression ':' conditional_expression
182
+
183
+
184
+ # コンマ演算子が使えない
185
+ expression
186
+ : assignment_expression
187
+ | expression ',' assignment_expression
188
+
189
+ constant_expression
190
+ : conditional_expression
191
+
192
+
193
+
194
+ # Types
195
+ ########################## 宣言 ##########################
196
+
197
+ ##!
198
+ #declaration_list # declaration_list は compoundstatement からしか参照されないと仮定
199
+ # : declaration
200
+ # {
201
+ # if @current_function && val[0]
202
+ # val[0].each { |v|
203
+ # @current_function.new_local v
204
+ # }
205
+ # end
206
+ # }
207
+ # | declaration_list declaration
208
+ # {
209
+ # if @current_function && val[1]
210
+ # val[1].each { |v|
211
+ # @current_function.new_local v
212
+ # }
213
+ # end
214
+ # }
215
+ # | typedef # MS 拡張文法 関数内での typedef
216
+ # | declaration_list typedef
217
+
218
+ declaration
219
+ : declaration_specifiers init_declarator_list ';' { result = val[1] }
220
+ | declaration_specifiers ';' { result = nil }
221
+
222
+ declaration_specifiers
223
+ : storage_class
224
+ | type_specifier
225
+ | type_qualifier
226
+ | storage_class declaration_specifiers
227
+ | type_specifier declaration_specifiers
228
+ | type_qualifier declaration_specifiers
229
+
230
+ init_declarator_list
231
+ : init_declarator { result = [ val[0] ] }
232
+ | init_declarator_list ',' init_declarator
233
+ {
234
+ result << val[2]
235
+ }
236
+
237
+ init_declarator
238
+ : declarator { result = val[0] }
239
+ | declarator '=' initializer { result = val[0] }
240
+
241
+ type_specifier
242
+ : VOID { set_no_type_name true }
243
+ | FLOAT { set_no_type_name true }
244
+ | DOUBLE { set_no_type_name true }
245
+ | struct_or_union_specifier
246
+ | enum_specifier { set_no_type_name true }
247
+ | TYPE_NAME { set_no_type_name true }
248
+ | CHAR { set_no_type_name true }
249
+ | SHORT { set_no_type_name true }
250
+ | INT { set_no_type_name true }
251
+ | LONG { set_no_type_name true }
252
+ | SIGNED { set_no_type_name true }
253
+ | UNSIGNED { set_no_type_name true }
254
+ | __INT8 { set_no_type_name true }
255
+ | __INT16 { set_no_type_name true }
256
+ | __INT32 { set_no_type_name true }
257
+ | __INT64 { set_no_type_name true }
258
+ | __BOOL { set_no_type_name true }
259
+
260
+ struct_or_union_specifier
261
+ : struct_or_union
262
+ struct_tag '{' struct_declaration_list '}'
263
+ | struct_or_union '{' struct_declaration_list '}'
264
+ | struct_or_union '{' '}' # add 19.01.06 empty struct
265
+ | struct_or_union struct_tag '{' '}' # add 19.01.06 empty struct
266
+ | struct_or_union struct_tag
267
+
268
+ struct_or_union
269
+ : STRUCT { set_no_type_name true }
270
+ | UNION { set_no_type_name true }
271
+
272
+ struct_declaration_list
273
+ : struct_declaration
274
+ | struct_declaration_list struct_declaration
275
+
276
+ struct_tag:
277
+ IDENTIFIER
278
+
279
+ # ポインタ修飾子を追加
280
+ struct_declaration
281
+ : type_specifier_qualifier_list struct_declarator_list ';'
282
+ | type_specifier_qualifier_list ';' ##!
283
+
284
+
285
+ # K&Rのspecifier_qualifier_listと同じ
286
+ # 名前がまぎらわしかったのでtype_を付けた
287
+ type_specifier_qualifier_list
288
+ : type_specifier
289
+ | type_specifier type_specifier_qualifier_list
290
+ | type_qualifier
291
+ | type_qualifier type_specifier_qualifier_list
292
+
293
+ struct_declarator_list
294
+ : struct_declarator
295
+ | struct_declarator_list ',' struct_declarator
296
+
297
+ struct_declarator
298
+ : declarator
299
+ | declarator ':' constant_expression # bit フィールド
300
+
301
+ enum_specifier
302
+ : enum_type '{' enumerator_list '}'
303
+ | enum_type IDENTIFIER '{' enumerator_list '}'
304
+ | enum_type IDENTIFIER
305
+
306
+ enum_type
307
+ : ENUM
308
+
309
+ enumerator_list
310
+ : enumerator
311
+ | enumerator_list ',' enumerator
312
+ | enumerator_list ','
313
+
314
+ enumerator
315
+ : IDENTIFIER
316
+ | IDENTIFIER '=' constant_expression
317
+
318
+ type_qualifier
319
+ : CONST
320
+ | VOLATILE
321
+
322
+ declarator
323
+ : pointer direct_declarator { result = val[1] }
324
+ | direct_declarator { result = val[0] }
325
+
326
+ direct_declarator
327
+ : IDENTIFIER { result = val[0].val }
328
+ | '(' declarator ')' { result = val[1] }
329
+ | direct_declarator '[' constant_expression ']' { result = val[0] }
330
+ | direct_declarator '[' ']' { result = val[0] }
331
+ | direct_declarator '(' parameter_type_list ')' { result = val[0] }
332
+ | direct_declarator '(' identifier_list ')' { result = val[0] } # これは古い関数定義用
333
+ | direct_declarator '(' ')' { result = val[0] }
334
+
335
+ pointer
336
+ : pointer0
337
+ | call_convention pointer0 # 関数ポインタに __cdecl 等が付けられているケース
338
+ pointer0
339
+ : '*'
340
+ | '*' type_qualifier
341
+ | '*' pointer
342
+ | '*' type_qualifier pointer
343
+ | call_convention
344
+
345
+ call_convention
346
+ : __CDECL
347
+ | __STDCALL
348
+ | __FASTCALL
349
+
350
+ parameter_type_list
351
+ : parameter_list { TCFlow::Function.param_list val[0] }
352
+ | parameter_list '...' { TCFlow::Function.param_list val[0] }
353
+ | parameter_list ',' '...' { TCFlow::Function.param_list val[0] }
354
+
355
+ parameter_list
356
+ : parameter_declaration
357
+ {
358
+ if val[0]
359
+ result = [val[0]]
360
+ else
361
+ result = nil
362
+ end
363
+ }
364
+ | parameter_list ',' parameter_declaration
365
+ {
366
+ if val[0] && val[2]
367
+ result << val[2]
368
+ elsif val[2]
369
+ result = [ val[2] ] # これは文法エラー時しかありえない
370
+ end
371
+ }
372
+
373
+
374
+ # パラメータ修飾子を追加
375
+ parameter_declaration
376
+ : declaration_specifiers declarator
377
+ { result = val[1] }
378
+ | declaration_specifiers abstract_declarator # 仮引数なし
379
+ { result = nil }
380
+ | declaration_specifiers # 仮引数なし
381
+ { result = nil }
382
+
383
+
384
+ identifier_list # 060211 不用になった
385
+ : IDENTIFIER
386
+ | identifier_list ',' IDENTIFIER
387
+
388
+ type_name
389
+ : type_specifier_qualifier_list
390
+ | type_specifier_qualifier_list abstract_declarator
391
+
392
+ abstract_declarator
393
+ : pointer
394
+ | direct_abstract_declarator
395
+ | pointer direct_abstract_declarator
396
+
397
+ direct_abstract_declarator
398
+ : '(' abstract_declarator ')'
399
+ | '[' ']'
400
+ | '[' constant_expression ']'
401
+ | direct_abstract_declarator '[' ']'
402
+ | direct_abstract_declarator '[' constant_expression ']'
403
+ | '(' ')'
404
+ | direct_abstract_declarator '(' ')'
405
+ | direct_abstract_declarator '(' parameter_type_list ')'
406
+
407
+ # assignment_expressionをconstant_expressionに変更
408
+ initializer # mikan
409
+ : constant_expression
410
+ | '{' initializer_list '}'
411
+ | '{' initializer_list ',' '}'
412
+
413
+ initializer_list
414
+ : initializer
415
+ | initializer_list ',' initializer
416
+
417
+
418
+ ########################## ここからはCDL独自 ##########################
419
+
420
+ #トップレベルの構文規則
421
+ C_parser
422
+ : C_parser statement
423
+ |
424
+
425
+
426
+
427
+ statement
428
+ : typedef
429
+ | func_def
430
+ | declaration
431
+ | declarator ';' # 戻り値型指定のない関数を想定
432
+ | ';'
433
+ | error # エラー回復ポイント
434
+
435
+
436
+ typedef
437
+ : TYPEDEF type_specifier_qualifier_list declarator_list ';'
438
+ {
439
+ val[2].each{ |t|
440
+ # print( "typdef: #{t.to_s}\n" )
441
+ @type_name_list[ t.to_sym ] = t
442
+ }
443
+ }
444
+ | TYPEDEF type_specifier_qualifier_list ';' { error( "maybe typedef duplicate, ignored" ) }
445
+ # 二重定義の場合 無視
446
+
447
+
448
+ func_def
449
+ : declaration_specifiers declarator
450
+ {
451
+ @current_function = TCFlow::Function.new @@current_locale
452
+ }
453
+ kr_param_list compoundstatement
454
+ {
455
+ @current_function.set_name val[1]
456
+ #p val[1]
457
+ @current_function = nil
458
+ }
459
+ | declarator # 戻り値の型指定省略
460
+ {
461
+ @current_function = TCFlow::Function.new @@current_locale
462
+ }
463
+ kr_param_list compoundstatement
464
+ {
465
+ @current_function.set_name val[0]
466
+ #p val[0]
467
+ @current_function = nil
468
+ }
469
+
470
+ kr_param # 旧文法の引数
471
+ : type_specifier_qualifier_list declarator_list ';'
472
+ kr_param_list:
473
+ : kr_param_list kr_param
474
+ |
475
+
476
+ declarator_list
477
+ : declarator { result = [val[0]]}
478
+ | declarator_list ',' declarator { result << val[2] }
479
+
480
+ infunc_statement_list
481
+ : infunc_statement
482
+ | infunc_statement_list infunc_statement
483
+
484
+ infunc_statement
485
+ : ifstatement
486
+ | whilestatement
487
+ | dowhilestatement
488
+ | forstatement
489
+ | switchstatement
490
+ | labelstatement
491
+ | compoundstatement
492
+ | gotostatement
493
+ | expressionstatement
494
+ | declaration ##!
495
+ | asm_statement
496
+ | ';' # 空文
497
+
498
+ ifstatement
499
+ : IF '(' expression ')' infunc_statement
500
+ | IF '(' expression ')' infunc_statement ELSE infunc_statement
501
+
502
+ whilestatement
503
+ : WHILE '(' expression ')' infunc_statement
504
+
505
+ dowhilestatement
506
+ : DO infunc_statement WHILE '(' expression ')' ';'
507
+
508
+ forstatement
509
+ : FOR '(' expression_or_empty ';' expression_or_empty ';' expression_or_empty ')' infunc_statement
510
+ | FOR '(' declaration_specifiers init_declarator_list ';' expression_or_empty ';' expression_or_empty ')' infunc_statement
511
+
512
+ expression_or_empty
513
+ : expression
514
+ |
515
+
516
+ switchstatement
517
+ : SWITCH '(' expression ')' infunc_statement
518
+
519
+ labelstatement
520
+ : IDENTIFIER ':' infunc_statement
521
+ | CASE constant_expression ':' infunc_statement
522
+ | DEFAULT ':' infunc_statement
523
+
524
+ #追加部ここから ##!
525
+ #compoundstatement ::= '{' (declaration_list | infunc_statement_list)* '}'
526
+ compoundstatement
527
+ # : '{' declaration_list infunc_statement_list '}'
528
+ # | '{' declaration_list '}'
529
+ : '{' infunc_statement_list '}'
530
+ | '{' '}'
531
+
532
+ #追加部ここまで
533
+
534
+ gotostatement
535
+ : GOTO IDENTIFIER ';'
536
+ | CONTINUE ';'
537
+ | BREAK ';'
538
+ | RETURN ';'
539
+ | RETURN expression ';'
540
+
541
+ expressionstatement
542
+ : expression ';'
543
+
544
+ assignment_expression
545
+ : conditional_expression
546
+ | unary_expression assignment_operator assignment_expression
547
+ {
548
+ #p val[0] ###書き込みされる変数群
549
+ if val[0]
550
+ if /\(\)$/ =~ val[0].to_s then
551
+ # () で終わっているものは関数, 通常来ないはず
552
+ else
553
+ if @current_function
554
+ ####p @current_function #### global_var選別後
555
+ @current_function.ref_var( val[0].to_sym, true ) ##### R/Wカウント
556
+ result = val[0].to_sym
557
+ end
558
+ end
559
+ end
560
+ }
561
+
562
+ assignment_operator
563
+ : '='
564
+ | '+='
565
+ | '-='
566
+ | '*='
567
+ | '/='
568
+ | '%='
569
+ | '<<='
570
+ | '>>='
571
+ | '&='
572
+ | '|='
573
+ | '^='
574
+
575
+ storage_class
576
+ : __INLINE__
577
+ | __FORCEINLINE
578
+ | INLINE
579
+ | EXTERN
580
+ | STATIC
581
+ | AUTO
582
+ | REGISTER
583
+ | __DECLSPEC '(' IDENTIFIER ')'
584
+
585
+ asm_statement
586
+ : _ASM {
587
+ while true
588
+ # ';' が表れるまで、トークンを読み飛ばす。
589
+ # gcc の構文拡張に対応すべきだが、単純な実装として、';' まで読み飛ばす。
590
+ # トークン単位で読み飛ばしているので、文字列やコメント内の ';' は対象にならない。
591
+ token = next_token
592
+ if token[1].val == ";"
593
+ break
594
+ end
595
+ # p "skip: #{token[1].val}"
596
+ end
597
+ }
598
+
599
+ end
600
+
601
+ ---- inner
602
+
603
+ RESERVED = {
604
+ # keword
605
+ 'typedef' => :TYPEDEF,
606
+ 'struct' => :STRUCT,
607
+ 'union' => :UNION,
608
+
609
+ # specifier
610
+ # types
611
+ 'void' => :VOID,
612
+ 'char' => :CHAR,
613
+ 'short' => :SHORT,
614
+
615
+ 'volatile'=> :VOLATILE,
616
+ 'const' => :CONST,
617
+ 'extern' => :EXTERN,
618
+
619
+ 'long' => :LONG,
620
+ 'float' => :FLOAT,
621
+ 'double' => :DOUBLE,
622
+ 'signed' => :SIGNED,
623
+ 'unsigned'=> :UNSIGNED,
624
+
625
+ 'int' => :INT,
626
+ 'enum' => :ENUM,
627
+ '__int8' => :__INT8,
628
+ '__int16' => :__INT16,
629
+ '__int32' => :__INT32,
630
+ '__int64' => :__INT64,
631
+ '__bool' => :__BOOL,
632
+
633
+ 'return' => :RETURN,
634
+ 'if' => :IF,
635
+ 'else' => :ELSE,
636
+ 'while' => :WHILE,
637
+ 'do' => :DO,
638
+ 'for' => :FOR,
639
+ 'case' => :CASE,
640
+ 'default' => :DEFAULT,
641
+ 'goto' => :GOTO,
642
+ 'continue' => :CONTINUE,
643
+ 'break' => :BREAK,
644
+ 'static' => :STATIC,
645
+ 'register' => :REGISTER,
646
+ 'auto' => :AUTO,
647
+ 'switch' => :SWITCH,
648
+ 'sizeof' => :SIZEOF,
649
+
650
+ '__inline__' => :__INLINE__,
651
+ '__forceinline' => :__FORCEINLINE,
652
+ 'inline' => :INLINE,
653
+ '__inline' => :INLINE,
654
+
655
+ '__declspec' => :__DECLSPEC,
656
+ '__cdecl' => :__CDECL,
657
+ '__stdcall' => :__STDCALL,
658
+ '__fastcall' => :__FASTCALL,
659
+
660
+ '__extension__' => :EXTENSION,
661
+ '__asm__' => :_ASM,
662
+
663
+ }
664
+
665
+ @@current_locale = []
666
+
667
+ def finalize
668
+
669
+
670
+ end
671
+
672
+ # GCC extension
673
+ @@header_lines =<<EOT
674
+ #ifndef TECS_NO_GCC_EXTENSION_SUPPORT
675
+
676
+ /*
677
+ * these extension can be eliminated also by spefcifying option
678
+ * --no-gcc-extension-support for tecsgen.
679
+ */
680
+ #ifdef __GNUC__
681
+
682
+ #ifndef __attribute__
683
+ #define __attribute__(x)
684
+ #endif
685
+
686
+ #ifndef __extension__
687
+ #define __extension__
688
+ #endif
689
+
690
+ #ifndef __builtin_va_list
691
+ typedef char *__builtin_va_list;
692
+ // #define __builtin_va_list va_list
693
+ #endif
694
+
695
+ #ifndef restrict
696
+ #define restrict
697
+ #define __restrict
698
+ #endif
699
+
700
+ #define __asm__(x)
701
+
702
+ #define __builtin_offsetof( x, y ) (1)
703
+
704
+ #endif /* ifdef __GNUC__ */
705
+ #endif /* TECS_NO_GCC_EXTENSION_SUPPORT */
706
+ EOT
707
+
708
+
709
+ #===
710
+ #files::String ファイル名またはpipe コマンド
711
+
712
+ ##parse
713
+ def parse(files, cpp_cmd)
714
+
715
+ #インスタンス変数
716
+ @current_function = nil
717
+ @type_name_list = {}
718
+ @b_no_type_name = false
719
+ @q = [ :EOF ]
720
+ @processing_file=nil
721
+
722
+ # integer_qualifier = "([Uu][Ll]?[Ll]?|[Ll][Ll]?[Uu]?)?" #これだとうまくいく(厳密でない)
723
+ # integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll][Uu]|[Ll][Uu]|[Ll][Ll]|[Ll])?" #これもうまくいく(厳密でない)
724
+ integer_qualifier = "([Uu](LL|ll|L|l)|(LL|ll|L|l)[Uu]?|[Uu])?"
725
+
726
+ #例外補足1
727
+ begin
728
+ comment = false
729
+
730
+ ## 各ファイルに対する処理
731
+ file2_name = ""
732
+ files.each {|file|
733
+
734
+ if cpp_cmd then
735
+ file2_name = "#{$gen_dir}/tmp_#{file.sub(/.*\//,"")}"
736
+ File.open( file2_name, "w" ){
737
+ |f|
738
+ lines = IO.readlines( file )
739
+ f.puts( @@header_lines )
740
+ f.puts lines
741
+ }
742
+ end
743
+ @processing_file=file
744
+ STDERR.print "reading #{file}\n" #ファイルのパスを表示
745
+ lineno = 0
746
+
747
+ #例外補足2
748
+ begin #実行する処理
749
+ io = nil
750
+ if cpp_cmd
751
+ io = IO.popen( cpp_cmd + " " + file2_name, "r" ) #サブプロセスの標準入出力との間にパイプラインを確立
752
+ file3_name = "#{file2_name}_2.c"
753
+ file3 = File.open( file3_name, "w" )
754
+ else
755
+ io = File.open( file, "r" )
756
+ end
757
+
758
+ ## ioに対する各処理
759
+ io.each {|line|
760
+ lineno += 1
761
+ if cpp_cmd then
762
+ file3.puts line
763
+ end
764
+ col = 1
765
+ line.rstrip! #末尾の空白文字を除去
766
+
767
+ until line.empty? ## untilの処理内容
768
+
769
+ if comment
770
+ case line
771
+ # コメント終了
772
+ when /\A\*\//
773
+ comment = false
774
+ when /\A./
775
+ ;
776
+ end
777
+ # elsif asm_state != :NONE
778
+ # if asm_state == :WAIT_NEXT # __asm が来た直後
779
+ # case line
780
+ # # コメント開始
781
+ # when /\A\s*\{/
782
+ # asm_state = :WAIT_CB # 閉じ括弧待ち
783
+ # when /\As*/
784
+ # asm_state = :WAIT_SC # セミコロン待ち
785
+ # end
786
+ # elsif asm_state == :WAIT_CB # 閉じ括弧待ち
787
+ # case line
788
+ # when /\A.*\}/ # 本当は最短一致にすべきだろう
789
+ # # asm は特種で、通常ブロックが後続するケースはないので
790
+ # asm_state = :NONE
791
+ # when /\A.*/
792
+ # # asm_state = :WAIT_CB # 閉じ括弧待ちの継続
793
+ # end
794
+ # elsif asm_state == :WAIT_SC # セミコロン待ち
795
+ # case line
796
+ # when /\A.*;/
797
+ # asm_state = :NONE # 本当は最短一致にすべきだろう
798
+ # when /\A.*/
799
+ # # asm_state = :WAIT_SC # 閉じ括弧待ちの継続
800
+ # end
801
+ # end
802
+ else
803
+ case line
804
+ # 空白、プリプロセスディレクティブ
805
+ # when /\A#line\s+(\d+)\s+\"(.*)\"\.*$/ ####ここで行番号がうまく拾えない \d
806
+ when /\A#\s+(\d+)\s+\"(.*)\".*$/ #元のセルタイプコード中での行番号表示
807
+ # p "#{$1} #{$2}"
808
+ # lineno = __LINE__
809
+ lineno = $1.to_i - 1 # lineno
810
+ file = $2
811
+ # # プリプロセッサディレクティブ
812
+ when /\A#.*$/
813
+ # 読み飛ばすだけ
814
+ when /\A\s+/
815
+ ;
816
+ # # __asm
817
+ # when /\A__asm/, /\A_asm/
818
+ # asm_state = :WAIT_NEXT
819
+ # 識別子
820
+ when /\A[a-zA-Z_]\w*/
821
+ word = $&
822
+ @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
823
+
824
+ # 浮動小数定数
825
+ when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?([Ff]|[Ll])?/
826
+ @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
827
+ when /\A\.[0-9]+([Ee][+-]?[0-9]+)?([Ff]|[Ll])?/ # . で始まる
828
+ @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
829
+ when /\A[0-9]+[Ee][+-]?[0-9]+([Ff]|[Ll])?/ # . 以下がない
830
+ @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
831
+
832
+ # 16 進数定数 ##! 大文字・小文字区別なし
833
+ when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
834
+ @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
835
+ #when /\A0[Xx][0-9A-Fa-f]+(ULL?|ull?)/, /\A0[Xx][0-9A-Fa-f]+([UL]|[ul])/, /\A0[Xx][0-9A-Fa-f]+/
836
+ # 8 進数定数 ##! 大文字・小文字区別なし
837
+ when /\A0[0-7]+#{integer_qualifier}/
838
+ # when /\A0[0-7]+(UL|ul)/, /\A0[0-7]+([UL]|[ul])/, /\A0[0-7]+/
839
+ @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
840
+ # 整数定数 ##! 大文字・小文字区別なし
841
+ when /\A\d+#{integer_qualifier}/
842
+ # when /\A\d+(UL|ul)/, /\A\d+([UL]|[ul])/, /\A\d+/
843
+ @q << [:INTEGER_CONSTANT, Token.new($&, file, lineno, col)]
844
+ # 文字
845
+ # when /\A'(?:[^'\\]|\\.)'/
846
+ when /\A'(?:[^'\\]|\\.){1,4}'/ # 1〜4文字まで可能とする
847
+ @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
848
+ # 文字列
849
+ # "#include #include #include \"../systask/logtask.cfg\" # 最後の " 忘れ)で無限ループ
850
+ # when /\A"(?:[^"\\]+|\\.)*"/
851
+ when /\A"(?:[^"\\]|\\.)*"/ # これはうまく行くようだ
852
+ @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
853
+ # 行コメント
854
+ when /\A\/\/.*$/
855
+ # # プリプロセッサディレクティブ(ファイル名)
856
+ when /\A\/\*/
857
+ comment = true
858
+ when /\A>>=/, /\A<<=/, /\A>>/, /\A<</, /\A\|\|/, /\A\&\&/, /\A\-\>/, /\A\+\+/, /\A\-\-/
859
+ @q << [$&, Token.new($&, file, lineno, col)]
860
+ when /\A\+=/, /\A\-=/, /\A\*=/, /\A\/=/, /\A%=/, /\A&=/, /\A\|=/, /\A\^=/, /\A\.\.\./
861
+ @q << [$&, Token.new($&, file, lineno, col)]
862
+ when /\A\::/, /\A==/, /\A!=/, /\A>=/, /\A<=/
863
+ @q << [$&, Token.new($&, file, lineno, col)]
864
+ when /\A./
865
+ @q << [$&, Token.new($&, file, lineno, col)]
866
+ else
867
+ raise
868
+ end
869
+ end
870
+
871
+ line = $'
872
+ col += $&.length
873
+ end ## untilの処理内容
874
+
875
+ } ## ioに対する各処理
876
+ @q << :EOF
877
+ rescue => evar #例外が発生した時の処理、例外の内容を受け取る→例外補足
878
+ error( evar )
879
+ # p $@
880
+ ensure #例外の発生有無にかかわらず最後に必ず実行する処理
881
+ if io
882
+ io.close
883
+ end
884
+ end
885
+ }## 各ファイルに対する処理
886
+
887
+ # 終了の印
888
+ @q << nil
889
+
890
+ @yydebug = true
891
+ do_parse
892
+
893
+ end
894
+ end ##parse
895
+
896
+ ##next_token
897
+ def next_token
898
+
899
+ token = @q.shift
900
+ while token == :EOF # ファイルが空のとき :EOF が連続する
901
+ @type_name_list = {}
902
+ token = @q.shift
903
+ if token.instance_of? Array
904
+ #STDERR.print "parsing #{@processing_file}\n" #ファイルのパスを表示
905
+ end
906
+ end
907
+
908
+ if token then
909
+ @@current_locale = token[1].locale
910
+
911
+ case token[1].val
912
+ when ";", ":", ",", "(", ")", "{", "}"
913
+ set_no_type_name false
914
+ when ".", "->"
915
+ set_no_type_name true
916
+ end
917
+
918
+
919
+ # TYPE_NAME トークンへ置き換え
920
+ # print( "#{token[0]} : #{token[1]}\n" ) #トークン表示
921
+ if @b_no_type_name == false
922
+ if token[0] == :IDENTIFIER #形名、関数名、変数名
923
+ #p token[1].val ###ここに変数名は無い
924
+ #p @current_function ###ここの@global_varに変数格納済み(R/Wカウント済み)
925
+ if @current_function && @current_function.is_local_var?( token[1].val )
926
+ # local 変数または引数
927
+ else
928
+ if @type_name_list[ token[1].val ] then
929
+ #print ("#{token[1]}\n")
930
+ token[0] = :TYPE_NAME
931
+ end
932
+ end
933
+ end
934
+ end
935
+
936
+ #$debug = true ####
937
+ if $b_print_all_token then # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
938
+ locale = @@current_locale
939
+ if token then
940
+ print( "#{locale[0]}: line #{locale[1]} : #{token[0]} : '#{token[1].val}'\n" )
941
+ else
942
+ print( "#{locale[0]}: line #{locale[1]} : EOF\n" )
943
+ end
944
+ end
945
+ end
946
+
947
+ token
948
+ end ##next_token
949
+
950
+ ##on_error
951
+ def on_error(t, v, vstack)
952
+ if v == "$" then
953
+ error( "Unexpected EOF" )
954
+ else
955
+ error( "syntax error near '#{v.val}'" )
956
+ end
957
+
958
+ end ##on_error
959
+
960
+ def self.current_locale
961
+ @@current_locale
962
+ end
963
+
964
+ @@n_error = 0
965
+ @@n_warning = 0
966
+
967
+ ##error
968
+ # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
969
+ def error( msg )
970
+ @@n_error += 1
971
+ locale = @@current_locale
972
+
973
+ if locale then
974
+ puts "error: #{locale[0]}: line #{locale[1]} #{msg}"
975
+ if locale[0] != nil && locale[0] != @processing_file
976
+ puts " #{locale[0]} is included from #{@processing_file}"
977
+ end
978
+ else
979
+ puts "error: #{msg}"
980
+ end
981
+ end ##error
982
+
983
+ # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
984
+ def warning( msg )
985
+ @@n_warning += 1
986
+ locale = @@current_locale
987
+ puts "warning: #{locale[0]}: line #{locale[1]} #{msg}"
988
+ end
989
+
990
+ def self.get_n_error
991
+ @@n_error
992
+ end
993
+
994
+ def self.get_n_warning
995
+ @@n_warning
996
+ end
997
+
998
+ def set_no_type_name b_no_type_name
999
+ # print "b_no_type_name=#{b_no_type_name}\n"
1000
+ @b_no_type_name = b_no_type_name
1001
+ end
1002
+
1003
+ ---- footer
1004
+
1005
+
1006
+
1007
+ class Token
1008
+ # @parameter
1009
+ # SIZE_IS, STRING, COUNT_IS : expression
1010
+ # SEND, RECEIVE : string ( IDENTIFIER )
1011
+
1012
+ attr_accessor :val, :file, :lineno, :col
1013
+
1014
+ def initialize(val, file, lineno, col)
1015
+ @val = val
1016
+ @file = file
1017
+ @lineno = lineno
1018
+ @col = col
1019
+
1020
+ end
1021
+
1022
+ def to_s
1023
+ @val.to_s
1024
+ end
1025
+
1026
+ def to_sym
1027
+ @val.to_sym
1028
+ end
1029
+
1030
+ def get_name
1031
+ @val
1032
+ end
1033
+
1034
+ def set_parameter( parameter )
1035
+ @parameter = parameter
1036
+ end
1037
+
1038
+ def scan(*arg, &block)
1039
+ val.to_s.scan(*arg, &block)
1040
+ end
1041
+
1042
+ def to_i
1043
+ if @val.is_a? Integer
1044
+ @val.to_i
1045
+ else
1046
+ raise TypeError
1047
+ end
1048
+ end
1049
+
1050
+ def locale
1051
+ [@file, @lineno, @col]
1052
+ end
1053
+
1054
+ def eql?(other)
1055
+ if other.is_a? Symbol
1056
+ @val == other
1057
+ elsif other.is_a? Token
1058
+ @val == other.val
1059
+ elsif other.is_a? String
1060
+ @val.to_s == other
1061
+ else
1062
+ raise ArgumentError
1063
+ end
1064
+ end
1065
+
1066
+ alias == eql?
1067
+
1068
+ def <=>(other)
1069
+ if other.class == Token
1070
+ if @val.is_a? Integer
1071
+ @val <=> other.val
1072
+ elsif @val.is_a? Symbol
1073
+ @val.to_s <=> other.val.to_s
1074
+ else
1075
+ raise ArgumentError
1076
+ end
1077
+ else
1078
+ raise ArgumentError
1079
+ end
1080
+ end
1081
+
1082
+ def show_tree( indent )
1083
+ indent.times { print " " }
1084
+ print "#{@val}\n"
1085
+ end
1086
+
1087
+ end # class C_Parser