adlint 1.0.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 (465) hide show
  1. data/AUTHORS +27 -0
  2. data/COPYING +674 -0
  3. data/ChangeLog +820 -0
  4. data/INSTALL +78 -0
  5. data/MANIFEST +464 -0
  6. data/NEWS +38 -0
  7. data/README +74 -0
  8. data/Rakefile +167 -0
  9. data/TODO +29 -0
  10. data/bin/adlint +141 -0
  11. data/bin/adlint_chk +129 -0
  12. data/bin/adlint_cma +122 -0
  13. data/bin/adlint_sma +129 -0
  14. data/bin/adlintize +286 -0
  15. data/etc/conf.d/fallback/cinit.erb +11 -0
  16. data/etc/conf.d/fallback/traits.erb +216 -0
  17. data/etc/conf.d/i686-cygwin/cinit-gcc_4.3.4.erb +149 -0
  18. data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +227 -0
  19. data/etc/conf.d/i686-devkit/cinit-gcc_4.5.2.erb +224 -0
  20. data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +226 -0
  21. data/etc/conf.d/i686-linux/cinit-gcc_4.5.1.erb +219 -0
  22. data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +224 -0
  23. data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +234 -0
  24. data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +226 -0
  25. data/etc/conf.d/noarch/GNUmakefile.erb +119 -0
  26. data/etc/conf.d/noarch/adlint_all_bat.erb +9 -0
  27. data/etc/conf.d/noarch/adlint_all_sh.erb +10 -0
  28. data/etc/conf.d/noarch/pinit.erb +11 -0
  29. data/etc/mesg.d/en_US/messages.yml +784 -0
  30. data/etc/mesg.d/ja_JP/messages.yml +784 -0
  31. data/lib/adlint/analyzer.rb +294 -0
  32. data/lib/adlint/c/branch.rb +251 -0
  33. data/lib/adlint/c/builtin.rb +92 -0
  34. data/lib/adlint/c/code.rb +490 -0
  35. data/lib/adlint/c/const.rb +465 -0
  36. data/lib/adlint/c/conv.rb +212 -0
  37. data/lib/adlint/c/ctrlexpr.rb +949 -0
  38. data/lib/adlint/c/domain.rb +7499 -0
  39. data/lib/adlint/c/environ.rb +133 -0
  40. data/lib/adlint/c/expr.rb +1725 -0
  41. data/lib/adlint/c/format.rb +3209 -0
  42. data/lib/adlint/c/interp.rb +1740 -0
  43. data/lib/adlint/c/lexer.rb +241 -0
  44. data/lib/adlint/c/mediator.rb +313 -0
  45. data/lib/adlint/c/message.rb +13597 -0
  46. data/lib/adlint/c/metric.rb +765 -0
  47. data/lib/adlint/c/object.rb +1018 -0
  48. data/lib/adlint/c/parser.rb +3800 -0
  49. data/lib/adlint/c/parser.y +2054 -0
  50. data/lib/adlint/c/phase.rb +712 -0
  51. data/lib/adlint/c/resolver.rb +270 -0
  52. data/lib/adlint/c/scanner.rb +248 -0
  53. data/lib/adlint/c/scope.rb +74 -0
  54. data/lib/adlint/c/syntax.rb +4279 -0
  55. data/lib/adlint/c/type.rb +7506 -0
  56. data/lib/adlint/c/util.rb +91 -0
  57. data/lib/adlint/c/value.rb +2310 -0
  58. data/lib/adlint/c.rb +56 -0
  59. data/lib/adlint/code.rb +500 -0
  60. data/lib/adlint/cpp/code.rb +189 -0
  61. data/lib/adlint/cpp/constexpr.rb +721 -0
  62. data/lib/adlint/cpp/constexpr.y +389 -0
  63. data/lib/adlint/cpp/eval.rb +1012 -0
  64. data/lib/adlint/cpp/lexer.rb +860 -0
  65. data/lib/adlint/cpp/macro.rb +637 -0
  66. data/lib/adlint/cpp/message.rb +992 -0
  67. data/lib/adlint/cpp/phase.rb +176 -0
  68. data/lib/adlint/cpp/scanner.rb +93 -0
  69. data/lib/adlint/cpp/source.rb +169 -0
  70. data/lib/adlint/cpp/subst.rb +300 -0
  71. data/lib/adlint/cpp/syntax.rb +1412 -0
  72. data/lib/adlint/cpp/util.rb +97 -0
  73. data/lib/adlint/cpp.rb +43 -0
  74. data/lib/adlint/driver.rb +147 -0
  75. data/lib/adlint/error.rb +179 -0
  76. data/lib/adlint/lang.rb +97 -0
  77. data/lib/adlint/ld/message.rb +259 -0
  78. data/lib/adlint/ld/metric.rb +57 -0
  79. data/lib/adlint/ld/object.rb +542 -0
  80. data/lib/adlint/ld/phase.rb +193 -0
  81. data/lib/adlint/ld/typedef.rb +109 -0
  82. data/lib/adlint/ld/util.rb +88 -0
  83. data/lib/adlint/ld.rb +37 -0
  84. data/lib/adlint/lexer.rb +293 -0
  85. data/lib/adlint/message.rb +368 -0
  86. data/lib/adlint/metric.rb +805 -0
  87. data/lib/adlint/monitor.rb +144 -0
  88. data/lib/adlint/phase.rb +90 -0
  89. data/lib/adlint/prelude.rb +314 -0
  90. data/lib/adlint/report.rb +617 -0
  91. data/lib/adlint/source.rb +155 -0
  92. data/lib/adlint/symbol.rb +127 -0
  93. data/lib/adlint/token.rb +215 -0
  94. data/lib/adlint/traits.rb +643 -0
  95. data/lib/adlint/util.rb +524 -0
  96. data/lib/adlint/version.rb +71 -0
  97. data/lib/adlint.rb +66 -0
  98. data/share/HEADER +45 -0
  99. data/share/demo/Makefile +110 -0
  100. data/share/demo/ambig_operator/ambig_operator.c +289 -0
  101. data/share/demo/arg_points_unset/arg_points_unset.c +37 -0
  102. data/share/demo/array_range/array_range.c +62 -0
  103. data/share/demo/bad_bitfields/bad_bitfields.c +74 -0
  104. data/share/demo/bad_brace/bad_brace.c +19 -0
  105. data/share/demo/bad_charset/abcde$.h +0 -0
  106. data/share/demo/bad_charset/bad_charset.c +22 -0
  107. data/share/demo/bad_comment/bad_comment.c +3 -0
  108. data/share/demo/bad_const/bad_const.c +19 -0
  109. data/share/demo/bad_conv/bad_conv.c +48 -0
  110. data/share/demo/bad_indent/bad_indent.c +50 -0
  111. data/share/demo/bad_init/bad_init.c +49 -0
  112. data/share/demo/bad_macro/bad_macro.c +97 -0
  113. data/share/demo/bitwise_expr/bitwise_expr.c +19 -0
  114. data/share/demo/call_by_value/call_by_value.c +26 -0
  115. data/share/demo/cross_ref/cross_ref.c +21 -0
  116. data/share/demo/dangling_else/dangling_else.c +20 -0
  117. data/share/demo/dead_code/dead_code.c +237 -0
  118. data/share/demo/deep_nest/deep_nest.c +57 -0
  119. data/share/demo/dense_switch/dense_switch.c +62 -0
  120. data/share/demo/direct_recur/direct_recur.c +15 -0
  121. data/share/demo/div_by_zero/div_by_zero.c +35 -0
  122. data/share/demo/dos_source/dos_source.c +7 -0
  123. data/share/demo/funptr_cast/funptr_cast.c +26 -0
  124. data/share/demo/goto_stmt/goto_stmt.c +19 -0
  125. data/share/demo/id_hiding/id_hiding.c +19 -0
  126. data/share/demo/ill_defined/ill_defined.c +13 -0
  127. data/share/demo/implicit_conv/implicit_conv.c +60 -0
  128. data/share/demo/implicit_int/implicit_int.c +14 -0
  129. data/share/demo/incomplete_type/incomplete_type.c +49 -0
  130. data/share/demo/indirect_recur/indirect_recur_1.c +14 -0
  131. data/share/demo/indirect_recur/indirect_recur_1.h +7 -0
  132. data/share/demo/indirect_recur/indirect_recur_2.c +12 -0
  133. data/share/demo/indirect_recur/indirect_recur_2.h +6 -0
  134. data/share/demo/indirect_recur/indirect_recur_3.c +6 -0
  135. data/share/demo/indirect_recur/indirect_recur_3.h +6 -0
  136. data/share/demo/indirect_recur/indirect_recur_4.c +25 -0
  137. data/share/demo/intro_demo/intro_demo.c +76 -0
  138. data/share/demo/intro_demo/intro_demo.h +12 -0
  139. data/share/demo/intro_demo/useless_header.h +5 -0
  140. data/share/demo/invalid_call/invalid_call.c +32 -0
  141. data/share/demo/kandr_fundef/kandr_fundef.c +10 -0
  142. data/share/demo/line_comment/line_comment.c +12 -0
  143. data/share/demo/local_decl/local_decl.c +9 -0
  144. data/share/demo/logical_trick/logical_trick.c +36 -0
  145. data/share/demo/long_sym/long_sym.c +5 -0
  146. data/share/demo/loop_var/loop_var.c +92 -0
  147. data/share/demo/malloc_or_die/malloc_or_die.c +43 -0
  148. data/share/demo/may_be_null/may_be_null.c +52 -0
  149. data/share/demo/may_be_null_arith/may_be_null_arith.c +15 -0
  150. data/share/demo/may_be_unset/may_be_unset.c +34 -0
  151. data/share/demo/mmapped_io/mmapped_io.c +23 -0
  152. data/share/demo/multi_break/multi_break.c +33 -0
  153. data/share/demo/multi_decl/multi_decl_1.c +17 -0
  154. data/share/demo/multi_decl/multi_decl_1.h +6 -0
  155. data/share/demo/multi_decl/multi_decl_2.c +13 -0
  156. data/share/demo/multi_decl/multi_decl_2.h +6 -0
  157. data/share/demo/multi_decl/multi_decl_3.c +22 -0
  158. data/share/demo/multi_def/multi_def_1.c +36 -0
  159. data/share/demo/multi_def/multi_def_1.h +6 -0
  160. data/share/demo/multi_def/multi_def_2.c +22 -0
  161. data/share/demo/multi_def/multi_def_2.h +6 -0
  162. data/share/demo/multi_def/multi_def_3.c +6 -0
  163. data/share/demo/multi_typedef/multi_typedef.c +11 -0
  164. data/share/demo/multi_typedef/multi_typedef_1.h +1 -0
  165. data/share/demo/multi_typedef/multi_typedef_2.h +1 -0
  166. data/share/demo/must_be_false/must_be_false.c +53 -0
  167. data/share/demo/must_be_null/must_be_null.c +13 -0
  168. data/share/demo/must_be_null_arith/must_be_null_arith.c +14 -0
  169. data/share/demo/must_be_true/must_be_true.c +21 -0
  170. data/share/demo/no_eof_nl/no_eof_nl.c +4 -0
  171. data/share/demo/no_void_arg/no_void_arg.c +14 -0
  172. data/share/demo/null_stmt/null_stmt.c +19 -0
  173. data/share/demo/octal_const/octal_const.c +20 -0
  174. data/share/demo/output_by_param/output_by_param.c +17 -0
  175. data/share/demo/overflow/overflow.c +74 -0
  176. data/share/demo/press_release/press_release.c +40 -0
  177. data/share/demo/retn_lvar_addr/retn_lvar_addr.c +47 -0
  178. data/share/demo/shift_expr/shift_expr.c +14 -0
  179. data/share/demo/should_be_typedef/should_be_typedef.c +51 -0
  180. data/share/demo/static_paths/static_paths.c +153 -0
  181. data/share/demo/static_vars/static_vars.c +39 -0
  182. data/share/demo/tag_hiding/tag_hiding.c +18 -0
  183. data/share/demo/tricky_incdec/tricky_incdec.c +12 -0
  184. data/share/demo/undefined_macro/undefined_macro.c +17 -0
  185. data/share/demo/uninit_vars/uninit_vars.c +28 -0
  186. data/share/demo/union_type/union_type.c +23 -0
  187. data/share/demo/unmatch_decl/unmatch_decl_1.c +12 -0
  188. data/share/demo/unmatch_decl/unmatch_decl_1.h +8 -0
  189. data/share/demo/unmatch_decl/unmatch_decl_2.c +10 -0
  190. data/share/demo/unmatch_decl/unmatch_decl_2.h +8 -0
  191. data/share/demo/unmatch_decl/unmatch_decl_3.c +7 -0
  192. data/share/demo/unmatch_paren_macro/unmatch_paren_macro.c +15 -0
  193. data/share/demo/unreachable/unreachable.c +34 -0
  194. data/share/demo/useless_exp_funs/useless_exp_funs_1.c +14 -0
  195. data/share/demo/useless_exp_funs/useless_exp_funs_1.h +1 -0
  196. data/share/demo/useless_exp_funs/useless_exp_funs_2.c +6 -0
  197. data/share/demo/useless_exp_vars/useless_export_1.c +8 -0
  198. data/share/demo/useless_exp_vars/useless_export_1.h +1 -0
  199. data/share/demo/useless_exp_vars/useless_export_2.c +7 -0
  200. data/share/demo/useless_expr/useless_expr.c +17 -0
  201. data/share/demo/useless_funs/useless_funs_1.c +21 -0
  202. data/share/demo/useless_funs/useless_funs_1.h +8 -0
  203. data/share/demo/useless_funs/useless_funs_2.c +6 -0
  204. data/share/demo/useless_header/useless_header.c +9 -0
  205. data/share/demo/useless_header/useless_header_1.h +12 -0
  206. data/share/demo/useless_header/useless_header_2.h +6 -0
  207. data/share/demo/useless_header/useless_header_3.h +9 -0
  208. data/share/demo/useless_header/useless_header_4.h +3 -0
  209. data/share/demo/useless_vars/useless_vars.c +17 -0
  210. data/share/demo/va_funcall/va_funcall.c +25 -0
  211. data/share/demo/various_fundef/various_fundef.c +36 -0
  212. data/share/demo/wchar_wstring/wchar_wstring.c +7 -0
  213. data/share/demo/wrap_around/wrap_around.c +38 -0
  214. data/share/doc/Makefile +16 -0
  215. data/share/doc/adlint_on_adqua.png +0 -0
  216. data/share/doc/adlint_on_eclipse_en.png +0 -0
  217. data/share/doc/adlint_on_eclipse_ja.png +0 -0
  218. data/share/doc/adlint_on_vim_en.png +0 -0
  219. data/share/doc/adlint_on_vim_ja.png +0 -0
  220. data/share/doc/developers_guide_ja.html +171 -0
  221. data/share/doc/developers_guide_ja.texi +87 -0
  222. data/share/doc/gen_mesg_sections.rb +39 -0
  223. data/share/doc/samples/GNUmakefile +162 -0
  224. data/share/doc/samples/adlint_traits.yml +238 -0
  225. data/share/doc/texinfo.css +22 -0
  226. data/share/doc/users_guide_en.html +39975 -0
  227. data/share/doc/users_guide_en.texi +32640 -0
  228. data/share/doc/users_guide_ja.html +40505 -0
  229. data/share/doc/users_guide_ja.texi +33189 -0
  230. data/share/logo/adlint-110.png +0 -0
  231. data/share/logo/adlint-524.png +0 -0
  232. data/share/logo/adlint.svg +4637 -0
  233. data/share/sample/README +6 -0
  234. data/share/sample/bison-2.5/adlint/GNUmakefile +170 -0
  235. data/share/sample/bison-2.5/adlint/adlint_traits.yml +225 -0
  236. data/share/sample/bison-2.5/adlint/lib/GNUmakefile +198 -0
  237. data/share/sample/bison-2.5/adlint/lib/adlint_cinit.h +228 -0
  238. data/share/sample/bison-2.5/adlint/lib/adlint_pinit.h +21 -0
  239. data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +238 -0
  240. data/share/sample/bison-2.5/adlint/src/GNUmakefile +166 -0
  241. data/share/sample/bison-2.5/adlint/src/adlint_cinit.h +228 -0
  242. data/share/sample/bison-2.5/adlint/src/adlint_pinit.h +21 -0
  243. data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +239 -0
  244. data/share/sample/ctags-5.8/adlint/GNUmakefile +169 -0
  245. data/share/sample/ctags-5.8/adlint/adlint_cinit.h +219 -0
  246. data/share/sample/ctags-5.8/adlint/adlint_pinit.h +13 -0
  247. data/share/sample/ctags-5.8/adlint/adlint_traits.yml +225 -0
  248. data/share/sample/flex-2.5.35/adlint/GNUmakefile +140 -0
  249. data/share/sample/flex-2.5.35/adlint/adlint_cinit.h +219 -0
  250. data/share/sample/flex-2.5.35/adlint/adlint_pinit.h +14 -0
  251. data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +225 -0
  252. data/share/sample/ruby-1.9.3-p0/adlint/GNUmakefile +314 -0
  253. data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +225 -0
  254. data/share/sample/ruby-1.9.3-p0/adlint/core/GNUmakefile +204 -0
  255. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_cinit.h +228 -0
  256. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_pinit.h +28 -0
  257. data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +240 -0
  258. data/share/sample/ruby-1.9.3-p0/adlint/enc/GNUmakefile +163 -0
  259. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_cinit.h +228 -0
  260. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_pinit.h +24 -0
  261. data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +240 -0
  262. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/GNUmakefile +149 -0
  263. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_cinit.h +228 -0
  264. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_pinit.h +24 -0
  265. data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +240 -0
  266. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/GNUmakefile +131 -0
  267. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_cinit.h +228 -0
  268. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_pinit.h +24 -0
  269. data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +241 -0
  270. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/GNUmakefile +131 -0
  271. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_cinit.h +228 -0
  272. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_pinit.h +24 -0
  273. data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +241 -0
  274. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/GNUmakefile +131 -0
  275. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_cinit.h +228 -0
  276. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_pinit.h +24 -0
  277. data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +241 -0
  278. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/GNUmakefile +131 -0
  279. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_cinit.h +228 -0
  280. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_pinit.h +24 -0
  281. data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +241 -0
  282. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/GNUmakefile +134 -0
  283. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_cinit.h +228 -0
  284. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_pinit.h +24 -0
  285. data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +241 -0
  286. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/GNUmakefile +131 -0
  287. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_cinit.h +228 -0
  288. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_pinit.h +24 -0
  289. data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +241 -0
  290. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/GNUmakefile +131 -0
  291. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_cinit.h +228 -0
  292. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_pinit.h +24 -0
  293. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +241 -0
  294. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/GNUmakefile +131 -0
  295. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_cinit.h +228 -0
  296. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_pinit.h +24 -0
  297. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +242 -0
  298. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/GNUmakefile +132 -0
  299. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_cinit.h +228 -0
  300. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_pinit.h +24 -0
  301. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +242 -0
  302. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/GNUmakefile +132 -0
  303. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_cinit.h +228 -0
  304. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_pinit.h +24 -0
  305. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +242 -0
  306. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/GNUmakefile +132 -0
  307. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_cinit.h +228 -0
  308. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_pinit.h +24 -0
  309. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +242 -0
  310. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/GNUmakefile +132 -0
  311. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_cinit.h +228 -0
  312. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_pinit.h +24 -0
  313. data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +242 -0
  314. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/GNUmakefile +134 -0
  315. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_cinit.h +228 -0
  316. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_pinit.h +24 -0
  317. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +241 -0
  318. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/GNUmakefile +140 -0
  319. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_cinit.h +228 -0
  320. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_pinit.h +24 -0
  321. data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +242 -0
  322. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/GNUmakefile +131 -0
  323. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_cinit.h +228 -0
  324. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_pinit.h +24 -0
  325. data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +241 -0
  326. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/GNUmakefile +131 -0
  327. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_cinit.h +228 -0
  328. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_pinit.h +24 -0
  329. data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +241 -0
  330. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/GNUmakefile +131 -0
  331. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_cinit.h +228 -0
  332. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_pinit.h +24 -0
  333. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +241 -0
  334. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/GNUmakefile +134 -0
  335. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_cinit.h +228 -0
  336. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_pinit.h +24 -0
  337. data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +242 -0
  338. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/GNUmakefile +131 -0
  339. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_cinit.h +228 -0
  340. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_pinit.h +24 -0
  341. data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +241 -0
  342. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/GNUmakefile +131 -0
  343. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_cinit.h +228 -0
  344. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_pinit.h +24 -0
  345. data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +241 -0
  346. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/GNUmakefile +131 -0
  347. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_cinit.h +228 -0
  348. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_pinit.h +24 -0
  349. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +241 -0
  350. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/GNUmakefile +131 -0
  351. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_cinit.h +228 -0
  352. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_pinit.h +24 -0
  353. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +241 -0
  354. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/GNUmakefile +131 -0
  355. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_cinit.h +228 -0
  356. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_pinit.h +24 -0
  357. data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +241 -0
  358. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/GNUmakefile +131 -0
  359. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_cinit.h +228 -0
  360. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_pinit.h +24 -0
  361. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +241 -0
  362. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/GNUmakefile +131 -0
  363. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_cinit.h +228 -0
  364. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_pinit.h +24 -0
  365. data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +241 -0
  366. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/GNUmakefile +131 -0
  367. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_cinit.h +228 -0
  368. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_pinit.h +24 -0
  369. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +241 -0
  370. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/GNUmakefile +131 -0
  371. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_cinit.h +228 -0
  372. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_pinit.h +24 -0
  373. data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +241 -0
  374. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/GNUmakefile +131 -0
  375. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_cinit.h +228 -0
  376. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_pinit.h +24 -0
  377. data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +241 -0
  378. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/GNUmakefile +162 -0
  379. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_cinit.h +228 -0
  380. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_pinit.h +24 -0
  381. data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +241 -0
  382. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/GNUmakefile +131 -0
  383. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_cinit.h +228 -0
  384. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_pinit.h +24 -0
  385. data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +241 -0
  386. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/GNUmakefile +135 -0
  387. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_cinit.h +228 -0
  388. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_pinit.h +24 -0
  389. data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +241 -0
  390. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/GNUmakefile +131 -0
  391. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_cinit.h +228 -0
  392. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_pinit.h +24 -0
  393. data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +241 -0
  394. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/GNUmakefile +131 -0
  395. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_cinit.h +228 -0
  396. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_pinit.h +24 -0
  397. data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +241 -0
  398. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/GNUmakefile +131 -0
  399. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_cinit.h +228 -0
  400. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_pinit.h +24 -0
  401. data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +241 -0
  402. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/GNUmakefile +131 -0
  403. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_cinit.h +228 -0
  404. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_pinit.h +24 -0
  405. data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +241 -0
  406. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/GNUmakefile +132 -0
  407. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_cinit.h +228 -0
  408. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_pinit.h +24 -0
  409. data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +241 -0
  410. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/GNUmakefile +144 -0
  411. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_cinit.h +228 -0
  412. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_pinit.h +24 -0
  413. data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +241 -0
  414. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/GNUmakefile +131 -0
  415. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_cinit.h +228 -0
  416. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_pinit.h +24 -0
  417. data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +241 -0
  418. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/GNUmakefile +131 -0
  419. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_cinit.h +228 -0
  420. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_pinit.h +24 -0
  421. data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +241 -0
  422. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/GNUmakefile +140 -0
  423. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_cinit.h +228 -0
  424. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_pinit.h +24 -0
  425. data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +241 -0
  426. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/GNUmakefile +131 -0
  427. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_cinit.h +228 -0
  428. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_pinit.h +24 -0
  429. data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +241 -0
  430. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/GNUmakefile +131 -0
  431. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_cinit.h +228 -0
  432. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_pinit.h +24 -0
  433. data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +241 -0
  434. data/share/sample/screen-4.0.3/adlint/GNUmakefile +162 -0
  435. data/share/sample/screen-4.0.3/adlint/adlint_cinit.h +228 -0
  436. data/share/sample/screen-4.0.3/adlint/adlint_pinit.h +21 -0
  437. data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +238 -0
  438. data/share/sample/vim-7.3/adlint/vim/GNUmakefile +185 -0
  439. data/share/sample/vim-7.3/adlint/vim/adlint_cinit.h +228 -0
  440. data/share/sample/vim-7.3/adlint/vim/adlint_pinit.h +25 -0
  441. data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +250 -0
  442. data/share/sample/vim-7.3/adlint/xxd/GNUmakefile +131 -0
  443. data/share/sample/vim-7.3/adlint/xxd/adlint_cinit.h +228 -0
  444. data/share/sample/vim-7.3/adlint/xxd/adlint_pinit.h +24 -0
  445. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +237 -0
  446. data/share/sample/zsh-4.3.15/adlint/GNUmakefile +146 -0
  447. data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +225 -0
  448. data/share/sample/zsh-4.3.15/adlint/builtins/GNUmakefile +132 -0
  449. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_cinit.h +228 -0
  450. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_pinit.h +24 -0
  451. data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +240 -0
  452. data/share/sample/zsh-4.3.15/adlint/core/GNUmakefile +153 -0
  453. data/share/sample/zsh-4.3.15/adlint/core/adlint_cinit.h +228 -0
  454. data/share/sample/zsh-4.3.15/adlint/core/adlint_pinit.h +23 -0
  455. data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +239 -0
  456. data/share/sample/zsh-4.3.15/adlint/modules/GNUmakefile +147 -0
  457. data/share/sample/zsh-4.3.15/adlint/modules/adlint_cinit.h +228 -0
  458. data/share/sample/zsh-4.3.15/adlint/modules/adlint_pinit.h +24 -0
  459. data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +240 -0
  460. data/share/sample/zsh-4.3.15/adlint/zle/GNUmakefile +144 -0
  461. data/share/sample/zsh-4.3.15/adlint/zle/adlint_cinit.h +228 -0
  462. data/share/sample/zsh-4.3.15/adlint/zle/adlint_pinit.h +24 -0
  463. data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +239 -0
  464. data/spec/MUST_WRITE_SPECS_WITH_RSPEC +0 -0
  465. metadata +532 -0
@@ -0,0 +1,4279 @@
1
+ # AST of C language.
2
+ #
3
+ # Author:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
4
+ # Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
5
+ # License:: GPLv3+: GNU General Public License version 3 or later
6
+ #
7
+ # Owner:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
8
+
9
+ #--
10
+ # ___ ____ __ ___ _________
11
+ # / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
12
+ # / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
13
+ # / __ |/ /_/ / /___/ / /| / / /
14
+ # /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
15
+ #
16
+ # This file is part of AdLint.
17
+ #
18
+ # AdLint is free software: you can redistribute it and/or modify it under the
19
+ # terms of the GNU General Public License as published by the Free Software
20
+ # Foundation, either version 3 of the License, or (at your option) any later
21
+ # version.
22
+ #
23
+ # AdLint is distributed in the hope that it will be useful, but WITHOUT ANY
24
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
25
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
26
+ #
27
+ # You should have received a copy of the GNU General Public License along with
28
+ # AdLint. If not, see <http://www.gnu.org/licenses/>.
29
+ #
30
+ #++
31
+
32
+ require "adlint/symbol"
33
+ require "adlint/util"
34
+
35
+ module AdLint #:nodoc:
36
+ module C #:nodoc:
37
+
38
+ class SyntaxNode
39
+ include Visitable
40
+
41
+ def initialize
42
+ @head_token = nil
43
+ @tail_token = nil
44
+ end
45
+
46
+ attr_accessor :head_token
47
+ attr_accessor :tail_token
48
+
49
+ def location
50
+ subclass_responsibility
51
+ end
52
+
53
+ def head_location
54
+ @head_token ? @head_token.location : nil
55
+ end
56
+
57
+ def tail_location
58
+ @tail_token ? @tail_token.location : nil
59
+ end
60
+
61
+ def inspect(indent = 0)
62
+ subclass_responsibility
63
+ end
64
+
65
+ def short_class_name
66
+ self.class.name.sub(/\A.*::/, "")
67
+ end
68
+ end
69
+
70
+ module SyntaxNodeCollector
71
+ def collect_object_specifiers(node)
72
+ if node
73
+ ObjectSpecifierCollector.new.tap { |collector|
74
+ node.accept(collector)
75
+ }.object_specifiers
76
+ else
77
+ []
78
+ end
79
+ end
80
+ module_function :collect_object_specifiers
81
+
82
+ def collect_identifier_declarators(node)
83
+ if node
84
+ IdentifierDeclaratorCollector.new.tap { |collector|
85
+ node.accept(collector)
86
+ }.identifier_declarators
87
+ else
88
+ []
89
+ end
90
+ end
91
+ module_function :collect_identifier_declarators
92
+
93
+ def collect_function_declarators(node)
94
+ if node
95
+ FunctionDeclaratorCollector.new.tap { |collector|
96
+ node.accept(collector)
97
+ }.function_declarators
98
+ else
99
+ []
100
+ end
101
+ end
102
+ module_function :collect_function_declarators
103
+
104
+ def collect_simple_assignment_expressions(node)
105
+ if node
106
+ SimpleAssignmentExpressionCollector.new.tap { |collector|
107
+ node.accept(collector)
108
+ }.simple_assignment_expressions
109
+ else
110
+ []
111
+ end
112
+ end
113
+ module_function :collect_simple_assignment_expressions
114
+
115
+ def collect_compound_assignment_expressions(node)
116
+ if node
117
+ CompoundAssignmentExpressionCollector.new.tap { |collector|
118
+ node.accept(collector)
119
+ }.compound_assignment_expressions
120
+ else
121
+ []
122
+ end
123
+ end
124
+ module_function :collect_compound_assignment_expressions
125
+
126
+ def collect_prefix_increment_expressions(node)
127
+ if node
128
+ PrefixIncrementExpressionCollector.new.tap { |collector|
129
+ node.accept(collector)
130
+ }.prefix_increment_expressions
131
+ else
132
+ []
133
+ end
134
+ end
135
+ module_function :collect_prefix_increment_expressions
136
+
137
+ def collect_prefix_decrement_expressions(node)
138
+ if node
139
+ PrefixDecrementExpressionCollector.new.tap { |collector|
140
+ node.accept(collector)
141
+ }.prefix_decrement_expressions
142
+ else
143
+ []
144
+ end
145
+ end
146
+ module_function :collect_prefix_decrement_expressions
147
+
148
+ def collect_postfix_increment_expressions(node)
149
+ if node
150
+ PostfixIncrementExpressionCollector.new.tap { |collector|
151
+ node.accept(collector)
152
+ }.postfix_increment_expressions
153
+ else
154
+ []
155
+ end
156
+ end
157
+ module_function :collect_postfix_increment_expressions
158
+
159
+ def collect_postfix_decrement_expressions(node)
160
+ if node
161
+ PostfixDecrementExpressionCollector.new.tap { |collector|
162
+ node.accept(collector)
163
+ }.postfix_decrement_expressions
164
+ else
165
+ []
166
+ end
167
+ end
168
+ module_function :collect_postfix_decrement_expressions
169
+
170
+ def collect_additive_expressions(node)
171
+ if node
172
+ AdditiveExpressionCollector.new.tap { |collector|
173
+ node.accept(collector)
174
+ }.additive_expressions
175
+ else
176
+ []
177
+ end
178
+ end
179
+ module_function :collect_additive_expressions
180
+
181
+ def collect_generic_labeled_statements(node)
182
+ if node
183
+ GenericLabeledStatementCollector.new.tap { |collector|
184
+ node.accept(collector)
185
+ }.generic_labeled_statements
186
+ else
187
+ []
188
+ end
189
+ end
190
+ module_function :collect_generic_labeled_statements
191
+
192
+ def collect_if_statements(node)
193
+ if node
194
+ IfStatementCollector.new.tap { |collector|
195
+ node.accept(collector)
196
+ }.if_statements
197
+ else
198
+ []
199
+ end
200
+ end
201
+ module_function :collect_if_statements
202
+
203
+ def collect_if_else_statements(node)
204
+ if node
205
+ IfElseStatementCollector.new.tap { |collector|
206
+ node.accept(collector)
207
+ }.if_else_statements
208
+ else
209
+ []
210
+ end
211
+ end
212
+ module_function :collect_if_else_statements
213
+
214
+ def collect_goto_statements(node)
215
+ if node
216
+ GotoStatementCollector.new.tap { |collector|
217
+ node.accept(collector)
218
+ }.goto_statements
219
+ else
220
+ []
221
+ end
222
+ end
223
+ module_function :collect_goto_statements
224
+
225
+ def collect_array_declarators(node)
226
+ if node
227
+ ArrayDeclaratorCollector.new.tap { |collector|
228
+ node.accept(collector)
229
+ }.array_declarators
230
+ else
231
+ []
232
+ end
233
+ end
234
+ module_function :collect_array_declarators
235
+
236
+ def collect_constant_specifiers(node)
237
+ if node
238
+ ConstantSpecifierCollector.new.tap { |collector|
239
+ node.accept(collector)
240
+ }.constant_specifiers
241
+ else
242
+ []
243
+ end
244
+ end
245
+ module_function :collect_constant_specifiers
246
+ end
247
+
248
+ class Expression < SyntaxNode
249
+ def have_side_effect?
250
+ subclass_responsibility
251
+ end
252
+
253
+ def constant?
254
+ visitor = ObjectSpecifierCollector.new
255
+ accept(visitor)
256
+ visitor.object_specifiers.empty?
257
+ end
258
+
259
+ def to_s
260
+ subclass_responsibility
261
+ end
262
+ end
263
+
264
+ class ErrorExpression < Expression
265
+ def initialize(error_token)
266
+ super()
267
+ @error_token = error_token
268
+ end
269
+
270
+ def location
271
+ head_location
272
+ end
273
+
274
+ def have_side_effect?
275
+ true
276
+ end
277
+
278
+ def to_s
279
+ @error_token.value
280
+ end
281
+
282
+ def inspect(indent = 0)
283
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
284
+ "#{@error_token.value}"
285
+ end
286
+ end
287
+
288
+ class PrimaryExpression < Expression
289
+ def have_side_effect?
290
+ false
291
+ end
292
+ end
293
+
294
+ class ObjectSpecifier < PrimaryExpression
295
+ def initialize(identifier)
296
+ super()
297
+ @identifier = identifier
298
+ end
299
+
300
+ attr_reader :identifier
301
+
302
+ def location
303
+ @identifier.location
304
+ end
305
+
306
+ def to_s
307
+ @identifier.value
308
+ end
309
+
310
+ def inspect(indent = 0)
311
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
312
+ "#{@identifier.value}"
313
+ end
314
+ end
315
+
316
+ class ConstantSpecifier < PrimaryExpression
317
+ def initialize(constant)
318
+ super()
319
+ @constant = constant
320
+ end
321
+
322
+ attr_reader :constant
323
+
324
+ def location
325
+ @constant.location
326
+ end
327
+
328
+ def prefix
329
+ @constant.value.scan(/\A(?:0x|0b|L)/i).first
330
+ end
331
+
332
+ def suffix
333
+ @constant.value.scan(/(?:[UL]+|[FL]+)\z/i).first
334
+ end
335
+
336
+ def character?
337
+ @constant.value =~ /'.*'/
338
+ end
339
+
340
+ def to_s
341
+ @constant.value
342
+ end
343
+
344
+ def inspect(indent = 0)
345
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
346
+ "#{@constant.value}"
347
+ end
348
+ end
349
+
350
+ class StringLiteralSpecifier < PrimaryExpression
351
+ def initialize(literal)
352
+ super()
353
+ @literal = literal
354
+ end
355
+
356
+ attr_reader :literal
357
+
358
+ def location
359
+ @literal.location
360
+ end
361
+
362
+ def prefix
363
+ @literal.value.scan(/\AL/i).first
364
+ end
365
+
366
+ def to_s
367
+ @literal.value
368
+ end
369
+
370
+ def inspect(indent = 0)
371
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
372
+ "#{@literal.value}"
373
+ end
374
+ end
375
+
376
+ class NullConstantSpecifier < PrimaryExpression
377
+ def initialize(token)
378
+ super()
379
+ @token = token
380
+ end
381
+
382
+ attr_reader :token
383
+
384
+ def location
385
+ @token.location
386
+ end
387
+
388
+ def to_s
389
+ @token.value
390
+ end
391
+
392
+ def inspect(indent = 0)
393
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
394
+ "#{@token.value}"
395
+ end
396
+ end
397
+
398
+ class GroupedExpression < PrimaryExpression
399
+ def initialize(expression)
400
+ super()
401
+ @expression = expression
402
+ end
403
+
404
+ attr_reader :expression
405
+
406
+ def location
407
+ head_location
408
+ end
409
+
410
+ def have_side_effect?
411
+ @expression.have_side_effect?
412
+ end
413
+
414
+ def to_s
415
+ "(#{expression.to_s})"
416
+ end
417
+
418
+ def inspect(indent = 0)
419
+ " " * indent + "#{short_class_name} (#{location.inspect})\n" +
420
+ @expression.inspect(indent + 1)
421
+ end
422
+ end
423
+
424
+ class PostfixExpression < Expression
425
+ def initialize(operator)
426
+ @operator = operator
427
+ end
428
+
429
+ attr_reader :operator
430
+
431
+ def location
432
+ @operator.location
433
+ end
434
+ end
435
+
436
+ class ArraySubscriptExpression < PostfixExpression
437
+ def initialize(expression, array_subscript, left_bracket)
438
+ super(left_bracket)
439
+ @expression = expression
440
+ @array_subscript = array_subscript
441
+ end
442
+
443
+ attr_reader :expression
444
+ attr_reader :array_subscript
445
+
446
+ def have_side_effect?
447
+ @expression.have_side_effect? || @array_subscript.have_side_effect?
448
+ end
449
+
450
+ def to_s
451
+ "#{@expression.to_s}[#{@array_subscript.to_s}]"
452
+ end
453
+
454
+ def inspect(indent = 0)
455
+ " " * indent + "#{short_class_name} (#{location.inspect})\n" +
456
+ @expression.inspect(indent + 1) + "\n" +
457
+ @array_subscript.inspect(indent + 1)
458
+ end
459
+ end
460
+
461
+ class FunctionCallExpression < PostfixExpression
462
+ def initialize(expression, argument_expressions, left_paren)
463
+ super(left_paren)
464
+ @expression = expression
465
+ @argument_expressions = argument_expressions
466
+ end
467
+
468
+ attr_reader :expression
469
+ attr_reader :argument_expressions
470
+
471
+ def have_side_effect?
472
+ true
473
+ end
474
+
475
+ def to_s
476
+ "#{@expression.to_s}(" +
477
+ @argument_expressions.map { |expr| expr.to_s }.join(",") + ")"
478
+ end
479
+
480
+ def inspect(indent = 0)
481
+ ([" " * indent + "#{short_class_name} (#{location.inspect})"] +
482
+ [@expression.inspect(indent + 1)] +
483
+ @argument_expressions.map { |a| a.inspect(indent + 1) }).join("\n")
484
+ end
485
+ end
486
+
487
+ class MemberAccessByValueExpression < PostfixExpression
488
+ def initialize(expression, identifier, dot)
489
+ super(dot)
490
+ @expression = expression
491
+ @identifier = identifier
492
+ end
493
+
494
+ attr_reader :expression
495
+ attr_reader :identifier
496
+
497
+ def have_side_effect?
498
+ @expression.have_side_effect?
499
+ end
500
+
501
+ def to_s
502
+ "#{@expression.to_s}.#{@identifier.value}"
503
+ end
504
+
505
+ def inspect(indent = 0)
506
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
507
+ "#{@expression.inspect}.#{@identifier.value}"
508
+ end
509
+ end
510
+
511
+ class MemberAccessByPointerExpression < PostfixExpression
512
+ def initialize(expression, identifier, arrow)
513
+ super(arrow)
514
+ @expression = expression
515
+ @identifier = identifier
516
+ end
517
+
518
+ attr_reader :expression
519
+ attr_reader :identifier
520
+
521
+ def have_side_effect?
522
+ @expression.have_side_effect?
523
+ end
524
+
525
+ def to_s
526
+ "#{@expression.to_s}->#{@identifier.value}"
527
+ end
528
+
529
+ def inspect(indent = 0)
530
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
531
+ "#{@expression.inspect}->#{@identifier.value}"
532
+ end
533
+ end
534
+
535
+ class BitAccessByValueExpression < PostfixExpression
536
+ def initialize(expression, constant, dot)
537
+ super(dot)
538
+ @expression = expression
539
+ @constant = constant
540
+ end
541
+
542
+ attr_reader :expression
543
+ attr_reader :constant
544
+
545
+ def have_side_effect?
546
+ @expression.have_side_effect?
547
+ end
548
+
549
+ def to_s
550
+ "#{@expression.to_s}.#{@constant.value}"
551
+ end
552
+
553
+ def inspect(indent = 0)
554
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
555
+ "#{@expression.inspect}.#{@constant.value}"
556
+ end
557
+ end
558
+
559
+ class BitAccessByPointerExpression < PostfixExpression
560
+ def initialize(expression, constant, arrow)
561
+ super(arrow)
562
+ @expression = expression
563
+ @constant = constant
564
+ end
565
+
566
+ attr_reader :expression
567
+ attr_reader :constant
568
+
569
+ def have_side_effect?
570
+ @expression.have_side_effect?
571
+ end
572
+
573
+ def to_s
574
+ "#{@expression.to_s}->#{@constant.value}"
575
+ end
576
+
577
+ def inspect(indent = 0)
578
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
579
+ "#{@expression.inspect}->#{@constant.value}"
580
+ end
581
+ end
582
+
583
+ class PostfixIncrementExpression < PostfixExpression
584
+ def initialize(operand, operator)
585
+ super(operator)
586
+ @operand = operand
587
+ end
588
+
589
+ attr_reader :operand
590
+
591
+ def have_side_effect?
592
+ true
593
+ end
594
+
595
+ def to_s
596
+ "#{@operand.to_s}++"
597
+ end
598
+
599
+ def inspect(indent = 0)
600
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
601
+ @operand.inspect
602
+ end
603
+ end
604
+
605
+ class PostfixDecrementExpression < PostfixExpression
606
+ def initialize(operand, operator)
607
+ super(operator)
608
+ @operand = operand
609
+ end
610
+
611
+ attr_reader :operand
612
+
613
+ def have_side_effect?
614
+ true
615
+ end
616
+
617
+ def to_s
618
+ "#{@operand.to_s}--"
619
+ end
620
+
621
+ def inspect(indent = 0)
622
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
623
+ @operand.inspect
624
+ end
625
+ end
626
+
627
+ class CompoundLiteralExpression < PostfixExpression
628
+ def initialize(type_name, initializers, left_paren)
629
+ super(left_paren)
630
+ @type_name = type_name
631
+ @initializers = initializers
632
+ end
633
+
634
+ attr_reader :type_name
635
+ attr_reader :initializers
636
+
637
+ def have_side_effect?
638
+ false
639
+ end
640
+
641
+ def to_s
642
+ "(#{@type_name.to_s}){" +
643
+ @initializers.map { |ini| ini.to_s }.join(",") + "}"
644
+ end
645
+
646
+ def inspect(indent = 0)
647
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
648
+ @initializers.map { |init| init.inspect }.join(",")
649
+ end
650
+ end
651
+
652
+ class UnaryExpression < Expression
653
+ def initialize(operator, operand)
654
+ super()
655
+ @operator = operator
656
+ @operand = operand
657
+ end
658
+
659
+ attr_reader :operator
660
+ attr_reader :operand
661
+
662
+ def location
663
+ @operator.location
664
+ end
665
+
666
+ def have_side_effect?
667
+ @operand.have_side_effect?
668
+ end
669
+
670
+ def to_s
671
+ @operator.value + @operand.to_s
672
+ end
673
+
674
+ def inspect(indent = 0)
675
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
676
+ "#{@operator.value} #{@operand.inspect}"
677
+ end
678
+ end
679
+
680
+ class PrefixIncrementExpression < UnaryExpression
681
+ def have_side_effect?
682
+ true
683
+ end
684
+ end
685
+
686
+ class PrefixDecrementExpression < UnaryExpression
687
+ def have_side_effect?
688
+ true
689
+ end
690
+ end
691
+
692
+ class AddressExpression < UnaryExpression; end
693
+
694
+ class IndirectionExpression < UnaryExpression; end
695
+
696
+ class UnaryArithmeticExpression < UnaryExpression; end
697
+
698
+ class SizeofExpression < UnaryExpression
699
+ def to_s
700
+ "sizeof(#{@operand.to_s})"
701
+ end
702
+ end
703
+
704
+ class SizeofTypeExpression < UnaryExpression
705
+ def have_side_effect?
706
+ false
707
+ end
708
+
709
+ def to_s
710
+ "sizeof(#{@operand.to_s})"
711
+ end
712
+ end
713
+
714
+ class AlignofExpression < UnaryExpression
715
+ def to_s
716
+ "alignof(#{@operand.to_s})"
717
+ end
718
+ end
719
+
720
+ class AlignofTypeExpression < UnaryExpression
721
+ def have_side_effect?
722
+ false
723
+ end
724
+
725
+ def to_s
726
+ "alignof(#{@operand.to_s})"
727
+ end
728
+ end
729
+
730
+ class CastExpression < Expression
731
+ def initialize(type_name, operand)
732
+ super()
733
+ @type_name = type_name
734
+ @operand = operand
735
+ end
736
+
737
+ attr_reader :type_name
738
+ attr_reader :operand
739
+
740
+ def location
741
+ head_location
742
+ end
743
+
744
+ def have_side_effect?
745
+ @operand.have_side_effect?
746
+ end
747
+
748
+ def to_s
749
+ "(#{@type_name.to_s}) #{@operand.to_s}"
750
+ end
751
+
752
+ def inspect(indent = 0)
753
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
754
+ "#{@type_name.inspect} #{@operand.inspect}"
755
+ end
756
+ end
757
+
758
+ class BinaryExpression < Expression
759
+ def initialize(operator, lhs_operand, rhs_operand)
760
+ super()
761
+ @operator = operator
762
+ @lhs_operand = lhs_operand
763
+ @rhs_operand = rhs_operand
764
+ end
765
+
766
+ attr_reader :operator
767
+ attr_reader :lhs_operand
768
+ attr_reader :rhs_operand
769
+
770
+ def location
771
+ @operator.location
772
+ end
773
+
774
+ def have_side_effect?
775
+ lhs_operand.have_side_effect? || rhs_operand.have_side_effect?
776
+ end
777
+
778
+ def to_s
779
+ "#{@lhs_operand.to_s} #{@operator.value} #{@rhs_operand.to_s}"
780
+ end
781
+
782
+ def inspect(indent = 0)
783
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
784
+ "#{@operator.value} #{lhs_operand.inspect} #{rhs_operand.inspect}"
785
+ end
786
+ end
787
+
788
+ class MultiplicativeExpression < BinaryExpression; end
789
+
790
+ class AdditiveExpression < BinaryExpression; end
791
+
792
+ class ShiftExpression < BinaryExpression; end
793
+
794
+ class RelationalExpression < BinaryExpression; end
795
+
796
+ class EqualityExpression < BinaryExpression; end
797
+
798
+ class AndExpression < BinaryExpression; end
799
+
800
+ class ExclusiveOrExpression < BinaryExpression; end
801
+
802
+ class InclusiveOrExpression < BinaryExpression; end
803
+
804
+ class LogicalAndExpression < BinaryExpression; end
805
+
806
+ class LogicalOrExpression < BinaryExpression; end
807
+
808
+ class ConditionalExpression < Expression
809
+ def initialize(condition, then_expression, else_expression, question_mark)
810
+ super()
811
+ @condition = condition
812
+ @then_expression = then_expression
813
+ @else_expression = else_expression
814
+ @question_mark = question_mark
815
+ end
816
+
817
+ attr_reader :condition
818
+ attr_reader :then_expression
819
+ attr_reader :else_expression
820
+
821
+ def location
822
+ @question_mark.location
823
+ end
824
+
825
+ def have_side_effect?
826
+ @condition.have_side_effect? ||
827
+ @then_expression.have_side_effect? ||
828
+ @else_expression.have_side_effect?
829
+ end
830
+
831
+ def to_s
832
+ "#{@condition.to_s} ? " +
833
+ "#{@then_expression.to_s} : #{@else_expression.to_s}"
834
+ end
835
+
836
+ def inspect(indent = 0)
837
+ " " * indent + "#{short_class_name}\n" +
838
+ @condition.inspect(indent + 1) + "\n" +
839
+ @then_expression.inspect(indent + 1) + "\n" +
840
+ @else_expression.inspect(indent + 1)
841
+ end
842
+ end
843
+
844
+ class SimpleAssignmentExpression < BinaryExpression
845
+ def have_side_effect?
846
+ true
847
+ end
848
+ end
849
+
850
+ class CompoundAssignmentExpression < BinaryExpression
851
+ def have_side_effect?
852
+ true
853
+ end
854
+ end
855
+
856
+ class CommaSeparatedExpression < Expression
857
+ def initialize(first_expression)
858
+ super()
859
+ @expressions = [first_expression]
860
+ end
861
+
862
+ attr_reader :expressions
863
+
864
+ def location
865
+ head_location
866
+ end
867
+
868
+ def have_side_effect?
869
+ @expressions.any? { |expr| expr.have_side_effect? }
870
+ end
871
+
872
+ def to_s
873
+ @expressions.map { |expr| expr.to_s }.join(",")
874
+ end
875
+
876
+ def push(expression)
877
+ @expressions.push(expression)
878
+ self
879
+ end
880
+
881
+ def inspect(indent = 0)
882
+ " " * indent + "#{short_class_name}\n" +
883
+ @expressions.map { |expr| expr.inspect(indent + 1) }.join("\n")
884
+ end
885
+ end
886
+
887
+ class Declaration < SyntaxNode
888
+ def initialize(declaration_specifiers, init_declarators, symbol_table)
889
+ super()
890
+ @declaration_specifiers = declaration_specifiers
891
+ @init_declarators = init_declarators
892
+ @items = build_items(declaration_specifiers, init_declarators,
893
+ symbol_table)
894
+ end
895
+
896
+ attr_reader :declaration_specifiers
897
+ attr_reader :init_declarators
898
+ attr_reader :items
899
+
900
+ def location
901
+ head_location
902
+ end
903
+
904
+ def inspect(indent = 0)
905
+ ([" " * indent + "#{short_class_name} (#{location.inspect})"] +
906
+ @items.map { |item| item.inspect(indent + 1) }).join("\n")
907
+ end
908
+
909
+ private
910
+ def build_items(declaration_specifiers, init_declarators, symbol_table)
911
+ build_type_declaration(
912
+ declaration_specifiers, init_declarators, symbol_table) +
913
+ build_function_declaration(
914
+ declaration_specifiers, init_declarators, symbol_table) +
915
+ build_variable_declaration(
916
+ declaration_specifiers, init_declarators, symbol_table) +
917
+ build_variable_definition(
918
+ declaration_specifiers, init_declarators, symbol_table)
919
+ end
920
+
921
+ def build_type_declaration(declaration_specifiers, init_declarators,
922
+ symbol_table)
923
+ return [] unless declaration_specifiers
924
+
925
+ result = []
926
+
927
+ declaration_specifiers.type_specifiers.each do |type_specifier|
928
+ visitor = TypeDeclarationBuilder.new(symbol_table)
929
+ type_specifier.accept(visitor)
930
+ result.concat(visitor.type_declarations)
931
+ end
932
+
933
+ if declaration_specifiers.storage_class_specifier &&
934
+ declaration_specifiers.storage_class_specifier.type == :TYPEDEF
935
+ init_declarators.each do |init_declarator|
936
+ symbol = symbol_table.create_new_symbol(
937
+ TypedefName, init_declarator.declarator.identifier)
938
+ result.push(TypedefDeclaration.new(declaration_specifiers,
939
+ init_declarator, symbol))
940
+ end
941
+ end
942
+
943
+ result
944
+ end
945
+
946
+ def build_function_declaration(declaration_specifiers, init_declarators,
947
+ symbol_table)
948
+ if declaration_specifiers &&
949
+ declaration_specifiers.storage_class_specifier &&
950
+ declaration_specifiers.storage_class_specifier.type == :TYPEDEF
951
+ return []
952
+ end
953
+
954
+ result = []
955
+ init_declarators.each do |init_declarator|
956
+ if init_declarator.declarator.function?
957
+ symbol = symbol_table.create_new_symbol(
958
+ ObjectName, init_declarator.declarator.identifier)
959
+ result.push(FunctionDeclaration.new(declaration_specifiers,
960
+ init_declarator, symbol))
961
+ end
962
+ end
963
+ result
964
+ end
965
+
966
+ def build_variable_declaration(declaration_specifiers, init_declarators,
967
+ symbol_table)
968
+ return [] unless declaration_specifiers
969
+
970
+ result = []
971
+ if declaration_specifiers.storage_class_specifier &&
972
+ declaration_specifiers.storage_class_specifier.type == :EXTERN
973
+ init_declarators.each do |init_declarator|
974
+ if init_declarator.declarator.variable?
975
+ declarator = init_declarator.declarator
976
+ symbol =
977
+ symbol_table.create_new_symbol(ObjectName, declarator.identifier)
978
+ result.push(VariableDeclaration.new(declaration_specifiers,
979
+ declarator, symbol))
980
+ end
981
+ end
982
+ end
983
+ result
984
+ end
985
+
986
+ def build_variable_definition(declaration_specifiers, init_declarators,
987
+ symbol_table)
988
+ result = []
989
+ unless declaration_specifiers &&
990
+ declaration_specifiers.storage_class_specifier &&
991
+ (declaration_specifiers.storage_class_specifier.type == :EXTERN ||
992
+ declaration_specifiers.storage_class_specifier.type == :TYPEDEF)
993
+ init_declarators.each do |init_declarator|
994
+ if init_declarator.declarator.variable?
995
+ symbol = symbol_table.create_new_symbol(
996
+ ObjectName, init_declarator.declarator.identifier)
997
+ result.push(VariableDefinition.new(declaration_specifiers,
998
+ init_declarator, symbol))
999
+ end
1000
+ end
1001
+ end
1002
+ result
1003
+ end
1004
+ end
1005
+
1006
+ class FunctionDeclaration < SyntaxNode
1007
+ include SymbolicElement
1008
+ include SyntaxNodeCollector
1009
+
1010
+ def initialize(declaration_specifiers, init_declarator, symbol)
1011
+ super()
1012
+ @declaration_specifiers = declaration_specifiers
1013
+ @init_declarator = init_declarator
1014
+ @symbol = symbol
1015
+ @type = nil
1016
+ end
1017
+
1018
+ attr_reader :declaration_specifiers
1019
+ attr_reader :init_declarator
1020
+ attr_reader :symbol
1021
+ attr_accessor :type
1022
+
1023
+ def identifier
1024
+ @init_declarator.declarator.identifier
1025
+ end
1026
+
1027
+ def storage_class_specifier
1028
+ @declaration_specifiers ?
1029
+ @declaration_specifiers.storage_class_specifier : nil
1030
+ end
1031
+
1032
+ def signature
1033
+ FunctionSignature.new(identifier, @type)
1034
+ end
1035
+
1036
+ def function_declarator
1037
+ collect_function_declarators(@init_declarator).first
1038
+ end
1039
+
1040
+ def location
1041
+ identifier.location
1042
+ end
1043
+
1044
+ def inspect(indent = 0)
1045
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1046
+ identifier.value
1047
+ end
1048
+ end
1049
+
1050
+ class VariableDeclaration < SyntaxNode
1051
+ include SymbolicElement
1052
+
1053
+ def initialize(declaration_specifiers, declarator, symbol)
1054
+ super()
1055
+ @declaration_specifiers = declaration_specifiers
1056
+ @declarator = declarator
1057
+ @symbol = symbol
1058
+ @type = nil
1059
+ end
1060
+
1061
+ attr_reader :declaration_specifiers
1062
+ attr_reader :declarator
1063
+ attr_reader :symbol
1064
+ attr_accessor :type
1065
+
1066
+ def identifier
1067
+ @declarator.identifier
1068
+ end
1069
+
1070
+ def storage_class_specifier
1071
+ @declaration_specifiers ?
1072
+ @declaration_specifiers.storage_class_specifier : nil
1073
+ end
1074
+
1075
+ def location
1076
+ identifier.location
1077
+ end
1078
+
1079
+ def inspect(indent = 0)
1080
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1081
+ identifier.value
1082
+ end
1083
+ end
1084
+
1085
+ class Definition < SyntaxNode; end
1086
+
1087
+ class VariableDefinition < Definition
1088
+ include SymbolicElement
1089
+
1090
+ def initialize(declaration_specifiers, init_declarator, symbol)
1091
+ super()
1092
+ @declaration_specifiers = declaration_specifiers
1093
+ @init_declarator = init_declarator
1094
+ @symbol = symbol
1095
+ @type = nil
1096
+ end
1097
+
1098
+ attr_reader :declaration_specifiers
1099
+ attr_reader :init_declarator
1100
+ attr_reader :symbol
1101
+ attr_accessor :type
1102
+
1103
+ def identifier
1104
+ @init_declarator.declarator.identifier
1105
+ end
1106
+
1107
+ def storage_class_specifier
1108
+ @declaration_specifiers ?
1109
+ @declaration_specifiers.storage_class_specifier : nil
1110
+ end
1111
+
1112
+ def initializer
1113
+ @init_declarator.initializer
1114
+ end
1115
+
1116
+ def location
1117
+ identifier.location
1118
+ end
1119
+
1120
+ def inspect(indent = 0)
1121
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1122
+ identifier.value
1123
+ end
1124
+ end
1125
+
1126
+ class TypeDeclaration < SyntaxNode
1127
+ include SymbolicElement
1128
+
1129
+ def initialize(symbol)
1130
+ super()
1131
+ @symbol = symbol
1132
+ end
1133
+
1134
+ attr_reader :symbol
1135
+ end
1136
+
1137
+ class TypedefDeclaration < TypeDeclaration
1138
+ def initialize(declaration_specifiers, init_declarator, symbol)
1139
+ super(symbol)
1140
+ @declaration_specifiers = declaration_specifiers
1141
+ @init_declarator = init_declarator
1142
+ @type = nil
1143
+ end
1144
+
1145
+ attr_reader :declaration_specifiers
1146
+ attr_reader :init_declarator
1147
+ attr_accessor :type
1148
+
1149
+ def identifier
1150
+ @init_declarator.declarator.identifier
1151
+ end
1152
+
1153
+ def declarator
1154
+ @init_declarator.declarator
1155
+ end
1156
+
1157
+ def type_qualifiers
1158
+ @declaration_specifiers.type_qualifiers
1159
+ end
1160
+
1161
+ def type_specifiers
1162
+ @declaration_specifiers.type_specifiers
1163
+ end
1164
+
1165
+ def location
1166
+ identifier.location
1167
+ end
1168
+
1169
+ def inspect(indent = 0)
1170
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1171
+ identifier.value
1172
+ end
1173
+ end
1174
+
1175
+ class StructTypeDeclaration < TypeDeclaration
1176
+ def initialize(struct_specifier, symbol)
1177
+ super(symbol)
1178
+ @struct_specifier = struct_specifier
1179
+ @struct_declarations = struct_specifier.struct_declarations
1180
+ @type = nil
1181
+ end
1182
+
1183
+ attr_reader :struct_specifier
1184
+ attr_reader :struct_declarations
1185
+ attr_accessor :type
1186
+
1187
+ def identifier
1188
+ @struct_specifier.identifier
1189
+ end
1190
+
1191
+ def location
1192
+ identifier.location
1193
+ end
1194
+
1195
+ def inspect(indent = 0)
1196
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1197
+ "#{identifier.value}\n" +
1198
+ @struct_declarations.map { |sd| sd.inspect(indent + 1) }.join("\n")
1199
+ end
1200
+ end
1201
+
1202
+ class PseudoStructTypeDeclaration < StructTypeDeclaration
1203
+ def initialize(struct_specifier)
1204
+ super(struct_specifier, nil)
1205
+ end
1206
+
1207
+ def mark_as_referred_by(token) end
1208
+ end
1209
+
1210
+ class UnionTypeDeclaration < TypeDeclaration
1211
+ def initialize(union_specifier, symbol)
1212
+ super(symbol)
1213
+ @union_specifier = union_specifier
1214
+ @struct_declarations = union_specifier.struct_declarations
1215
+ @type = nil
1216
+ end
1217
+
1218
+ attr_reader :union_specifier
1219
+ attr_reader :struct_declarations
1220
+ attr_accessor :type
1221
+
1222
+ def identifier
1223
+ @union_specifier.identifier
1224
+ end
1225
+
1226
+ def location
1227
+ identifier.location
1228
+ end
1229
+
1230
+ def inspect(indent = 0)
1231
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1232
+ "#{identifier.value}\n" +
1233
+ @struct_declarations.map { |sd| sd.inspect(indent + 1) }.join("\n")
1234
+ end
1235
+ end
1236
+
1237
+ class PseudoUnionTypeDeclaration < UnionTypeDeclaration
1238
+ def initialize(union_specifier)
1239
+ super(union_specifier, nil)
1240
+ end
1241
+
1242
+ def mark_as_referred_by(token) end
1243
+ end
1244
+
1245
+ class EnumTypeDeclaration < TypeDeclaration
1246
+ def initialize(enum_specifier, symbol)
1247
+ super(symbol)
1248
+ @enum_specifier = enum_specifier
1249
+ @type = nil
1250
+ end
1251
+
1252
+ attr_reader :enum_specifier
1253
+ attr_accessor :type
1254
+
1255
+ def identifier
1256
+ @enum_specifier.identifier
1257
+ end
1258
+
1259
+ def location
1260
+ identifier.location
1261
+ end
1262
+
1263
+ def enumerators
1264
+ @enum_specifier.enumerators
1265
+ end
1266
+
1267
+ def inspect(indent = 0)
1268
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1269
+ "#{identifier.value}"
1270
+ end
1271
+ end
1272
+
1273
+ class PseudoEnumTypeDeclaration < EnumTypeDeclaration
1274
+ def initialize(enum_specifier)
1275
+ super(enum_specifier, nil)
1276
+ end
1277
+
1278
+ def mark_as_referred_by(token) end
1279
+ end
1280
+
1281
+ class DeclarationSpecifiers < SyntaxNode
1282
+ def initialize
1283
+ super
1284
+ @storage_class_specifier = nil
1285
+ @function_specifier = nil
1286
+ @type_qualifiers = []
1287
+ @type_specifiers = []
1288
+ end
1289
+
1290
+ attr_accessor :storage_class_specifier
1291
+ attr_accessor :function_specifier
1292
+ attr_reader :type_qualifiers
1293
+ attr_reader :type_specifiers
1294
+
1295
+ def location
1296
+ head_location
1297
+ end
1298
+
1299
+ def inspect(indent = 0)
1300
+ " " * indent + short_class_name
1301
+ end
1302
+ end
1303
+
1304
+ class InitDeclarator < SyntaxNode
1305
+ def initialize(declarator, initializer)
1306
+ super()
1307
+ @declarator = declarator
1308
+ @initializer = initializer
1309
+ end
1310
+
1311
+ attr_reader :declarator
1312
+ attr_reader :initializer
1313
+
1314
+ def location
1315
+ @declarator.identifier.location
1316
+ end
1317
+
1318
+ def inspect(indent = 0)
1319
+ " " * indent + short_class_name
1320
+ end
1321
+ end
1322
+
1323
+ class TypeSpecifier < SyntaxNode
1324
+ def to_s
1325
+ subclass_responsibility
1326
+ end
1327
+ end
1328
+
1329
+ class StandardTypeSpecifier < TypeSpecifier
1330
+ def initialize(token)
1331
+ super()
1332
+ @token = token
1333
+ end
1334
+
1335
+ attr_reader :token
1336
+
1337
+ def location
1338
+ head_location
1339
+ end
1340
+
1341
+ def to_s
1342
+ @token.value
1343
+ end
1344
+
1345
+ def inspect(indent = 0)
1346
+ " " * indent + short_class_name
1347
+ end
1348
+ end
1349
+
1350
+ class TypedefTypeSpecifier < TypeSpecifier
1351
+ def initialize(token)
1352
+ super()
1353
+ @token = token
1354
+ end
1355
+
1356
+ attr_reader :token
1357
+
1358
+ def location
1359
+ head_location
1360
+ end
1361
+
1362
+ def identifier
1363
+ @token
1364
+ end
1365
+
1366
+ def to_s
1367
+ @token.value
1368
+ end
1369
+
1370
+ def inspect(indent = 0)
1371
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1372
+ @token.value
1373
+ end
1374
+ end
1375
+
1376
+ class StructSpecifier < TypeSpecifier
1377
+ def initialize(identifier, struct_declarations)
1378
+ super()
1379
+ @identifier = identifier
1380
+ @struct_declarations = struct_declarations
1381
+ end
1382
+
1383
+ attr_reader :identifier
1384
+ attr_reader :struct_declarations
1385
+
1386
+ def location
1387
+ @identifier.location
1388
+ end
1389
+
1390
+ def to_s
1391
+ if @struct_declarations
1392
+ if @struct_declarations.empty?
1393
+ "struct #{identifier.value} {}"
1394
+ else
1395
+ "struct #{identifier.value} { " +
1396
+ @struct_declarations.map { |decl| decl.to_s }.join(" ") +
1397
+ " }"
1398
+ end
1399
+ else
1400
+ "struct #{identifier.value}"
1401
+ end
1402
+ end
1403
+
1404
+ def inspect(indent = 0)
1405
+ " " * indent + short_class_name
1406
+ end
1407
+ end
1408
+
1409
+ class UnionSpecifier < TypeSpecifier
1410
+ def initialize(identifier, struct_declarations)
1411
+ super()
1412
+ @identifier = identifier
1413
+ @struct_declarations = struct_declarations
1414
+ end
1415
+
1416
+ attr_reader :identifier
1417
+ attr_reader :struct_declarations
1418
+
1419
+ def location
1420
+ @identifier.location
1421
+ end
1422
+
1423
+ def to_s
1424
+ if @struct_declarations
1425
+ if @struct_declarations.empty?
1426
+ "union #{identifier.value} {}"
1427
+ else
1428
+ "union #{identifier.value} { " +
1429
+ @struct_declarations.map { |decl| decl.to_s }.join(" ") +
1430
+ " }"
1431
+ end
1432
+ else
1433
+ "union #{identifier.value}"
1434
+ end
1435
+ end
1436
+
1437
+ def inspect(indent = 0)
1438
+ " " * indent + short_class_name
1439
+ end
1440
+ end
1441
+
1442
+ class StructDeclaration < SyntaxNode
1443
+ def initialize(specifier_qualifier_list, struct_declarators)
1444
+ super()
1445
+ @specifier_qualifier_list = specifier_qualifier_list
1446
+ @struct_declarators = struct_declarators
1447
+ @items = build_items(specifier_qualifier_list, struct_declarators)
1448
+ end
1449
+
1450
+ attr_reader :specifier_qualifier_list
1451
+ attr_reader :struct_declarators
1452
+ attr_reader :items
1453
+
1454
+ def location
1455
+ @specifier_qualifier_list.location
1456
+ end
1457
+
1458
+ def to_s
1459
+ @items.map { |item| item.to_s + ";" }.join(" ")
1460
+ end
1461
+
1462
+ def inspect(indent = 0)
1463
+ ([" " * indent + "#{short_class_name} (#{location.inspect})"] +
1464
+ @items.map { |item| item.inspect(indent + 1) }).join("\n")
1465
+ end
1466
+
1467
+ private
1468
+ def build_items(specifier_qualifier_list, struct_declarators)
1469
+ result = []
1470
+ struct_declarators.each do |struct_declarator|
1471
+ # FIXME: Must support unnamed bit padding.
1472
+ next unless struct_declarator.declarator
1473
+ result.push(MemberDeclaration.new(specifier_qualifier_list,
1474
+ struct_declarator))
1475
+ end
1476
+ result
1477
+ end
1478
+ end
1479
+
1480
+ class MemberDeclaration < SyntaxNode
1481
+ def initialize(specifier_qualifier_list, struct_declarator)
1482
+ super()
1483
+ @specifier_qualifier_list = specifier_qualifier_list
1484
+ @struct_declarator = struct_declarator
1485
+ @type = nil
1486
+ end
1487
+
1488
+ attr_reader :specifier_qualifier_list
1489
+ attr_reader :struct_declarator
1490
+ attr_accessor :type
1491
+
1492
+ def identifier
1493
+ @struct_declarator.declarator.identifier
1494
+ end
1495
+
1496
+ def location
1497
+ identifier.location
1498
+ end
1499
+
1500
+ def to_s
1501
+ "#{type.brief_image} #{identifier.value}"
1502
+ end
1503
+
1504
+ def inspect(indent = 0)
1505
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
1506
+ identifier.value
1507
+ end
1508
+ end
1509
+
1510
+ class SpecifierQualifierList < SyntaxNode
1511
+ def initialize
1512
+ super
1513
+ @type_specifiers = []
1514
+ @type_qualifiers = []
1515
+ end
1516
+
1517
+ attr_reader :type_specifiers
1518
+ attr_reader :type_qualifiers
1519
+
1520
+ def location
1521
+ head_location
1522
+ end
1523
+
1524
+ def inspect(indent = 0)
1525
+ " " * indent + short_class_name
1526
+ end
1527
+ end
1528
+
1529
+ class StructDeclarator < SyntaxNode
1530
+ def initialize(declarator, expression)
1531
+ super()
1532
+ @declarator = declarator
1533
+ @expression = expression
1534
+ end
1535
+
1536
+ attr_reader :declarator
1537
+ attr_reader :expression
1538
+
1539
+ def location
1540
+ @declarator ? @declarator.location : @expression.location
1541
+ end
1542
+
1543
+ def bitfield?
1544
+ @expression != nil
1545
+ end
1546
+
1547
+ def inspect(indent = 0)
1548
+ " " * indent + short_class_name
1549
+ end
1550
+ end
1551
+
1552
+ class EnumSpecifier < TypeSpecifier
1553
+ def initialize(identifier, enumerators)
1554
+ super()
1555
+ @identifier = identifier
1556
+ @enumerators = enumerators
1557
+ end
1558
+
1559
+ attr_reader :identifier
1560
+ attr_reader :enumerators
1561
+
1562
+ def location
1563
+ @identifier.location
1564
+ end
1565
+
1566
+ def to_s
1567
+ if @enumerators
1568
+ if @enumerators.empty?
1569
+ "enum #{@identifier.value} {}"
1570
+ else
1571
+ "enum #{@identifier.value} { " +
1572
+ @enumerators.map { |enum| enum.to_s }.join(", ") + " }"
1573
+ end
1574
+ else
1575
+ "enum #{identifier.value}"
1576
+ end
1577
+ end
1578
+
1579
+ def inspect(indent = 0)
1580
+ " " * indent + short_class_name
1581
+ end
1582
+ end
1583
+
1584
+ class Enumerator < SyntaxNode
1585
+ include SymbolicElement
1586
+
1587
+ def initialize(identifier, expression, symbol)
1588
+ super()
1589
+ @identifier = identifier
1590
+ @expression = expression
1591
+ @symbol = symbol
1592
+ end
1593
+
1594
+ attr_reader :identifier
1595
+ attr_reader :expression
1596
+ attr_reader :symbol
1597
+ attr_accessor :value
1598
+
1599
+ def location
1600
+ @identifier.location
1601
+ end
1602
+
1603
+ def to_s
1604
+ if @expression
1605
+ "#{@identifier.value} = #{@expression.to_s}"
1606
+ else
1607
+ "#{@identifier.value}"
1608
+ end
1609
+ end
1610
+
1611
+ def inspect(indent = 0)
1612
+ " " * indent + short_class_name
1613
+ end
1614
+ end
1615
+
1616
+ class TypeofTypeSpecifier < TypeSpecifier
1617
+ def initialize(expression, type_name)
1618
+ super()
1619
+ @expression = expression
1620
+ @type_name = type_name
1621
+ end
1622
+
1623
+ attr_reader :expression
1624
+ attr_reader :type_name
1625
+
1626
+ def location
1627
+ head_location
1628
+ end
1629
+
1630
+ def to_s
1631
+ if @expression
1632
+ "__typeof__(#{@expression.to_s})"
1633
+ else
1634
+ "__typeof__(#{@type_name.to_s})"
1635
+ end
1636
+ end
1637
+
1638
+ def inspect(indent = 0)
1639
+ " " * indent + short_class_name
1640
+ end
1641
+ end
1642
+
1643
+ class Declarator < SyntaxNode
1644
+ def initialize
1645
+ super
1646
+ @pointer = nil
1647
+ end
1648
+
1649
+ attr_accessor :pointer
1650
+
1651
+ def identifier
1652
+ subclass_responsibility
1653
+ end
1654
+
1655
+ def abstract?
1656
+ false
1657
+ end
1658
+
1659
+ def base
1660
+ subclass_responsibility
1661
+ end
1662
+
1663
+ def function?
1664
+ subclass_responsibility
1665
+ end
1666
+
1667
+ def variable?
1668
+ !function?
1669
+ end
1670
+ end
1671
+
1672
+ class IdentifierDeclarator < Declarator
1673
+ def initialize(identifier)
1674
+ super()
1675
+ @identifier = identifier
1676
+ end
1677
+
1678
+ attr_reader :identifier
1679
+
1680
+ def location
1681
+ @identifier.location
1682
+ end
1683
+
1684
+ def base
1685
+ nil
1686
+ end
1687
+
1688
+ def parameter_type_list
1689
+ nil
1690
+ end
1691
+
1692
+ def identifier_list
1693
+ nil
1694
+ end
1695
+
1696
+ def function?(stack = [])
1697
+ stack.push(:pointer) if pointer
1698
+ stack.last == :function
1699
+ end
1700
+
1701
+ def inspect(indent = 0)
1702
+ " " * indent + "#{short_class_name} #{@identifier.value}"
1703
+ end
1704
+ end
1705
+
1706
+ class GroupedDeclarator < Declarator
1707
+ def initialize(declarator)
1708
+ super()
1709
+ @base = declarator
1710
+ end
1711
+
1712
+ attr_reader :base
1713
+
1714
+ def location
1715
+ @base.location
1716
+ end
1717
+
1718
+ def identifier
1719
+ @base.identifier
1720
+ end
1721
+
1722
+ def parameter_type_list
1723
+ @base.parameter_type_list
1724
+ end
1725
+
1726
+ def identifier_list
1727
+ @base.identifier_list
1728
+ end
1729
+
1730
+ def function?(stack = [])
1731
+ stack.push(:pointer) if pointer
1732
+ @base.function?(stack)
1733
+ stack.last == :function
1734
+ end
1735
+
1736
+ def inspect(indent = 0)
1737
+ " " * indent + "#{short_class_name}\n" + @base.inspect(indent + 1)
1738
+ end
1739
+ end
1740
+
1741
+ class ArrayDeclarator < Declarator
1742
+ def initialize(declarator, size_expression)
1743
+ super()
1744
+ @base = declarator
1745
+ @size_expression = size_expression
1746
+ end
1747
+
1748
+ attr_reader :base
1749
+ attr_reader :size_expression
1750
+
1751
+ def location
1752
+ @base.location
1753
+ end
1754
+
1755
+ def identifier
1756
+ @base.identifier
1757
+ end
1758
+
1759
+ def parameter_type_list
1760
+ @base.parameter_type_list
1761
+ end
1762
+
1763
+ def identifier_list
1764
+ @base.identifier_list
1765
+ end
1766
+
1767
+ def function?(stack = [])
1768
+ stack.push(:pointer) if pointer
1769
+ stack.push(:array)
1770
+ @base.function?(stack)
1771
+ stack.last == :function
1772
+ end
1773
+
1774
+ def inspect(indent = 0)
1775
+ " " * indent + "#{short_class_name}\n" + @base.inspect(indent + 1)
1776
+ end
1777
+ end
1778
+
1779
+ class FunctionDeclarator < Declarator
1780
+ def initialize(declarator)
1781
+ super()
1782
+ @base = declarator
1783
+ end
1784
+
1785
+ attr_reader :base
1786
+
1787
+ def location
1788
+ @base.location
1789
+ end
1790
+
1791
+ def identifier
1792
+ @base.identifier
1793
+ end
1794
+
1795
+ def function?(stack = [])
1796
+ stack.push(:pointer) if pointer
1797
+ stack.push(:function)
1798
+ @base.function?(stack)
1799
+ stack.last == :function
1800
+ end
1801
+
1802
+ def inspect(indent = 0)
1803
+ " " * indent + "#{short_class_name}\n" + @base.inspect(indent + 1)
1804
+ end
1805
+ end
1806
+
1807
+ class AnsiFunctionDeclarator < FunctionDeclarator
1808
+ def initialize(declarator, parameter_type_list)
1809
+ super(declarator)
1810
+ @parameter_type_list = parameter_type_list
1811
+ end
1812
+
1813
+ attr_accessor :parameter_type_list
1814
+
1815
+ def identifier_list
1816
+ @base.identifier_list
1817
+ end
1818
+ end
1819
+
1820
+ class KandRFunctionDeclarator < FunctionDeclarator
1821
+ def initialize(declarator, identifier_list)
1822
+ super(declarator)
1823
+ @identifier_list = identifier_list
1824
+ end
1825
+
1826
+ attr_reader :identifier_list
1827
+
1828
+ def parameter_type_list
1829
+ @base.parameter_type_list
1830
+ end
1831
+ end
1832
+
1833
+ class AbbreviatedFunctionDeclarator < FunctionDeclarator
1834
+ def parameter_type_list
1835
+ @base.parameter_type_list
1836
+ end
1837
+
1838
+ def identifier_list
1839
+ @base.identifier_list
1840
+ end
1841
+ end
1842
+
1843
+ class ParameterTypeList < SyntaxNode
1844
+ def initialize(parameters, have_va_list)
1845
+ super()
1846
+ @parameters = parameters
1847
+ @have_va_list = have_va_list
1848
+ end
1849
+
1850
+ attr_reader :parameters
1851
+
1852
+ def location
1853
+ head_location
1854
+ end
1855
+
1856
+ def have_va_list?
1857
+ @have_va_list
1858
+ end
1859
+
1860
+ def inspect(indent = 0)
1861
+ " " * indent + short_class_name
1862
+ end
1863
+ end
1864
+
1865
+ class ParameterDeclaration < SyntaxNode
1866
+ def initialize(declaration_specifiers, declarator)
1867
+ super()
1868
+ @declaration_specifiers = declaration_specifiers
1869
+ @declarator = declarator
1870
+ end
1871
+
1872
+ attr_reader :declaration_specifiers
1873
+ attr_reader :declarator
1874
+
1875
+ def location
1876
+ @declarator ? @declarator.location : @declaration_specifiers.location
1877
+ end
1878
+
1879
+ def inspect(indent = 0)
1880
+ " " * indent + short_class_name
1881
+ end
1882
+ end
1883
+
1884
+ class Statement < SyntaxNode
1885
+ def initialize
1886
+ super
1887
+ @executed = false
1888
+ end
1889
+
1890
+ attr_writer :executed
1891
+
1892
+ def executed?
1893
+ @executed
1894
+ end
1895
+ end
1896
+
1897
+ class ErrorStatement < Statement
1898
+ def initialize(error_token)
1899
+ super()
1900
+ @error_token = error_token
1901
+ end
1902
+
1903
+ def location
1904
+ head_location
1905
+ end
1906
+
1907
+ def inspect(indent = 0)
1908
+ " " * indent + "#{short_class_name}"
1909
+ end
1910
+ end
1911
+
1912
+ class LabeledStatement < Statement; end
1913
+
1914
+ class GenericLabeledStatement < LabeledStatement
1915
+ def initialize(label, statement)
1916
+ super()
1917
+ @label = label
1918
+ @statement = statement
1919
+ @referrers = []
1920
+ end
1921
+
1922
+ attr_reader :label
1923
+ attr_reader :statement
1924
+ attr_reader :referrers
1925
+
1926
+ def location
1927
+ @label.location
1928
+ end
1929
+
1930
+ def inspect(indent = 0)
1931
+ " " * indent + "#{short_class_name} (#{@label.inspect})\n" +
1932
+ @statement.inspect(indent + 1)
1933
+ end
1934
+ end
1935
+
1936
+ class CaseLabeledStatement < LabeledStatement
1937
+ def initialize(expression, statement)
1938
+ super()
1939
+ @expression = expression
1940
+ @statement = statement
1941
+ end
1942
+
1943
+ attr_reader :expression
1944
+ attr_reader :statement
1945
+ attr_accessor :normalized_expression
1946
+
1947
+ def location
1948
+ head_location
1949
+ end
1950
+
1951
+ def inspect(indent = 0)
1952
+ " " * indent + "#{short_class_name}\n" +
1953
+ @expression.inspect(indent + 1) + "\n" +
1954
+ @statement.inspect(indent + 1)
1955
+ end
1956
+ end
1957
+
1958
+ class DefaultLabeledStatement < LabeledStatement
1959
+ def initialize(statement)
1960
+ super()
1961
+ @statement = statement
1962
+ end
1963
+
1964
+ attr_reader :statement
1965
+ attr_accessor :normalized_expression
1966
+
1967
+ def location
1968
+ head_location
1969
+ end
1970
+
1971
+ def inspect(indent = 0)
1972
+ " " * indent + "#{short_class_name}\n" + @statement.inspect(indent + 1)
1973
+ end
1974
+ end
1975
+
1976
+ class CompoundStatement < Statement
1977
+ def initialize(block_items)
1978
+ super()
1979
+ @block_items = block_items
1980
+ end
1981
+
1982
+ attr_reader :block_items
1983
+
1984
+ def location
1985
+ head_location
1986
+ end
1987
+
1988
+ def inspect(indent = 0)
1989
+ ([" " * indent + short_class_name] +
1990
+ @block_items.map { |item| item.inspect(indent + 1) }).join("\n")
1991
+ end
1992
+ end
1993
+
1994
+ class ExpressionStatement < Statement
1995
+ def initialize(expression)
1996
+ super()
1997
+ @expression = expression
1998
+ end
1999
+
2000
+ attr_reader :expression
2001
+
2002
+ def location
2003
+ head_location
2004
+ end
2005
+
2006
+ def inspect(indent = 0)
2007
+ " " * indent + "#{short_class_name}" +
2008
+ (@expression ? "\n#{@expression.inspect(indent + 1)}" : "")
2009
+ end
2010
+ end
2011
+
2012
+ class SelectionStatement < Statement; end
2013
+
2014
+ class IfStatement < SelectionStatement
2015
+ def initialize(expression, statement, header_terminator)
2016
+ super()
2017
+ @expression = expression
2018
+ @statement = statement
2019
+ @header_terminator = header_terminator
2020
+ end
2021
+
2022
+ attr_reader :expression
2023
+ attr_reader :statement
2024
+ attr_reader :header_terminator
2025
+
2026
+ def location
2027
+ head_location
2028
+ end
2029
+
2030
+ def inspect(indent = 0)
2031
+ " " * indent + "#{short_class_name}\n" +
2032
+ @expression.inspect(indent + 1) + "\n" +
2033
+ @statement.inspect(indent + 1)
2034
+ end
2035
+ end
2036
+
2037
+ class IfElseStatement < SelectionStatement
2038
+ def initialize(expression, then_statement, else_statement,
2039
+ then_header_terminator, else_header_terminator)
2040
+ super()
2041
+ @expression = expression
2042
+ @then_statement = then_statement
2043
+ @else_statement = else_statement
2044
+ @then_header_terminator = then_header_terminator
2045
+ @else_header_terminator = else_header_terminator
2046
+ end
2047
+
2048
+ attr_reader :expression
2049
+ attr_reader :then_statement
2050
+ attr_reader :else_statement
2051
+ attr_reader :then_header_terminator
2052
+ attr_reader :else_header_terminator
2053
+
2054
+ def location
2055
+ head_location
2056
+ end
2057
+
2058
+ def inspect(indent = 0)
2059
+ " " * indent + "#{short_class_name}\n" +
2060
+ @expression.inspect(indent + 1) + "\n" +
2061
+ @then_statement.inspect(indent + 1) + "\n" +
2062
+ @else_statement.inspect(indent + 1)
2063
+ end
2064
+ end
2065
+
2066
+ class SwitchStatement < SelectionStatement
2067
+ def initialize(expression, statement)
2068
+ super()
2069
+ @expression = expression
2070
+ @statement = statement
2071
+ derive_clause_conditions
2072
+ end
2073
+
2074
+ attr_reader :expression
2075
+ attr_reader :statement
2076
+
2077
+ def location
2078
+ head_location
2079
+ end
2080
+
2081
+ def inspect(indent = 0)
2082
+ " " * indent + "#{short_class_name}\n" +
2083
+ @expression.inspect(indent + 1) + "\n" +
2084
+ @statement.inspect(indent + 1)
2085
+ end
2086
+
2087
+ private
2088
+ def derive_clause_conditions
2089
+ case_expressions = []
2090
+ default_labeled_statement = nil
2091
+
2092
+ @statement.block_items.each do |block_item|
2093
+ while block_item.kind_of?(GenericLabeledStatement)
2094
+ block_item = block_item.statement
2095
+ end
2096
+
2097
+ case block_item
2098
+ when CaseLabeledStatement
2099
+ block_item.normalized_expression = equal_to_expression(
2100
+ @expression, block_item.expression, block_item.location)
2101
+ case_expressions.push(block_item.normalized_expression)
2102
+ when DefaultLabeledStatement
2103
+ default_labeled_statement = block_item
2104
+ end
2105
+ end
2106
+
2107
+ if default_labeled_statement
2108
+ default_labeled_statement.normalized_expression =
2109
+ derive_default_clause_condition(case_expressions,
2110
+ default_labeled_statement.location)
2111
+ end
2112
+ end
2113
+
2114
+ def derive_default_clause_condition(case_expressions, location)
2115
+ if case_expressions.empty?
2116
+ equal_to_expression(@expression, @expression, location)
2117
+ else
2118
+ case_expressions.map { |expr|
2119
+ not_equal_to_expression(expr.lhs_operand, expr.rhs_operand, location)
2120
+ }.reduce do |result, expr|
2121
+ logical_and_expression(result, expr, location)
2122
+ end
2123
+ end
2124
+ end
2125
+
2126
+ def equal_to_expression(lhs, rhs, location)
2127
+ EqualityExpression.new(equal_to_operator(location), lhs, rhs)
2128
+ end
2129
+
2130
+ def not_equal_to_expression(lhs, rhs, location)
2131
+ EqualityExpression.new(not_equal_to_operator(location), lhs, rhs)
2132
+ end
2133
+
2134
+ def logical_and_expression(lhs, rhs, location)
2135
+ LogicalAndExpression.new(logical_and_operator(location), lhs, rhs)
2136
+ end
2137
+
2138
+ def equal_to_operator(location)
2139
+ Token.new("==", "==", location)
2140
+ end
2141
+
2142
+ def not_equal_to_operator(location)
2143
+ Token.new("!=", "!=", location)
2144
+ end
2145
+
2146
+ def logical_and_operator(location)
2147
+ Token.new("&&", "&&", location)
2148
+ end
2149
+ end
2150
+
2151
+ class IterationStatement < Statement
2152
+ include SyntaxNodeCollector
2153
+ extend Memoizable
2154
+
2155
+ def deduct_controlling_expression
2156
+ subclass_responsibility
2157
+ end
2158
+
2159
+ def varying_variable_names
2160
+ collect_varying_variable_names(self).uniq
2161
+ end
2162
+
2163
+ def varying_expressions
2164
+ collect_varying_binary_expressions(self) +
2165
+ collect_varying_unary_expressions(self)
2166
+ end
2167
+
2168
+ private
2169
+ def deduct_controlling_expression_candidates(expressions)
2170
+ varying_var_names = varying_variable_names
2171
+ expressions.compact.select do |expr|
2172
+ collect_object_specifiers(expr).any? do |os|
2173
+ varying_var_names.include?(os.identifier.value)
2174
+ end
2175
+ end
2176
+ end
2177
+
2178
+ def collect_loop_breaking_selection_statements(node)
2179
+ collect_loop_breaking_if_statements(node) +
2180
+ collect_loop_breaking_if_else_statements(node)
2181
+ end
2182
+
2183
+ def collect_loop_breaking_if_statements(node)
2184
+ collect_if_statements(node).select do |stmt|
2185
+ contain_loop_breaking?(stmt.statement)
2186
+ end
2187
+ end
2188
+
2189
+ def collect_loop_breaking_if_else_statements(node)
2190
+ collect_if_else_statements(node).select do |stmt|
2191
+ contain_loop_breaking?(stmt.then_statement) ||
2192
+ contain_loop_breaking?(stmt.else_statement)
2193
+ end
2194
+ end
2195
+
2196
+ def contain_loop_breaking?(node)
2197
+ items = node.kind_of?(CompoundStatement) ? node.block_items : [node]
2198
+ items.any? do |item|
2199
+ item = item.statement while item.kind_of?(GenericLabeledStatement)
2200
+ case item
2201
+ when GotoStatement
2202
+ # FIXME: Must check whether the goto-statement goes outside of the
2203
+ # loop or not.
2204
+ true
2205
+ when BreakStatement
2206
+ true
2207
+ when ReturnStatement
2208
+ true
2209
+ else
2210
+ false
2211
+ end
2212
+ end
2213
+ end
2214
+
2215
+ def collect_varying_variable_names(node)
2216
+ collect_varying_variable_names_in_binary_expression(node) +
2217
+ collect_varying_variable_names_in_unary_expression(node)
2218
+ end
2219
+
2220
+ def collect_varying_variable_names_in_binary_expression(node)
2221
+ collect_varying_binary_expressions(node).map do |expr|
2222
+ expr.lhs_operand.identifier.value
2223
+ end
2224
+ end
2225
+
2226
+ def collect_varying_binary_expressions(node)
2227
+ all_varying_binary_exprs =
2228
+ collect_simple_assignment_expressions(node) +
2229
+ collect_compound_assignment_expressions(node)
2230
+
2231
+ all_varying_binary_exprs.select do |expr|
2232
+ expr.lhs_operand.kind_of?(ObjectSpecifier)
2233
+ end
2234
+ end
2235
+ memoize :collect_varying_binary_expressions
2236
+
2237
+ def collect_varying_variable_names_in_unary_expression(node)
2238
+ collect_varying_unary_expressions(node).map do |expr|
2239
+ expr.operand.identifier.value
2240
+ end
2241
+ end
2242
+
2243
+ def collect_varying_unary_expressions(node)
2244
+ all_varying_unary_exprs =
2245
+ collect_prefix_increment_expressions(node) +
2246
+ collect_prefix_decrement_expressions(node) +
2247
+ collect_postfix_increment_expressions(node) +
2248
+ collect_postfix_decrement_expressions(node)
2249
+
2250
+ all_varying_unary_exprs.select do |expr|
2251
+ expr.operand.kind_of?(ObjectSpecifier)
2252
+ end
2253
+ end
2254
+ memoize :collect_varying_unary_expressions
2255
+ end
2256
+
2257
+ class WhileStatement < IterationStatement
2258
+ def initialize(expression, statement, header_terminator)
2259
+ super()
2260
+ @expression = expression
2261
+ @statement = statement
2262
+ @header_terminator = header_terminator
2263
+ end
2264
+
2265
+ attr_reader :expression
2266
+ attr_reader :statement
2267
+ attr_reader :header_terminator
2268
+
2269
+ def location
2270
+ head_location
2271
+ end
2272
+
2273
+ def deduct_controlling_expression
2274
+ selection_stmts = collect_loop_breaking_selection_statements(@statement)
2275
+ expressions = [
2276
+ @expression,
2277
+ *selection_stmts.map { |stmt| stmt.expression }
2278
+ ]
2279
+
2280
+ # FIXME: When many loop breaking selection-statements are found, how can
2281
+ # I select one selection-statement?
2282
+ # FIXME: When the loop breaking selection-statement is a
2283
+ # if-else-statement and the loop breaking is in the else branch,
2284
+ # the controlling expression should be inverted.
2285
+ deduct_controlling_expression_candidates(expressions).first
2286
+ end
2287
+
2288
+ def inspect(indent = 0)
2289
+ " " * indent + "#{short_class_name}\n" +
2290
+ @expression.inspect(indent + 1) + "\n" +
2291
+ @statement.inspect(indent + 1)
2292
+ end
2293
+ end
2294
+
2295
+ class DoStatement < IterationStatement
2296
+ def initialize(statement, expression, header_terminator, footer_initiator)
2297
+ super()
2298
+ @statement = statement
2299
+ @expression = expression
2300
+ @header_terminator = header_terminator
2301
+ @footer_initiator = footer_initiator
2302
+ end
2303
+
2304
+ attr_reader :statement
2305
+ attr_reader :expression
2306
+ attr_reader :header_terminator
2307
+ attr_reader :footer_initiator
2308
+
2309
+ def location
2310
+ head_location
2311
+ end
2312
+
2313
+ def deduct_controlling_expression
2314
+ selection_stmts = collect_loop_breaking_selection_statements(@statement)
2315
+ expressions = [
2316
+ @expression,
2317
+ *selection_stmts.map { |stmt| stmt.expression }
2318
+ ]
2319
+
2320
+ # FIXME: When many loop breaking selection-statements are found, how can
2321
+ # I select one selection-statement?
2322
+ # FIXME: When the loop breaking selection-statement is a
2323
+ # if-else-statement and the loop breaking is in the else branch,
2324
+ # the controlling expression should be inverted.
2325
+ deduct_controlling_expression_candidates(expressions).first
2326
+ end
2327
+
2328
+ def inspect(indent = 0)
2329
+ " " * indent + "#{short_class_name}\n" +
2330
+ @statement.inspect(indent + 1) + "\n" +
2331
+ @expression.inspect(indent + 1)
2332
+ end
2333
+ end
2334
+
2335
+ class ForStatement < IterationStatement
2336
+ def initialize(initial_statement, condition_statement, expression,
2337
+ body_statement, header_terminator)
2338
+ super()
2339
+ @initial_statement = initial_statement
2340
+ @condition_statement = condition_statement
2341
+ @expression = expression
2342
+ @body_statement = body_statement
2343
+ @header_terminator = header_terminator
2344
+ end
2345
+
2346
+ attr_reader :initial_statement
2347
+ attr_reader :condition_statement
2348
+ attr_reader :expression
2349
+ attr_reader :body_statement
2350
+ attr_reader :header_terminator
2351
+
2352
+ def location
2353
+ head_location
2354
+ end
2355
+
2356
+ def deduct_controlling_expression
2357
+ selection_stmts =
2358
+ collect_loop_breaking_selection_statements(@body_statement)
2359
+ expressions = [
2360
+ @condition_statement.expression,
2361
+ *selection_stmts.map { |stmt| stmt.expression }
2362
+ ]
2363
+
2364
+ # FIXME: When many loop breaking selection-statements are found, how can
2365
+ # I select one selection-statement?
2366
+ # FIXME: When the loop breaking selection-statement is a
2367
+ # if-else-statement and the loop breaking is in the else branch,
2368
+ # the controlling expression should be inverted.
2369
+ deduct_controlling_expression_candidates(expressions).first
2370
+ end
2371
+
2372
+ def inspect(indent = 0)
2373
+ " " * indent + "#{short_class_name}\n" +
2374
+ @initial_statement.inspect(indent + 1) + "\n" +
2375
+ @condition_statement.inspect(indent + 1) +
2376
+ (@expression ? "\n#{@expression.inspect(indent + 1)}" : "") +
2377
+ "\n" + @body_statement.inspect(indent + 1)
2378
+ end
2379
+ end
2380
+
2381
+ class C99ForStatement < IterationStatement
2382
+ def initialize(declaration, condition_statement, expression,
2383
+ body_statement, header_terminator)
2384
+ super()
2385
+ @declaration = declaration
2386
+ @condition_statement = condition_statement
2387
+ @expression = expression
2388
+ @body_statement = body_statement
2389
+ @header_terminator = header_terminator
2390
+ end
2391
+
2392
+ attr_reader :declaration
2393
+ attr_reader :condition_statement
2394
+ attr_reader :expression
2395
+ attr_reader :body_statement
2396
+ attr_reader :header_terminator
2397
+
2398
+ def location
2399
+ head_location
2400
+ end
2401
+
2402
+ def deduct_controlling_expression
2403
+ selection_stmts =
2404
+ collect_loop_breaking_selection_statements(@body_statement)
2405
+ expressions = [
2406
+ @condition_statement.expression,
2407
+ *selection_stmts.map { |stmt| stmt.expression }
2408
+ ]
2409
+
2410
+ # FIXME: When many loop breaking selection-statements are found, how can
2411
+ # I select one selection-statement?
2412
+ # FIXME: When the loop breaking selection-statement is a
2413
+ # if-else-statement and the loop breaking is in the else branch,
2414
+ # the controlling expression should be inverted.
2415
+ deduct_controlling_expression_candidates(expressions).first
2416
+ end
2417
+
2418
+ def inspect(indent = 0)
2419
+ " " * indent + "#{short_class_name}\n" +
2420
+ @declaration.inspect(indent + 1) + "\n" +
2421
+ @condition_statement.inspect(indent + 1) +
2422
+ (@expression ? "\n#{@expression.inspect(indent + 1)}" : "") +
2423
+ "\n" + @body_statement.inspect(indent + 1)
2424
+ end
2425
+ end
2426
+
2427
+ class JumpStatement < Statement
2428
+ def location
2429
+ head_location
2430
+ end
2431
+ end
2432
+
2433
+ class GotoStatement < JumpStatement
2434
+ def initialize(identifier)
2435
+ super()
2436
+ @identifier = identifier
2437
+ end
2438
+
2439
+ attr_reader :identifier
2440
+
2441
+ def inspect(indent = 0)
2442
+ " " * indent + "#{short_class_name} (#{@identifier.inspect})"
2443
+ end
2444
+ end
2445
+
2446
+ class ContinueStatement < JumpStatement
2447
+ def inspect(indent = 0)
2448
+ " " * indent + "#{short_class_name} (#{location.inspect})"
2449
+ end
2450
+ end
2451
+
2452
+ class BreakStatement < JumpStatement
2453
+ def inspect(indent = 0)
2454
+ " " * indent + "#{short_class_name} (#{location.inspect})"
2455
+ end
2456
+ end
2457
+
2458
+ class ReturnStatement < JumpStatement
2459
+ def initialize(expression)
2460
+ super()
2461
+ @expression = expression
2462
+ end
2463
+
2464
+ attr_reader :expression
2465
+
2466
+ def inspect(indent = 0)
2467
+ " " * indent + "#{short_class_name} (#{location.inspect})" +
2468
+ (@expression ? "\n#{@expression.inspect(indent + 1)}" : "")
2469
+ end
2470
+ end
2471
+
2472
+ class TranslationUnit < SyntaxNode
2473
+ def initialize
2474
+ super()
2475
+ @external_declarations = []
2476
+ end
2477
+
2478
+ attr_reader :external_declarations
2479
+
2480
+ def push(external_declaration)
2481
+ @external_declarations.push(external_declaration)
2482
+ self
2483
+ end
2484
+
2485
+ def location
2486
+ head_location ? head_location : Location.new
2487
+ end
2488
+
2489
+ def inspect(indent = 0)
2490
+ ([" " * indent + short_class_name] +
2491
+ @external_declarations.map { |d| d.inspect(indent + 1) }).join("\n")
2492
+ end
2493
+ end
2494
+
2495
+ class FunctionDefinition < Definition
2496
+ include SymbolicElement
2497
+ include SyntaxNodeCollector
2498
+
2499
+ def initialize(declaration_specifiers, declarator, parameter_definitions,
2500
+ compound_statement, symbol_table)
2501
+ super()
2502
+ @declaration_specifiers = declaration_specifiers
2503
+ @declarator = declarator
2504
+ @parameter_definitions = parameter_definitions
2505
+ @function_body = compound_statement
2506
+ @symbol = symbol_table.create_new_symbol(ObjectName, identifier)
2507
+ @type = nil
2508
+ @type_declaration = build_type_declaration(declaration_specifiers,
2509
+ symbol_table)
2510
+ build_label_references(compound_statement)
2511
+ end
2512
+
2513
+ attr_reader :declaration_specifiers
2514
+ attr_reader :declarator
2515
+ attr_reader :parameter_definitions
2516
+ attr_reader :function_body
2517
+ attr_reader :symbol
2518
+ attr_accessor :type
2519
+ attr_reader :type_declaration
2520
+
2521
+ def storage_class_specifier
2522
+ @declaration_specifiers ?
2523
+ @declaration_specifiers.storage_class_specifier : nil
2524
+ end
2525
+
2526
+ def function_specifier
2527
+ @declaration_specifiers ?
2528
+ @declaration_specifiers.function_specifier : nil
2529
+ end
2530
+
2531
+ def identifier
2532
+ @declarator.identifier
2533
+ end
2534
+
2535
+ def signature
2536
+ FunctionSignature.new(identifier, @type)
2537
+ end
2538
+
2539
+ def function_declarator
2540
+ collect_function_declarators(@declarator).first
2541
+ end
2542
+
2543
+ def lines
2544
+ start_line = identifier.location.line_no
2545
+ end_line = @function_body.tail_location.line_no
2546
+ end_line - start_line + 1
2547
+ end
2548
+
2549
+ def location
2550
+ identifier.location
2551
+ end
2552
+
2553
+ def inspect(indent = 0)
2554
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
2555
+ (storage_class_specifier ? "#{storage_class_specifier.value} " : "") +
2556
+ (function_specifier ? "#{function_specifier.value} " : "") +
2557
+ "#{identifier.value}\n" +
2558
+ @parameter_definitions.map { |p| p.inspect(indent + 1) }.join("\n") +
2559
+ "\n#{@function_body.inspect(indent + 1)}"
2560
+ end
2561
+
2562
+ private
2563
+ def build_type_declaration(declaration_specifiers, symbol_table)
2564
+ return nil unless declaration_specifiers
2565
+ declaration_specifiers.type_specifiers.each do |type_specifier|
2566
+ visitor = TypeDeclarationBuilder.new(symbol_table)
2567
+ type_specifier.accept(visitor)
2568
+ unless visitor.type_declarations.empty?
2569
+ return visitor.type_declarations.first
2570
+ end
2571
+ end
2572
+ nil
2573
+ end
2574
+
2575
+ def build_label_references(compound_statement)
2576
+ labels = collect_generic_labeled_statements(compound_statement)
2577
+
2578
+ gotos = collect_goto_statements(compound_statement)
2579
+
2580
+ labels.each do |generic_labeled_statement|
2581
+ label_name = generic_labeled_statement.label.value
2582
+ gotos.select { |goto_statement|
2583
+ goto_statement.identifier.value == label_name
2584
+ }.each do |goto_statement|
2585
+ generic_labeled_statement.referrers.push(goto_statement)
2586
+ end
2587
+ end
2588
+ end
2589
+ end
2590
+
2591
+ class KandRFunctionDefinition < FunctionDefinition
2592
+ def initialize(declaration_specifiers, declarator, declarations,
2593
+ compound_statement, symbol_table)
2594
+ parameter_definitions = create_parameters(declarator.identifier_list,
2595
+ declarations, symbol_table)
2596
+ super(declaration_specifiers, declarator, parameter_definitions,
2597
+ compound_statement, symbol_table)
2598
+ end
2599
+
2600
+ def identifier_list
2601
+ declarator.identifier_list
2602
+ end
2603
+
2604
+ private
2605
+ def create_parameters(parameter_names, declarations, symbol_table)
2606
+ return [] unless parameter_names
2607
+
2608
+ result = []
2609
+ parameter_names.each do |name|
2610
+ variable_definition =
2611
+ find_variable_definition(declarations, name, symbol_table)
2612
+ result.push(
2613
+ variable_definition_to_parameter_definition(variable_definition))
2614
+ end
2615
+ result
2616
+ end
2617
+
2618
+ def find_variable_definition(declarations, name, symbol_table)
2619
+ declarations.each do |declaration|
2620
+ declaration.items.select { |item|
2621
+ item.kind_of?(VariableDefinition)
2622
+ }.each do |definition|
2623
+ return definition if definition.identifier.value == name.value
2624
+ end
2625
+ end
2626
+
2627
+ declaration = implicit_parameter_definition(name, symbol_table)
2628
+ declarations.push(declaration)
2629
+ declaration.items.first
2630
+ end
2631
+
2632
+ def variable_definition_to_parameter_definition(variable_definition)
2633
+ declaration_specifiers = variable_definition.declaration_specifiers
2634
+ declarator = variable_definition.init_declarator.declarator
2635
+ pdef = ParameterDefinition.new(declaration_specifiers, declarator)
2636
+
2637
+ unless declaration_specifiers
2638
+ pdef.head_token = declarator.head_token
2639
+ pdef.tail_token = declarator.tail_token
2640
+ end
2641
+
2642
+ unless declarator
2643
+ pdef.head_token = declaration_specifiers.head_token
2644
+ pdef.tail_token = declaration_specifiers.tail_token
2645
+ end
2646
+
2647
+ pdef
2648
+ end
2649
+
2650
+ def implicit_parameter_definition(identifier, symbol_table)
2651
+ init_declarator =
2652
+ InitDeclarator.new(IdentifierDeclarator.new(identifier), nil)
2653
+ Declaration.new(nil, [init_declarator], symbol_table)
2654
+ end
2655
+ end
2656
+
2657
+ class AnsiFunctionDefinition < FunctionDefinition
2658
+ def initialize(declaration_specifiers, declarator,
2659
+ compound_statement, symbol_table)
2660
+ super(declaration_specifiers, declarator,
2661
+ create_parameters(declarator.parameter_type_list),
2662
+ compound_statement, symbol_table)
2663
+ end
2664
+
2665
+ def parameter_type_list
2666
+ declarator.parameter_type_list
2667
+ end
2668
+
2669
+ private
2670
+ def create_parameters(parameter_type_list)
2671
+ return [] unless parameter_type_list
2672
+ parameter_type_list.parameters.map do |parameter_declaration|
2673
+ declaration_specifiers = parameter_declaration.declaration_specifiers
2674
+ declarator = parameter_declaration.declarator
2675
+ pdef = ParameterDefinition.new(declaration_specifiers, declarator)
2676
+
2677
+ unless declaration_specifiers
2678
+ pdef.head_token = declarator.head_token
2679
+ pdef.tail_token = declarator.tail_token
2680
+ end
2681
+
2682
+ unless declarator
2683
+ pdef.head_token = declaration_specifiers.head_token
2684
+ pdef.tail_token = declaration_specifiers.tail_token
2685
+ end
2686
+
2687
+ pdef
2688
+ end
2689
+ end
2690
+ end
2691
+
2692
+ class ParameterDefinition < Definition
2693
+ def initialize(declaration_specifiers, declarator)
2694
+ super()
2695
+ @declaration_specifiers = declaration_specifiers
2696
+ @declarator = declarator
2697
+ @type = nil
2698
+ end
2699
+
2700
+ attr_reader :declaration_specifiers
2701
+ attr_reader :declarator
2702
+ attr_accessor :type
2703
+
2704
+ def identifier
2705
+ if @declarator
2706
+ if @declarator.abstract?
2707
+ nil
2708
+ else
2709
+ @declarator.identifier
2710
+ end
2711
+ else
2712
+ nil
2713
+ end
2714
+ end
2715
+
2716
+ def storage_class_specifier
2717
+ @declaration_specifiers ?
2718
+ @declaration_specifiers.storage_class_specifier : nil
2719
+ end
2720
+
2721
+ def location
2722
+ identifier ? identifier.location : nil
2723
+ end
2724
+
2725
+ def to_variable_definition
2726
+ PseudoVariableDefinition.new(@declaration_specifiers,
2727
+ InitDeclarator.new(@declarator, nil),
2728
+ @type)
2729
+ end
2730
+
2731
+ def inspect(indent = 0)
2732
+ " " * indent + "#{short_class_name} (#{location.inspect}) " +
2733
+ (storage_class_specifier ? storage_class_specifier.inspect : "") +
2734
+ (identifier ? identifier.value : "")
2735
+ end
2736
+ end
2737
+
2738
+ class PseudoVariableDefinition < VariableDefinition
2739
+ def initialize(declaration_specifiers, init_declarator, type)
2740
+ super(declaration_specifiers, init_declarator, nil)
2741
+ @type = type
2742
+ end
2743
+
2744
+ def mark_as_referred_by(token) end
2745
+ end
2746
+
2747
+ class TypeName < SyntaxNode
2748
+ def initialize(specifier_qualifier_list, abstract_declarator, symbol_table)
2749
+ super()
2750
+ @specifier_qualifier_list = specifier_qualifier_list
2751
+ @abstract_declarator = abstract_declarator
2752
+ @type = nil
2753
+ @type_declaration = build_type_declaration(specifier_qualifier_list,
2754
+ symbol_table)
2755
+ end
2756
+
2757
+ attr_reader :specifier_qualifier_list
2758
+ attr_reader :abstract_declarator
2759
+ attr_accessor :type
2760
+ attr_reader :type_declaration
2761
+
2762
+ def location
2763
+ @specifier_qualifier_list.location
2764
+ end
2765
+
2766
+ def to_s
2767
+ @type.image
2768
+ end
2769
+
2770
+ def inspect(indent = 0)
2771
+ " " * indent + short_class_name + " (#{@type ? @type.image : "nil"})"
2772
+ end
2773
+
2774
+ private
2775
+ def build_type_declaration(specifier_qualifier_list, symbol_table)
2776
+ specifier_qualifier_list.type_specifiers.each do |type_specifier|
2777
+ visitor = TypeDeclarationBuilder.new(symbol_table)
2778
+ type_specifier.accept(visitor)
2779
+ unless visitor.type_declarations.empty?
2780
+ return visitor.type_declarations.first
2781
+ end
2782
+ end
2783
+ nil
2784
+ end
2785
+ end
2786
+
2787
+ class AbstractDeclarator < Declarator
2788
+ def identifier
2789
+ nil
2790
+ end
2791
+
2792
+ def abstract?
2793
+ true
2794
+ end
2795
+ end
2796
+
2797
+ class PointerAbstractDeclarator < AbstractDeclarator
2798
+ def initialize(abstract_declarator, pointer)
2799
+ super()
2800
+ @base = abstract_declarator
2801
+ @pointer = pointer
2802
+ end
2803
+
2804
+ attr_reader :base
2805
+
2806
+ def location
2807
+ head_location
2808
+ end
2809
+
2810
+ def function?(stack = [])
2811
+ stack.push(:pointer)
2812
+ @base.function?(stack) if @base
2813
+ stack.last == :function
2814
+ end
2815
+
2816
+ def inspect(indent = 0)
2817
+ " " * indent + short_class_name
2818
+ end
2819
+ end
2820
+
2821
+ class GroupedAbstractDeclarator < AbstractDeclarator
2822
+ def initialize(abstract_declarator)
2823
+ super()
2824
+ @base = abstract_declarator
2825
+ end
2826
+
2827
+ attr_reader :base
2828
+
2829
+ def location
2830
+ @base.location
2831
+ end
2832
+
2833
+ def function?
2834
+ @base.function?
2835
+ end
2836
+
2837
+ def inspect(indent = 0)
2838
+ " " * indent + short_class_name
2839
+ end
2840
+ end
2841
+
2842
+ class ArrayAbstractDeclarator < AbstractDeclarator
2843
+ def initialize(abstract_declarator, size_expression)
2844
+ super()
2845
+ @base = abstract_declarator
2846
+ @size_expression = size_expression
2847
+ end
2848
+
2849
+ attr_reader :base
2850
+ attr_reader :size_expression
2851
+
2852
+ def location
2853
+ return @base.location if @base
2854
+ return @size_expression.location if @size_expression
2855
+ nil
2856
+ end
2857
+
2858
+ def function?(stack = [])
2859
+ stack.push(:array)
2860
+ @base.function?(stack) if @base
2861
+ stack.last == :function
2862
+ end
2863
+
2864
+ def inspect(indent = 0)
2865
+ " " * indent + short_class_name
2866
+ end
2867
+ end
2868
+
2869
+ class FunctionAbstractDeclarator < AbstractDeclarator
2870
+ def initialize(abstract_declarator, parameter_type_list)
2871
+ super()
2872
+ @base = abstract_declarator
2873
+ @parameter_type_list = parameter_type_list
2874
+ end
2875
+
2876
+ attr_reader :base
2877
+ attr_reader :parameter_type_list
2878
+
2879
+ def location
2880
+ return @base.location if @base
2881
+ return @parameter_type_list.location if @parameter_type_list
2882
+ nil
2883
+ end
2884
+
2885
+ def function?(stack = [])
2886
+ stack.push(:function)
2887
+ @base.function?(stack) if @base
2888
+ stack.last == :function
2889
+ end
2890
+
2891
+ def inspect(indent = 0)
2892
+ " " * indent + short_class_name
2893
+ end
2894
+ end
2895
+
2896
+ class Initializer < SyntaxNode
2897
+ def initialize(expression, initializers)
2898
+ super()
2899
+ @expression = expression
2900
+ @initializers = initializers
2901
+ end
2902
+
2903
+ attr_reader :expression
2904
+ attr_reader :initializers
2905
+
2906
+ def location
2907
+ head_location
2908
+ end
2909
+
2910
+ def to_s
2911
+ case
2912
+ when @expression
2913
+ @expression.to_s
2914
+ when @initializers
2915
+ "{#{@initializers.map { |ini| ini.to_s }.join(",")}}"
2916
+ else
2917
+ "{}"
2918
+ end
2919
+ end
2920
+
2921
+ def inspect(indent = 0)
2922
+ " " * indent + short_class_name
2923
+ end
2924
+ end
2925
+
2926
+ class FunctionSignature
2927
+ def initialize(name, type)
2928
+ @name = name
2929
+ @type = type
2930
+ end
2931
+
2932
+ attr_reader :name
2933
+
2934
+ def ==(rhs)
2935
+ if @type.parameter_types.empty? || rhs.type.parameter_types.empty?
2936
+ @name.value == rhs.name.value
2937
+ else
2938
+ @name.value == rhs.name.value && @type == rhs.type
2939
+ end
2940
+ end
2941
+
2942
+ def to_s
2943
+ "#{@type.return_type.brief_image} #{@name.value}(" +
2944
+ @type.parameter_types.map { |t| t.brief_image }.join(",") +
2945
+ (@type.have_va_list? ? ",...)" : ")")
2946
+ end
2947
+
2948
+ protected
2949
+ attr_reader :type
2950
+ end
2951
+
2952
+ class TypeDeclarationBuilder
2953
+ def initialize(symbol_table)
2954
+ @symbol_table = symbol_table
2955
+ @type_declarations = []
2956
+ end
2957
+
2958
+ attr_reader :type_declarations
2959
+
2960
+ def visit_standard_type_specifier(node)
2961
+ end
2962
+
2963
+ def visit_typedef_type_specifier(node)
2964
+ end
2965
+
2966
+ def visit_struct_specifier(node)
2967
+ if node.struct_declarations
2968
+ node.struct_declarations.each { |child| child.accept(self) }
2969
+ symbol = @symbol_table.create_new_symbol(StructTag, node.identifier)
2970
+ @type_declarations.push(StructTypeDeclaration.new(node, symbol))
2971
+ end
2972
+ end
2973
+
2974
+ def visit_union_specifier(node)
2975
+ if node.struct_declarations
2976
+ node.struct_declarations.each { |child| child.accept(self) }
2977
+ symbol = @symbol_table.create_new_symbol(UnionTag, node.identifier)
2978
+ @type_declarations.push(UnionTypeDeclaration.new(node, symbol))
2979
+ end
2980
+ end
2981
+
2982
+ def visit_enum_specifier(node)
2983
+ if node.enumerators
2984
+ symbol = @symbol_table.create_new_symbol(EnumTag, node.identifier)
2985
+ @type_declarations.push(EnumTypeDeclaration.new(node, symbol))
2986
+ end
2987
+ end
2988
+
2989
+ def visit_typeof_type_specifier(node)
2990
+ end
2991
+
2992
+ def visit_struct_declaration(node)
2993
+ node.specifier_qualifier_list.accept(self)
2994
+ end
2995
+
2996
+ def visit_specifier_qualifier_list(node)
2997
+ node.type_specifiers.each { |child| child.accept(self) }
2998
+ end
2999
+ end
3000
+
3001
+ class SyntaxTreeVisitor
3002
+ def visit_error_expression(node)
3003
+ end
3004
+
3005
+ def visit_object_specifier(node)
3006
+ end
3007
+
3008
+ def visit_constant_specifier(node)
3009
+ end
3010
+
3011
+ def visit_string_literal_specifier(node)
3012
+ end
3013
+
3014
+ def visit_null_constant_specifier(node)
3015
+ end
3016
+
3017
+ def visit_grouped_expression(node)
3018
+ node.expression.accept(self)
3019
+ end
3020
+
3021
+ def visit_array_subscript_expression(node)
3022
+ node.expression.accept(self)
3023
+ node.array_subscript.accept(self)
3024
+ end
3025
+
3026
+ def visit_function_call_expression(node)
3027
+ node.expression.accept(self)
3028
+ node.argument_expressions.each { |expr| expr.accept(self) }
3029
+ end
3030
+
3031
+ def visit_member_access_by_value_expression(node)
3032
+ node.expression.accept(self)
3033
+ end
3034
+
3035
+ def visit_member_access_by_pointer_expression(node)
3036
+ node.expression.accept(self)
3037
+ end
3038
+
3039
+ def visit_bit_access_by_value_expression(node)
3040
+ node.expression.accept(self)
3041
+ end
3042
+
3043
+ def visit_bit_access_by_pointer_expression(node)
3044
+ node.expression.accept(self)
3045
+ end
3046
+
3047
+ def visit_postfix_increment_expression(node)
3048
+ node.operand.accept(self)
3049
+ end
3050
+
3051
+ def visit_postfix_decrement_expression(node)
3052
+ node.operand.accept(self)
3053
+ end
3054
+
3055
+ def visit_compound_literal_expression(node)
3056
+ node.type_name.accept(self) if node.type_name
3057
+ node.initializers.each { |ini| ini.accept(self) }
3058
+ end
3059
+
3060
+ def visit_prefix_increment_expression(node)
3061
+ node.operand.accept(self)
3062
+ end
3063
+
3064
+ def visit_prefix_decrement_expression(node)
3065
+ node.operand.accept(self)
3066
+ end
3067
+
3068
+ def visit_address_expression(node)
3069
+ node.operand.accept(self)
3070
+ end
3071
+
3072
+ def visit_indirection_expression(node)
3073
+ node.operand.accept(self)
3074
+ end
3075
+
3076
+ def visit_unary_arithmetic_expression(node)
3077
+ node.operand.accept(self)
3078
+ end
3079
+
3080
+ def visit_sizeof_expression(node)
3081
+ node.operand.accept(self)
3082
+ end
3083
+
3084
+ def visit_sizeof_type_expression(node)
3085
+ node.operand.accept(self)
3086
+ end
3087
+
3088
+ def visit_alignof_expression(node)
3089
+ node.operand.accept(self)
3090
+ end
3091
+
3092
+ def visit_alignof_type_expression(node)
3093
+ node.operand.accept(self)
3094
+ end
3095
+
3096
+ def visit_cast_expression(node)
3097
+ node.type_name.accept(self)
3098
+ node.operand.accept(self)
3099
+ end
3100
+
3101
+ def visit_multiplicative_expression(node)
3102
+ node.lhs_operand.accept(self)
3103
+ node.rhs_operand.accept(self)
3104
+ end
3105
+
3106
+ def visit_additive_expression(node)
3107
+ node.lhs_operand.accept(self)
3108
+ node.rhs_operand.accept(self)
3109
+ end
3110
+
3111
+ def visit_shift_expression(node)
3112
+ node.lhs_operand.accept(self)
3113
+ node.rhs_operand.accept(self)
3114
+ end
3115
+
3116
+ def visit_relational_expression(node)
3117
+ node.lhs_operand.accept(self)
3118
+ node.rhs_operand.accept(self)
3119
+ end
3120
+
3121
+ def visit_equality_expression(node)
3122
+ node.lhs_operand.accept(self)
3123
+ node.rhs_operand.accept(self)
3124
+ end
3125
+
3126
+ def visit_and_expression(node)
3127
+ node.lhs_operand.accept(self)
3128
+ node.rhs_operand.accept(self)
3129
+ end
3130
+
3131
+ def visit_exclusive_or_expression(node)
3132
+ node.lhs_operand.accept(self)
3133
+ node.rhs_operand.accept(self)
3134
+ end
3135
+
3136
+ def visit_inclusive_or_expression(node)
3137
+ node.lhs_operand.accept(self)
3138
+ node.rhs_operand.accept(self)
3139
+ end
3140
+
3141
+ def visit_logical_and_expression(node)
3142
+ node.lhs_operand.accept(self)
3143
+ node.rhs_operand.accept(self)
3144
+ end
3145
+
3146
+ def visit_logical_or_expression(node)
3147
+ node.lhs_operand.accept(self)
3148
+ node.rhs_operand.accept(self)
3149
+ end
3150
+
3151
+ def visit_conditional_expression(node)
3152
+ node.condition.accept(self)
3153
+ node.then_expression.accept(self)
3154
+ node.else_expression.accept(self)
3155
+ end
3156
+
3157
+ def visit_simple_assignment_expression(node)
3158
+ node.lhs_operand.accept(self)
3159
+ node.rhs_operand.accept(self)
3160
+ end
3161
+
3162
+ def visit_compound_assignment_expression(node)
3163
+ node.lhs_operand.accept(self)
3164
+ node.rhs_operand.accept(self)
3165
+ end
3166
+
3167
+ def visit_comma_separated_expression(node)
3168
+ node.expressions.each { |expr| expr.accept(self) }
3169
+ end
3170
+
3171
+ def visit_declaration(node)
3172
+ node.declaration_specifiers.accept(self) if node.declaration_specifiers
3173
+ node.init_declarators.each { |decl| decl.accept(self) }
3174
+ node.items.each { |item| item.accept(self) }
3175
+ end
3176
+
3177
+ def visit_function_declaration(node)
3178
+ end
3179
+
3180
+ def visit_variable_declaration(node)
3181
+ end
3182
+
3183
+ def visit_variable_definition(node)
3184
+ end
3185
+
3186
+ def visit_typedef_declaration(node)
3187
+ end
3188
+
3189
+ def visit_struct_type_declaration(node)
3190
+ end
3191
+
3192
+ def visit_union_type_declaration(node)
3193
+ end
3194
+
3195
+ def visit_enum_type_declaration(node)
3196
+ end
3197
+
3198
+ def visit_declaration_specifiers(node)
3199
+ node.type_specifiers.each { |ts| ts.accept(self) }
3200
+ end
3201
+
3202
+ def visit_init_declarator(node)
3203
+ node.declarator.accept(self)
3204
+ node.initializer.accept(self) if node.initializer
3205
+ end
3206
+
3207
+ def visit_standard_type_specifier(node)
3208
+ end
3209
+
3210
+ def visit_typedef_type_specifier(node)
3211
+ end
3212
+
3213
+ def visit_struct_specifier(node)
3214
+ if node.struct_declarations
3215
+ node.struct_declarations.each { |decl| decl.accept(self) }
3216
+ end
3217
+ end
3218
+
3219
+ def visit_union_specifier(node)
3220
+ if node.struct_declarations
3221
+ node.struct_declarations.each { |decl| decl.accept(self) }
3222
+ end
3223
+ end
3224
+
3225
+ def visit_struct_declaration(node)
3226
+ node.specifier_qualifier_list.accept(self)
3227
+ node.struct_declarators.each { |decl| decl.accept(self) }
3228
+ node.items.each { |item| item.accept(self) }
3229
+ end
3230
+
3231
+ def visit_member_declaration(node)
3232
+ end
3233
+
3234
+ def visit_specifier_qualifier_list(node)
3235
+ node.type_specifiers.each { |ts| ts.accept(self) }
3236
+ end
3237
+
3238
+ def visit_struct_declarator(node)
3239
+ node.declarator.accept(self) if node.declarator
3240
+ node.expression.accept(self) if node.expression
3241
+ end
3242
+
3243
+ def visit_enum_specifier(node)
3244
+ if node.enumerators
3245
+ node.enumerators.each { |enum| enum.accept(self) }
3246
+ end
3247
+ end
3248
+
3249
+ def visit_enumerator(node)
3250
+ node.expression.accept(self) if node.expression
3251
+ end
3252
+
3253
+ def visit_typeof_type_specifier(node)
3254
+ node.expression.accept(self) if node.expression
3255
+ node.type_name.accept(self) if node.type_name
3256
+ end
3257
+
3258
+ def visit_identifier_declarator(node)
3259
+ end
3260
+
3261
+ def visit_grouped_declarator(node)
3262
+ node.base.accept(self)
3263
+ end
3264
+
3265
+ def visit_array_declarator(node)
3266
+ node.base.accept(self)
3267
+ node.size_expression.accept(self) if node.size_expression
3268
+ end
3269
+
3270
+ def visit_ansi_function_declarator(node)
3271
+ node.base.accept(self)
3272
+ node.parameter_type_list.accept(self)
3273
+ end
3274
+
3275
+ def visit_kandr_function_declarator(node)
3276
+ node.base.accept(self)
3277
+ end
3278
+
3279
+ def visit_abbreviated_function_declarator(node)
3280
+ node.base.accept(self)
3281
+ end
3282
+
3283
+ def visit_parameter_type_list(node)
3284
+ node.parameters.each { |param| param.accept(self) }
3285
+ end
3286
+
3287
+ def visit_parameter_declaration(node)
3288
+ node.declaration_specifiers.accept(self)
3289
+ node.declarator.accept(self) if node.declarator
3290
+ end
3291
+
3292
+ def visit_error_statement(node)
3293
+ end
3294
+
3295
+ def visit_generic_labeled_statement(node)
3296
+ node.statement.accept(self)
3297
+ end
3298
+
3299
+ def visit_case_labeled_statement(node)
3300
+ node.expression.accept(self)
3301
+ node.statement.accept(self)
3302
+ end
3303
+
3304
+ def visit_default_labeled_statement(node)
3305
+ node.statement.accept(self)
3306
+ end
3307
+
3308
+ def visit_compound_statement(node)
3309
+ node.block_items.each { |item| item.accept(self) }
3310
+ end
3311
+
3312
+ def visit_expression_statement(node)
3313
+ node.expression.accept(self) if node.expression
3314
+ end
3315
+
3316
+ def visit_if_statement(node)
3317
+ node.expression.accept(self)
3318
+ node.statement.accept(self)
3319
+ end
3320
+
3321
+ def visit_if_else_statement(node)
3322
+ node.expression.accept(self)
3323
+ node.then_statement.accept(self)
3324
+ node.else_statement.accept(self)
3325
+ end
3326
+
3327
+ def visit_switch_statement(node)
3328
+ node.expression.accept(self)
3329
+ node.statement.accept(self)
3330
+ end
3331
+
3332
+ def visit_while_statement(node)
3333
+ node.expression.accept(self)
3334
+ node.statement.accept(self)
3335
+ end
3336
+
3337
+ def visit_do_statement(node)
3338
+ node.statement.accept(self)
3339
+ node.expression.accept(self)
3340
+ end
3341
+
3342
+ def visit_for_statement(node)
3343
+ node.initial_statement.accept(self)
3344
+ node.condition_statement.accept(self)
3345
+ node.expression.accept(self) if node.expression
3346
+ node.body_statement.accept(self)
3347
+ end
3348
+
3349
+ def visit_c99_for_statement(node)
3350
+ node.declaration.accept(self)
3351
+ node.condition_statement.accept(self)
3352
+ node.expression.accept(self) if node.expression
3353
+ node.body_statement.accept(self)
3354
+ end
3355
+
3356
+ def visit_goto_statement(node)
3357
+ end
3358
+
3359
+ def visit_continue_statement(node)
3360
+ end
3361
+
3362
+ def visit_break_statement(node)
3363
+ end
3364
+
3365
+ def visit_return_statement(node)
3366
+ node.expression.accept(self) if node.expression
3367
+ end
3368
+
3369
+ def visit_translation_unit(node)
3370
+ node.external_declarations.each { |decl| decl.accept(self) }
3371
+ end
3372
+
3373
+ def visit_kandr_function_definition(node)
3374
+ node.declaration_specifiers.accept(self) if node.declaration_specifiers
3375
+ node.declarator.accept(self)
3376
+ node.parameter_definitions.each { |pdef| pdef.accept(self) }
3377
+ node.function_body.accept(self)
3378
+ node.type_declaration.accept(self) if node.type_declaration
3379
+ end
3380
+
3381
+ def visit_ansi_function_definition(node)
3382
+ node.declaration_specifiers.accept(self) if node.declaration_specifiers
3383
+ node.declarator.accept(self)
3384
+ node.parameter_definitions.each { |pdef| pdef.accept(self) }
3385
+ node.function_body.accept(self)
3386
+ node.type_declaration.accept(self) if node.type_declaration
3387
+ end
3388
+
3389
+ def visit_parameter_definition(node)
3390
+ end
3391
+
3392
+ def visit_type_name(node)
3393
+ node.specifier_qualifier_list.accept(self)
3394
+ node.abstract_declarator.accept(self) if node.abstract_declarator
3395
+ node.type_declaration.accept(self) if node.type_declaration
3396
+ end
3397
+
3398
+ def visit_pointer_abstract_declarator(node)
3399
+ node.base.accept(self) if node.base
3400
+ end
3401
+
3402
+ def visit_grouped_abstract_declarator(node)
3403
+ node.base.accept(self)
3404
+ end
3405
+
3406
+ def visit_array_abstract_declarator(node)
3407
+ node.base.accept(self) if node.base
3408
+ node.size_expression.accept(self) if node.size_expression
3409
+ end
3410
+
3411
+ def visit_function_abstract_declarator(node)
3412
+ node.base.accept(self) if node.base
3413
+ node.parameter_type_list.accept(self) if node.parameter_type_list
3414
+ end
3415
+
3416
+ def visit_initializer(node)
3417
+ case
3418
+ when node.expression
3419
+ node.expression.accept(self)
3420
+ when node.initializers
3421
+ node.initializers.each { |ini| ini.accept(self) }
3422
+ end
3423
+ end
3424
+ end
3425
+
3426
+ class SyntaxTreeMulticastVisitor < SyntaxTreeVisitor
3427
+ extend Pluggable
3428
+
3429
+ def_plugin :enter_error_expression
3430
+ def_plugin :leave_error_expression
3431
+ def_plugin :enter_object_specifier
3432
+ def_plugin :leave_object_specifier
3433
+ def_plugin :enter_constant_specifier
3434
+ def_plugin :leave_constant_specifier
3435
+ def_plugin :enter_string_literal_specifier
3436
+ def_plugin :leave_string_literal_specifier
3437
+ def_plugin :enter_null_constant_specifier
3438
+ def_plugin :leave_null_constant_specifier
3439
+ def_plugin :enter_grouped_expression
3440
+ def_plugin :leave_grouped_expression
3441
+ def_plugin :enter_array_subscript_expression
3442
+ def_plugin :leave_array_subscript_expression
3443
+ def_plugin :enter_function_call_expression
3444
+ def_plugin :leave_function_call_expression
3445
+ def_plugin :enter_member_access_by_value_expression
3446
+ def_plugin :leave_member_access_by_value_expression
3447
+ def_plugin :enter_member_access_by_pointer_expression
3448
+ def_plugin :leave_member_access_by_pointer_expression
3449
+ def_plugin :enter_bit_access_by_value_expression
3450
+ def_plugin :leave_bit_access_by_value_expression
3451
+ def_plugin :enter_bit_access_by_pointer_expression
3452
+ def_plugin :leave_bit_access_by_pointer_expression
3453
+ def_plugin :enter_postfix_increment_expression
3454
+ def_plugin :leave_postfix_increment_expression
3455
+ def_plugin :enter_postfix_decrement_expression
3456
+ def_plugin :leave_postfix_decrement_expression
3457
+ def_plugin :enter_compound_literal_expression
3458
+ def_plugin :leave_compound_literal_expression
3459
+ def_plugin :enter_prefix_increment_expression
3460
+ def_plugin :leave_prefix_increment_expression
3461
+ def_plugin :enter_prefix_decrement_expression
3462
+ def_plugin :leave_prefix_decrement_expression
3463
+ def_plugin :enter_address_expression
3464
+ def_plugin :leave_address_expression
3465
+ def_plugin :enter_indirection_expression
3466
+ def_plugin :leave_indirection_expression
3467
+ def_plugin :enter_unary_arithmetic_expression
3468
+ def_plugin :leave_unary_arithmetic_expression
3469
+ def_plugin :enter_sizeof_expression
3470
+ def_plugin :leave_sizeof_expression
3471
+ def_plugin :enter_sizeof_type_expression
3472
+ def_plugin :leave_sizeof_type_expression
3473
+ def_plugin :enter_alignof_expression
3474
+ def_plugin :leave_alignof_expression
3475
+ def_plugin :enter_alignof_type_expression
3476
+ def_plugin :leave_alignof_type_expression
3477
+ def_plugin :enter_cast_expression
3478
+ def_plugin :leave_cast_expression
3479
+ def_plugin :enter_multiplicative_expression
3480
+ def_plugin :leave_multiplicative_expression
3481
+ def_plugin :enter_additive_expression
3482
+ def_plugin :leave_additive_expression
3483
+ def_plugin :enter_shift_expression
3484
+ def_plugin :leave_shift_expression
3485
+ def_plugin :enter_relational_expression
3486
+ def_plugin :leave_relational_expression
3487
+ def_plugin :enter_equality_expression
3488
+ def_plugin :leave_equality_expression
3489
+ def_plugin :enter_and_expression
3490
+ def_plugin :leave_and_expression
3491
+ def_plugin :enter_exclusive_or_expression
3492
+ def_plugin :leave_exclusive_or_expression
3493
+ def_plugin :enter_inclusive_or_expression
3494
+ def_plugin :leave_inclusive_or_expression
3495
+ def_plugin :enter_logical_and_expression
3496
+ def_plugin :leave_logical_and_expression
3497
+ def_plugin :enter_logical_or_expression
3498
+ def_plugin :leave_logical_or_expression
3499
+ def_plugin :enter_conditional_expression
3500
+ def_plugin :leave_conditional_expression
3501
+ def_plugin :enter_simple_assignment_expression
3502
+ def_plugin :leave_simple_assignment_expression
3503
+ def_plugin :enter_compound_assignment_expression
3504
+ def_plugin :leave_compound_assignment_expression
3505
+ def_plugin :enter_comma_separated_expression
3506
+ def_plugin :leave_comma_separated_expression
3507
+ def_plugin :enter_declaration
3508
+ def_plugin :leave_declaration
3509
+ def_plugin :enter_function_declaration
3510
+ def_plugin :leave_function_declaration
3511
+ def_plugin :enter_variable_declaration
3512
+ def_plugin :leave_variable_declaration
3513
+ def_plugin :enter_variable_definition
3514
+ def_plugin :leave_variable_definition
3515
+ def_plugin :enter_typedef_declaration
3516
+ def_plugin :leave_typedef_declaration
3517
+ def_plugin :enter_struct_type_declaration
3518
+ def_plugin :leave_struct_type_declaration
3519
+ def_plugin :enter_union_type_declaration
3520
+ def_plugin :leave_union_type_declaration
3521
+ def_plugin :enter_enum_type_declaration
3522
+ def_plugin :leave_enum_type_declaration
3523
+ def_plugin :enter_declaration_specifiers
3524
+ def_plugin :leave_declaration_specifiers
3525
+ def_plugin :enter_init_declarator
3526
+ def_plugin :leave_init_declarator
3527
+ def_plugin :enter_standard_type_specifier
3528
+ def_plugin :leave_standard_type_specifier
3529
+ def_plugin :enter_typedef_type_specifier
3530
+ def_plugin :leave_typedef_type_specifier
3531
+ def_plugin :enter_struct_specifier
3532
+ def_plugin :leave_struct_specifier
3533
+ def_plugin :enter_union_specifier
3534
+ def_plugin :leave_union_specifier
3535
+ def_plugin :enter_struct_declaration
3536
+ def_plugin :leave_struct_declaration
3537
+ def_plugin :enter_member_declaration
3538
+ def_plugin :leave_member_declaration
3539
+ def_plugin :enter_specifier_qualifier_list
3540
+ def_plugin :leave_specifier_qualifier_list
3541
+ def_plugin :enter_struct_declarator
3542
+ def_plugin :leave_struct_declarator
3543
+ def_plugin :enter_enum_specifier
3544
+ def_plugin :leave_enum_specifier
3545
+ def_plugin :enter_enumerator
3546
+ def_plugin :leave_enumerator
3547
+ def_plugin :enter_typeof_type_specifier
3548
+ def_plugin :leave_typeof_type_specifier
3549
+ def_plugin :enter_identifier_declarator
3550
+ def_plugin :leave_identifier_declarator
3551
+ def_plugin :enter_grouped_declarator
3552
+ def_plugin :leave_grouped_declarator
3553
+ def_plugin :enter_array_declarator
3554
+ def_plugin :leave_array_declarator
3555
+ def_plugin :enter_ansi_function_declarator
3556
+ def_plugin :leave_ansi_function_declarator
3557
+ def_plugin :enter_kandr_function_declarator
3558
+ def_plugin :leave_kandr_function_declarator
3559
+ def_plugin :enter_abbreviated_function_declarator
3560
+ def_plugin :leave_abbreviated_function_declarator
3561
+ def_plugin :enter_parameter_type_list
3562
+ def_plugin :leave_parameter_type_list
3563
+ def_plugin :enter_parameter_declaration
3564
+ def_plugin :leave_parameter_declaration
3565
+ def_plugin :enter_error_statement
3566
+ def_plugin :leave_error_statement
3567
+ def_plugin :enter_generic_labeled_statement
3568
+ def_plugin :leave_generic_labeled_statement
3569
+ def_plugin :enter_case_labeled_statement
3570
+ def_plugin :leave_case_labeled_statement
3571
+ def_plugin :enter_default_labeled_statement
3572
+ def_plugin :leave_default_labeled_statement
3573
+ def_plugin :enter_compound_statement
3574
+ def_plugin :leave_compound_statement
3575
+ def_plugin :enter_expression_statement
3576
+ def_plugin :leave_expression_statement
3577
+ def_plugin :enter_if_statement
3578
+ def_plugin :leave_if_statement
3579
+ def_plugin :enter_if_else_statement
3580
+ def_plugin :leave_if_else_statement
3581
+ def_plugin :enter_switch_statement
3582
+ def_plugin :leave_switch_statement
3583
+ def_plugin :enter_while_statement
3584
+ def_plugin :leave_while_statement
3585
+ def_plugin :enter_do_statement
3586
+ def_plugin :leave_do_statement
3587
+ def_plugin :enter_for_statement
3588
+ def_plugin :leave_for_statement
3589
+ def_plugin :enter_c99_for_statement
3590
+ def_plugin :leave_c99_for_statement
3591
+ def_plugin :enter_goto_statement
3592
+ def_plugin :leave_goto_statement
3593
+ def_plugin :enter_continue_statement
3594
+ def_plugin :leave_continue_statement
3595
+ def_plugin :enter_break_statement
3596
+ def_plugin :leave_break_statement
3597
+ def_plugin :enter_return_statement
3598
+ def_plugin :leave_return_statement
3599
+ def_plugin :enter_translation_unit
3600
+ def_plugin :leave_translation_unit
3601
+ def_plugin :enter_kandr_function_definition
3602
+ def_plugin :leave_kandr_function_definition
3603
+ def_plugin :enter_ansi_function_definition
3604
+ def_plugin :leave_ansi_function_definition
3605
+ def_plugin :enter_parameter_definition
3606
+ def_plugin :leave_parameter_definition
3607
+ def_plugin :enter_type_name
3608
+ def_plugin :leave_type_name
3609
+ def_plugin :enter_pointer_abstract_declarator
3610
+ def_plugin :leave_pointer_abstract_declarator
3611
+ def_plugin :enter_grouped_abstract_declarator
3612
+ def_plugin :leave_grouped_abstract_declarator
3613
+ def_plugin :enter_array_abstract_declarator
3614
+ def_plugin :leave_array_abstract_declarator
3615
+ def_plugin :enter_function_abstract_declarator
3616
+ def_plugin :leave_function_abstract_declarator
3617
+ def_plugin :enter_initializer
3618
+ def_plugin :leave_initializer
3619
+
3620
+ def visit_error_expression(node)
3621
+ visit_with_notifying(__method__, node) { super }
3622
+ end
3623
+
3624
+ def visit_object_specifier(node)
3625
+ visit_with_notifying(__method__, node) { super }
3626
+ end
3627
+
3628
+ def visit_constant_specifier(node)
3629
+ visit_with_notifying(__method__, node) { super }
3630
+ end
3631
+
3632
+ def visit_string_literal_specifier(node)
3633
+ visit_with_notifying(__method__, node) { super }
3634
+ end
3635
+
3636
+ def visit_null_constant_specifier(node)
3637
+ visit_with_notifying(__method__, node) { super }
3638
+ end
3639
+
3640
+ def visit_grouped_expression(node)
3641
+ visit_with_notifying(__method__, node) { super }
3642
+ end
3643
+
3644
+ def visit_array_subscript_expression(node)
3645
+ visit_with_notifying(__method__, node) { super }
3646
+ end
3647
+
3648
+ def visit_function_call_expression(node)
3649
+ visit_with_notifying(__method__, node) { super }
3650
+ end
3651
+
3652
+ def visit_member_access_by_value_expression(node)
3653
+ visit_with_notifying(__method__, node) { super }
3654
+ end
3655
+
3656
+ def visit_member_access_by_pointer_expression(node)
3657
+ visit_with_notifying(__method__, node) { super }
3658
+ end
3659
+
3660
+ def visit_bit_access_by_value_expression(node)
3661
+ visit_with_notifying(__method__, node) { super }
3662
+ end
3663
+
3664
+ def visit_bit_access_by_pointer_expression(node)
3665
+ visit_with_notifying(__method__, node) { super }
3666
+ end
3667
+
3668
+ def visit_postfix_increment_expression(node)
3669
+ visit_with_notifying(__method__, node) { super }
3670
+ end
3671
+
3672
+ def visit_postfix_decrement_expression(node)
3673
+ visit_with_notifying(__method__, node) { super }
3674
+ end
3675
+
3676
+ def visit_compound_literal_expression(node)
3677
+ visit_with_notifying(__method__, node) { super }
3678
+ end
3679
+
3680
+ def visit_prefix_increment_expression(node)
3681
+ visit_with_notifying(__method__, node) { super }
3682
+ end
3683
+
3684
+ def visit_prefix_decrement_expression(node)
3685
+ visit_with_notifying(__method__, node) { super }
3686
+ end
3687
+
3688
+ def visit_address_expression(node)
3689
+ visit_with_notifying(__method__, node) { super }
3690
+ end
3691
+
3692
+ def visit_indirection_expression(node)
3693
+ visit_with_notifying(__method__, node) { super }
3694
+ end
3695
+
3696
+ def visit_unary_arithmetic_expression(node)
3697
+ visit_with_notifying(__method__, node) { super }
3698
+ end
3699
+
3700
+ def visit_sizeof_expression(node)
3701
+ visit_with_notifying(__method__, node) { super }
3702
+ end
3703
+
3704
+ def visit_sizeof_type_expression(node)
3705
+ visit_with_notifying(__method__, node) { super }
3706
+ end
3707
+
3708
+ def visit_alignof_expression(node)
3709
+ visit_with_notifying(__method__, node) { super }
3710
+ end
3711
+
3712
+ def visit_alignof_type_expression(node)
3713
+ visit_with_notifying(__method__, node) { super }
3714
+ end
3715
+
3716
+ def visit_cast_expression(node)
3717
+ visit_with_notifying(__method__, node) { super }
3718
+ end
3719
+
3720
+ def visit_multiplicative_expression(node)
3721
+ visit_with_notifying(__method__, node) { super }
3722
+ end
3723
+
3724
+ def visit_additive_expression(node)
3725
+ visit_with_notifying(__method__, node) { super }
3726
+ end
3727
+
3728
+ def visit_shift_expression(node)
3729
+ visit_with_notifying(__method__, node) { super }
3730
+ end
3731
+
3732
+ def visit_relational_expression(node)
3733
+ visit_with_notifying(__method__, node) { super }
3734
+ end
3735
+
3736
+ def visit_equality_expression(node)
3737
+ visit_with_notifying(__method__, node) { super }
3738
+ end
3739
+
3740
+ def visit_and_expression(node)
3741
+ visit_with_notifying(__method__, node) { super }
3742
+ end
3743
+
3744
+ def visit_exclusive_or_expression(node)
3745
+ visit_with_notifying(__method__, node) { super }
3746
+ end
3747
+
3748
+ def visit_inclusive_or_expression(node)
3749
+ visit_with_notifying(__method__, node) { super }
3750
+ end
3751
+
3752
+ def visit_logical_and_expression(node)
3753
+ visit_with_notifying(__method__, node) { super }
3754
+ end
3755
+
3756
+ def visit_logical_or_expression(node)
3757
+ visit_with_notifying(__method__, node) { super }
3758
+ end
3759
+
3760
+ def visit_conditional_expression(node)
3761
+ visit_with_notifying(__method__, node) { super }
3762
+ end
3763
+
3764
+ def visit_simple_assignment_expression(node)
3765
+ visit_with_notifying(__method__, node) { super }
3766
+ end
3767
+
3768
+ def visit_compound_assignment_expression(node)
3769
+ visit_with_notifying(__method__, node) { super }
3770
+ end
3771
+
3772
+ def visit_comma_separated_expression(node)
3773
+ visit_with_notifying(__method__, node) { super }
3774
+ end
3775
+
3776
+ def visit_declaration(node)
3777
+ visit_with_notifying(__method__, node) { super }
3778
+ end
3779
+
3780
+ def visit_function_declaration(node)
3781
+ visit_with_notifying(__method__, node) { super }
3782
+ end
3783
+
3784
+ def visit_variable_declaration(node)
3785
+ visit_with_notifying(__method__, node) { super }
3786
+ end
3787
+
3788
+ def visit_variable_definition(node)
3789
+ visit_with_notifying(__method__, node) { super }
3790
+ end
3791
+
3792
+ def visit_typedef_declaration(node)
3793
+ visit_with_notifying(__method__, node) { super }
3794
+ end
3795
+
3796
+ def visit_struct_type_declaration(node)
3797
+ visit_with_notifying(__method__, node) { super }
3798
+ end
3799
+
3800
+ def visit_union_type_declaration(node)
3801
+ visit_with_notifying(__method__, node) { super }
3802
+ end
3803
+
3804
+ def visit_enum_type_declaration(node)
3805
+ visit_with_notifying(__method__, node) { super }
3806
+ end
3807
+
3808
+ def visit_declaration_specifiers(node)
3809
+ visit_with_notifying(__method__, node) { super }
3810
+ end
3811
+
3812
+ def visit_init_declarator(node)
3813
+ visit_with_notifying(__method__, node) { super }
3814
+ end
3815
+
3816
+ def visit_standard_type_specifier(node)
3817
+ visit_with_notifying(__method__, node) { super }
3818
+ end
3819
+
3820
+ def visit_typedef_type_specifier(node)
3821
+ visit_with_notifying(__method__, node) { super }
3822
+ end
3823
+
3824
+ def visit_struct_specifier(node)
3825
+ visit_with_notifying(__method__, node) { super }
3826
+ end
3827
+
3828
+ def visit_union_specifier(node)
3829
+ visit_with_notifying(__method__, node) { super }
3830
+ end
3831
+
3832
+ def visit_struct_declaration(node)
3833
+ visit_with_notifying(__method__, node) { super }
3834
+ end
3835
+
3836
+ def visit_member_declaration(node)
3837
+ visit_with_notifying(__method__, node) { super }
3838
+ end
3839
+
3840
+ def visit_specifier_qualifier_list(node)
3841
+ visit_with_notifying(__method__, node) { super }
3842
+ end
3843
+
3844
+ def visit_struct_declarator(node)
3845
+ visit_with_notifying(__method__, node) { super }
3846
+ end
3847
+
3848
+ def visit_enum_specifier(node)
3849
+ visit_with_notifying(__method__, node) { super }
3850
+ end
3851
+
3852
+ def visit_enumerator(node)
3853
+ visit_with_notifying(__method__, node) { super }
3854
+ end
3855
+
3856
+ def visit_typeof_type_specifier(node)
3857
+ visit_with_notifying(__method__, node) { super }
3858
+ end
3859
+
3860
+ def visit_identifier_declarator(node)
3861
+ visit_with_notifying(__method__, node) { super }
3862
+ end
3863
+
3864
+ def visit_grouped_declarator(node)
3865
+ visit_with_notifying(__method__, node) { super }
3866
+ end
3867
+
3868
+ def visit_array_declarator(node)
3869
+ visit_with_notifying(__method__, node) { super }
3870
+ end
3871
+
3872
+ def visit_ansi_function_declarator(node)
3873
+ visit_with_notifying(__method__, node) { super }
3874
+ end
3875
+
3876
+ def visit_kandr_function_declarator(node)
3877
+ visit_with_notifying(__method__, node) { super }
3878
+ end
3879
+
3880
+ def visit_abbreviated_function_declarator(node)
3881
+ visit_with_notifying(__method__, node) { super }
3882
+ end
3883
+
3884
+ def visit_parameter_type_list(node)
3885
+ visit_with_notifying(__method__, node) { super }
3886
+ end
3887
+
3888
+ def visit_parameter_declaration(node)
3889
+ visit_with_notifying(__method__, node) { super }
3890
+ end
3891
+
3892
+ def visit_error_statement(node)
3893
+ visit_with_notifying(__method__, node) { super }
3894
+ end
3895
+
3896
+ def visit_generic_labeled_statement(node)
3897
+ visit_with_notifying(__method__, node) { super }
3898
+ end
3899
+
3900
+ def visit_case_labeled_statement(node)
3901
+ visit_with_notifying(__method__, node) { super }
3902
+ end
3903
+
3904
+ def visit_default_labeled_statement(node)
3905
+ visit_with_notifying(__method__, node) { super }
3906
+ end
3907
+
3908
+ def visit_compound_statement(node)
3909
+ visit_with_notifying(__method__, node) { super }
3910
+ end
3911
+
3912
+ def visit_expression_statement(node)
3913
+ visit_with_notifying(__method__, node) { super }
3914
+ end
3915
+
3916
+ def visit_if_statement(node)
3917
+ visit_with_notifying(__method__, node) { super }
3918
+ end
3919
+
3920
+ def visit_if_else_statement(node)
3921
+ visit_with_notifying(__method__, node) { super }
3922
+ end
3923
+
3924
+ def visit_switch_statement(node)
3925
+ visit_with_notifying(__method__, node) { super }
3926
+ end
3927
+
3928
+ def visit_while_statement(node)
3929
+ visit_with_notifying(__method__, node) { super }
3930
+ end
3931
+
3932
+ def visit_do_statement(node)
3933
+ visit_with_notifying(__method__, node) { super }
3934
+ end
3935
+
3936
+ def visit_for_statement(node)
3937
+ visit_with_notifying(__method__, node) { super }
3938
+ end
3939
+
3940
+ def visit_c99_for_statement(node)
3941
+ visit_with_notifying(__method__, node) { super }
3942
+ end
3943
+
3944
+ def visit_goto_statement(node)
3945
+ visit_with_notifying(__method__, node) { super }
3946
+ end
3947
+
3948
+ def visit_continue_statement(node)
3949
+ visit_with_notifying(__method__, node) { super }
3950
+ end
3951
+
3952
+ def visit_break_statement(node)
3953
+ visit_with_notifying(__method__, node) { super }
3954
+ end
3955
+
3956
+ def visit_return_statement(node)
3957
+ visit_with_notifying(__method__, node) { super }
3958
+ end
3959
+
3960
+ def visit_translation_unit(node)
3961
+ visit_with_notifying(__method__, node) { super }
3962
+ end
3963
+
3964
+ def visit_kandr_function_definition(node)
3965
+ visit_with_notifying(__method__, node) { super }
3966
+ end
3967
+
3968
+ def visit_ansi_function_definition(node)
3969
+ visit_with_notifying(__method__, node) { super }
3970
+ end
3971
+
3972
+ def visit_parameter_definition(node)
3973
+ visit_with_notifying(__method__, node) { super }
3974
+ end
3975
+
3976
+ def visit_type_name(node)
3977
+ visit_with_notifying(__method__, node) { super }
3978
+ end
3979
+
3980
+ def visit_pointer_abstract_declarator(node)
3981
+ visit_with_notifying(__method__, node) { super }
3982
+ end
3983
+
3984
+ def visit_grouped_abstract_declarator(node)
3985
+ visit_with_notifying(__method__, node) { super }
3986
+ end
3987
+
3988
+ def visit_array_abstract_declarator(node)
3989
+ visit_with_notifying(__method__, node) { super }
3990
+ end
3991
+
3992
+ def visit_function_abstract_declarator(node)
3993
+ visit_with_notifying(__method__, node) { super }
3994
+ end
3995
+
3996
+ def visit_initializer(node)
3997
+ visit_with_notifying(__method__, node) { super }
3998
+ end
3999
+
4000
+ private
4001
+ def visit_with_notifying(caller_method, node, &block)
4002
+ suffix = caller_method.to_s.sub(/\Avisit_/, "")
4003
+ __send__("enter_#{suffix}").invoke(node)
4004
+ yield
4005
+ __send__("leave_#{suffix}").invoke(node)
4006
+ end
4007
+ end
4008
+
4009
+ class ObjectSpecifierCollector < SyntaxTreeVisitor
4010
+ def initialize
4011
+ @object_specifiers = []
4012
+ end
4013
+
4014
+ attr_reader :object_specifiers
4015
+
4016
+ def visit_object_specifier(node)
4017
+ super
4018
+ @object_specifiers.push(node)
4019
+ end
4020
+ end
4021
+
4022
+ class IdentifierDeclaratorCollector < SyntaxTreeVisitor
4023
+ def initialize
4024
+ @identifier_declarators = []
4025
+ end
4026
+
4027
+ attr_reader :identifier_declarators
4028
+
4029
+ def visit_identifier_declarator(node)
4030
+ super
4031
+ @identifier_declarators.push(node)
4032
+ end
4033
+ end
4034
+
4035
+ class FunctionDeclaratorCollector < SyntaxTreeVisitor
4036
+ def initialize
4037
+ @function_declarators = []
4038
+ end
4039
+
4040
+ attr_reader :function_declarators
4041
+
4042
+ def visit_ansi_function_declarator(node)
4043
+ @function_declarators.push(node)
4044
+ super
4045
+ end
4046
+
4047
+ def visit_kandr_function_declarator(node)
4048
+ @function_declarators.push(node)
4049
+ super
4050
+ end
4051
+ end
4052
+
4053
+ class SimpleAssignmentExpressionCollector < SyntaxTreeVisitor
4054
+ def initialize
4055
+ @simple_assignment_expressions = []
4056
+ end
4057
+
4058
+ attr_reader :simple_assignment_expressions
4059
+
4060
+ def visit_simple_assignment_expression(node)
4061
+ super
4062
+ @simple_assignment_expressions.push(node)
4063
+ end
4064
+ end
4065
+
4066
+ class CompoundAssignmentExpressionCollector < SyntaxTreeVisitor
4067
+ def initialize
4068
+ @compound_assignment_expressions = []
4069
+ end
4070
+
4071
+ attr_reader :compound_assignment_expressions
4072
+
4073
+ def visit_compound_assignment_expression(node)
4074
+ super
4075
+ @compound_assignment_expressions.push(node)
4076
+ end
4077
+ end
4078
+
4079
+ class PrefixIncrementExpressionCollector < SyntaxTreeVisitor
4080
+ def initialize
4081
+ @prefix_increment_expressions = []
4082
+ end
4083
+
4084
+ attr_reader :prefix_increment_expressions
4085
+
4086
+ def visit_prefix_increment_expression(node)
4087
+ super
4088
+ @prefix_increment_expressions.push(node)
4089
+ end
4090
+ end
4091
+
4092
+ class PrefixDecrementExpressionCollector < SyntaxTreeVisitor
4093
+ def initialize
4094
+ @prefix_decrement_expressions = []
4095
+ end
4096
+
4097
+ attr_reader :prefix_decrement_expressions
4098
+
4099
+ def visit_prefix_decrement_expression(node)
4100
+ super
4101
+ @prefix_decrement_expressions.push(node)
4102
+ end
4103
+ end
4104
+
4105
+ class PostfixIncrementExpressionCollector < SyntaxTreeVisitor
4106
+ def initialize
4107
+ @postfix_increment_expressions = []
4108
+ end
4109
+
4110
+ attr_reader :postfix_increment_expressions
4111
+
4112
+ def visit_postfix_increment_expression(node)
4113
+ super
4114
+ @postfix_increment_expressions.push(node)
4115
+ end
4116
+ end
4117
+
4118
+ class PostfixDecrementExpressionCollector < SyntaxTreeVisitor
4119
+ def initialize
4120
+ @postfix_decrement_expressions = []
4121
+ end
4122
+
4123
+ attr_reader :postfix_decrement_expressions
4124
+
4125
+ def visit_postfix_decrement_expression(node)
4126
+ super
4127
+ @postfix_decrement_expressions.push(node)
4128
+ end
4129
+ end
4130
+
4131
+ class AdditiveExpressionCollector < SyntaxTreeVisitor
4132
+ def initialize
4133
+ @additive_expressions = []
4134
+ end
4135
+
4136
+ attr_reader :additive_expressions
4137
+
4138
+ def visit_additive_expression(node)
4139
+ super
4140
+ @additive_expressions.push(node)
4141
+ end
4142
+ end
4143
+
4144
+ class GenericLabeledStatementCollector < SyntaxTreeVisitor
4145
+ def initialize
4146
+ @generic_labeled_statements = []
4147
+ end
4148
+
4149
+ attr_reader :generic_labeled_statements
4150
+
4151
+ def visit_generic_labeled_statement(node)
4152
+ super
4153
+ @generic_labeled_statements.push(node)
4154
+ end
4155
+ end
4156
+
4157
+ class IfStatementCollector < SyntaxTreeVisitor
4158
+ def initialize
4159
+ @if_statements = []
4160
+ end
4161
+
4162
+ attr_reader :if_statements
4163
+
4164
+ def visit_if_statement(node)
4165
+ super
4166
+ @if_statements.push(node)
4167
+ end
4168
+ end
4169
+
4170
+ class IfElseStatementCollector < SyntaxTreeVisitor
4171
+ def initialize
4172
+ @if_else_statements = []
4173
+ end
4174
+
4175
+ attr_reader :if_else_statements
4176
+
4177
+ def visit_if_else_statement(node)
4178
+ super
4179
+ @if_else_statements.push(node)
4180
+ end
4181
+ end
4182
+
4183
+ class GotoStatementCollector < SyntaxTreeVisitor
4184
+ def initialize
4185
+ @goto_statements = []
4186
+ end
4187
+
4188
+ attr_reader :goto_statements
4189
+
4190
+ def visit_goto_statement(node)
4191
+ @goto_statements.push(node)
4192
+ end
4193
+ end
4194
+
4195
+ class ArrayDeclaratorCollector < SyntaxTreeVisitor
4196
+ def initialize
4197
+ @array_declarators = []
4198
+ end
4199
+
4200
+ attr_reader :array_declarators
4201
+
4202
+ def visit_array_declarator(node)
4203
+ @array_declarators.push(node)
4204
+ super
4205
+ end
4206
+ end
4207
+
4208
+ class ConstantSpecifierCollector < SyntaxTreeVisitor
4209
+ def initialize
4210
+ @constant_specifiers = []
4211
+ end
4212
+
4213
+ attr_reader :constant_specifiers
4214
+
4215
+ def visit_constant_specifier(node)
4216
+ @constant_specifiers.push(node)
4217
+ end
4218
+ end
4219
+
4220
+ class ExpressionExtractor < SyntaxTreeVisitor
4221
+ def initialize
4222
+ @expressions = []
4223
+ end
4224
+
4225
+ attr_reader :expressions
4226
+
4227
+ def push_expression(expression)
4228
+ @expressions.push(expression)
4229
+ end
4230
+
4231
+ alias :visit_grouped_expression :push_expression
4232
+ alias :visit_array_subscript_expression :push_expression
4233
+ alias :visit_function_call_expression :push_expression
4234
+ alias :visit_member_access_by_value_expression :push_expression
4235
+ alias :visit_member_access_by_pointer_expression :push_expression
4236
+ alias :visit_bit_access_by_value_expression :push_expression
4237
+ alias :visit_bit_access_by_pointer_expression :push_expression
4238
+ alias :visit_postfix_increment_expression :push_expression
4239
+ alias :visit_postfix_decrement_expression :push_expression
4240
+ alias :visit_compound_literal_expression :push_expression
4241
+ alias :visit_prefix_increment_expression :push_expression
4242
+ alias :visit_prefix_decrement_expression :push_expression
4243
+ alias :visit_address_expression :push_expression
4244
+ alias :visit_indirection_expression :push_expression
4245
+ alias :visit_unary_arithmetic_expression :push_expression
4246
+ alias :visit_sizeof_expression :push_expression
4247
+ alias :visit_alignof_expression :push_expression
4248
+ alias :visit_cast_expression :push_expression
4249
+ alias :visit_multiplicative_expression :push_expression
4250
+ alias :visit_additive_expression :push_expression
4251
+ alias :visit_shift_expression :push_expression
4252
+ alias :visit_relational_expression :push_expression
4253
+ alias :visit_equality_expression :push_expression
4254
+ alias :visit_and_expression :push_expression
4255
+ alias :visit_exclusive_or_expression :push_expression
4256
+ alias :visit_inclusive_or_expression :push_expression
4257
+ alias :visit_logical_and_expression :push_expression
4258
+ alias :visit_logical_or_expression :push_expression
4259
+ alias :visit_conditional_expression :push_expression
4260
+ alias :visit_simple_assignment_expression :push_expression
4261
+ alias :visit_compound_assignment_expression :push_expression
4262
+
4263
+ private :push_expression
4264
+ end
4265
+
4266
+ class ConditionalExpressionExtractor < SyntaxTreeVisitor
4267
+ def initialize
4268
+ @expressions = []
4269
+ end
4270
+
4271
+ attr_reader :expressions
4272
+
4273
+ def visit_conditional_expression(node)
4274
+ @expressions.push(node)
4275
+ end
4276
+ end
4277
+
4278
+ end
4279
+ end