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,2054 @@
1
+ # The ISO C99 parser.
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
+ class AdLint::C::Parser
33
+
34
+ token IDENTIFIER
35
+ TYPEDEF_NAME
36
+ CONSTANT
37
+ STRING_LITERAL
38
+ SIZEOF
39
+ TYPEDEF
40
+ EXTERN
41
+ STATIC
42
+ AUTO
43
+ REGISTER
44
+ INLINE
45
+ RESTRICT
46
+ CHAR
47
+ SHORT
48
+ INT
49
+ LONG
50
+ SIGNED
51
+ UNSIGNED
52
+ FLOAT
53
+ DOUBLE
54
+ CONST
55
+ VOLATILE
56
+ VOID
57
+ BOOL
58
+ COMPLEX
59
+ IMAGINARY
60
+ STRUCT
61
+ UNION
62
+ ENUM
63
+ CASE
64
+ DEFAULT
65
+ IF
66
+ ELSE
67
+ SWITCH
68
+ WHILE
69
+ DO
70
+ FOR
71
+ GOTO
72
+ CONTINUE
73
+ BREAK
74
+ RETURN
75
+ NULL
76
+ TYPEOF
77
+ ALIGNOF
78
+
79
+ start translation_unit
80
+
81
+ expect 1 # NOTE: To ignore dangling-else shift/reduce conflict.
82
+
83
+ rule
84
+
85
+ #
86
+ # Expressions
87
+ #
88
+ primary_expression
89
+ : IDENTIFIER
90
+ {
91
+ checkpoint(val[0].location)
92
+
93
+ result = ObjectSpecifier.new(val[0])
94
+ result.head_token = result.tail_token = val[0]
95
+ }
96
+ | CONSTANT
97
+ {
98
+ checkpoint(val[0].location)
99
+
100
+ result = ConstantSpecifier.new(val[0])
101
+ result.head_token = result.tail_token = val[0]
102
+ }
103
+ | STRING_LITERAL
104
+ {
105
+ checkpoint(val[0].location)
106
+
107
+ result = StringLiteralSpecifier.new(val[0])
108
+ result.head_token = result.tail_token = val[0]
109
+ }
110
+ | NULL
111
+ {
112
+ checkpoint(val[0].location)
113
+
114
+ result = NullConstantSpecifier.new(val[0])
115
+ result.head_token = result.tail_token = val[0]
116
+ }
117
+ | "(" expression ")"
118
+ {
119
+ checkpoint(val[0].location)
120
+
121
+ result = GroupedExpression.new(val[1])
122
+ result.head_token = val[0]
123
+ result.tail_token = val[2]
124
+ }
125
+ | "(" compound_statement ")"
126
+ {
127
+ checkpoint(val[0].location)
128
+
129
+ E(:E0013, val[0].location)
130
+ result = ErrorExpression.new(val[0])
131
+ result.head_token = val[0]
132
+ result.tail_token = val[2]
133
+ }
134
+ ;
135
+
136
+ postfix_expression
137
+ : primary_expression
138
+ | postfix_expression "[" expression "]"
139
+ {
140
+ checkpoint(val[0].location)
141
+
142
+ result = ArraySubscriptExpression.new(val[0], val[2], val[1])
143
+ result.head_token = val[0].head_token
144
+ result.tail_token = val[3]
145
+ }
146
+ | postfix_expression "(" ")"
147
+ {
148
+ checkpoint(val[0].location)
149
+
150
+ result = FunctionCallExpression.new(val[0], [], val[1])
151
+ result.head_token = val[0].head_token
152
+ result.tail_token = val[2]
153
+ }
154
+ | postfix_expression "(" argument_expression_list ")"
155
+ {
156
+ checkpoint(val[0].location)
157
+
158
+ result = FunctionCallExpression.new(val[0], val[2], val [1])
159
+ result.head_token = val[0].head_token
160
+ result.tail_token = val[3]
161
+ }
162
+ | postfix_expression "." IDENTIFIER
163
+ {
164
+ checkpoint(val[0].location)
165
+
166
+ result = MemberAccessByValueExpression.new(val[0], val[2], val[1])
167
+ result.head_token = val[0].head_token
168
+ result.tail_token = val[2]
169
+ }
170
+ | postfix_expression "->" IDENTIFIER
171
+ {
172
+ checkpoint(val[0].location)
173
+
174
+ result = MemberAccessByPointerExpression.new(val[0], val[2], val[1])
175
+ result.head_token = val[0].head_token
176
+ result.tail_token = val[2]
177
+ }
178
+ | postfix_expression "." CONSTANT
179
+ {
180
+ checkpoint(val[0].location)
181
+
182
+ result = BitAccessByValueExpression.new(val[0], val[2], val[1])
183
+ result.head_token = val[0].head_token
184
+ result.tail_token = val[2]
185
+ }
186
+ | postfix_expression "->" CONSTANT
187
+ {
188
+ checkpoint(val[0].location)
189
+
190
+ result = BitAccessByPointerExpression.new(val[0], val[2], val[1])
191
+ result.head_token = val[0].head_token
192
+ result.tail_token = val[2]
193
+ }
194
+ | postfix_expression "++"
195
+ {
196
+ checkpoint(val[0].location)
197
+
198
+ result = PostfixIncrementExpression.new(val[0], val[1])
199
+ result.head_token = val[0].head_token
200
+ result.tail_token = val[1]
201
+ }
202
+ | postfix_expression "--"
203
+ {
204
+ checkpoint(val[0].location)
205
+
206
+ result = PostfixDecrementExpression.new(val[0], val[1])
207
+ result.head_token = val[0].head_token
208
+ result.tail_token = val[1]
209
+ }
210
+ | "(" type_name ")" "{" initializer_list "}"
211
+ {
212
+ checkpoint(val[0].location)
213
+
214
+ result = CompoundLiteralExpression.new(val[1], val[4], val[0])
215
+ result.head_token = val[0]
216
+ result.tail_token = val[5]
217
+ }
218
+ | "(" type_name ")" "{" initializer_list "," "}"
219
+ {
220
+ checkpoint(val[0].location)
221
+
222
+ result = CompoundLiteralExpression.new(val[1], val[4], val[0])
223
+ result.head_token = val[0]
224
+ result.tail_token = val[6]
225
+ }
226
+ ;
227
+
228
+ argument_expression_list
229
+ : assignment_expression
230
+ {
231
+ checkpoint(val[0].location)
232
+
233
+ result = val
234
+ }
235
+ | argument_expression_list "," assignment_expression
236
+ {
237
+ checkpoint(val[0].first.location)
238
+
239
+ result = val[0].push(val[2])
240
+ }
241
+ ;
242
+
243
+ unary_expression
244
+ : postfix_expression
245
+ | "++" unary_expression
246
+ {
247
+ checkpoint(val[0].location)
248
+
249
+ result = PrefixIncrementExpression.new(val[0], val[1])
250
+ result.head_token = val[0]
251
+ result.tail_token = val[1].tail_token
252
+ }
253
+ | "--" unary_expression
254
+ {
255
+ checkpoint(val[0].location)
256
+
257
+ result = PrefixDecrementExpression.new(val[0], val[1])
258
+ result.head_token = val[0]
259
+ result.tail_token = val[1].tail_token
260
+ }
261
+ | "&" cast_expression
262
+ {
263
+ checkpoint(val[0].location)
264
+
265
+ result = AddressExpression.new(val[0], val[1])
266
+ result.head_token = val[0]
267
+ result.tail_token = val[1].tail_token
268
+ }
269
+ | "*" cast_expression
270
+ {
271
+ checkpoint(val[0].location)
272
+
273
+ result = IndirectionExpression.new(val[0], val[1])
274
+ result.head_token = val[0]
275
+ result.tail_token = val[1].tail_token
276
+ }
277
+ | unary_arithmetic_operator cast_expression
278
+ {
279
+ checkpoint(val[0].location)
280
+
281
+ result = UnaryArithmeticExpression.new(val[0], val[1])
282
+ result.head_token = val[0]
283
+ result.tail_token = val[1].tail_token
284
+ }
285
+ | SIZEOF unary_expression
286
+ {
287
+ checkpoint(val[0].location)
288
+
289
+ result = SizeofExpression.new(val[0], val[1])
290
+ result.head_token = val[0]
291
+ result.tail_token = val[1].tail_token
292
+ }
293
+ | SIZEOF "(" type_name ")"
294
+ {
295
+ checkpoint(val[0].location)
296
+
297
+ result = SizeofTypeExpression.new(val[0], val[2])
298
+ result.head_token = val[0]
299
+ result.tail_token = val[3]
300
+ }
301
+ | ALIGNOF unary_expression
302
+ {
303
+ checkpoint(val[0].location)
304
+
305
+ result = AlignofExpression.new(val[0], val[1])
306
+ result.head_token = val[0]
307
+ result.tail_token = val[1].tail_token
308
+ }
309
+ | ALIGNOF "(" type_name ")"
310
+ {
311
+ checkpoint(val[0].location)
312
+
313
+ result = AlignofTypeExpression.new(val[0], val[2])
314
+ result.head_token = val[0]
315
+ result.tail_token = val[3]
316
+ }
317
+ | "&&" unary_expression
318
+ {
319
+ checkpoint(val[0].location)
320
+
321
+ E(:E0014, val[0].location, val[0].value)
322
+ result = ErrorExpression.new(val[0])
323
+ result.head_token = val[0]
324
+ result.tail_token = val[1].tail_token
325
+ }
326
+ ;
327
+
328
+ unary_arithmetic_operator
329
+ : "+"
330
+ | "-"
331
+ | "~"
332
+ | "!"
333
+ ;
334
+
335
+ cast_expression
336
+ : unary_expression
337
+ | "(" type_name ")" cast_expression
338
+ {
339
+ checkpoint(val[0].location)
340
+
341
+ result = CastExpression.new(val[1], val[3])
342
+ result.head_token = val[0]
343
+ result.tail_token = val[3].tail_token
344
+ }
345
+ ;
346
+
347
+ multiplicative_expression
348
+ : cast_expression
349
+ | multiplicative_expression "*" cast_expression
350
+ {
351
+ checkpoint(val[0].location)
352
+
353
+ result = MultiplicativeExpression.new(val[1], val[0], val[2])
354
+ result.head_token = val[0].head_token
355
+ result.tail_token = val[2].tail_token
356
+ }
357
+ | multiplicative_expression "/" cast_expression
358
+ {
359
+ checkpoint(val[0].location)
360
+
361
+ result = MultiplicativeExpression.new(val[1], val[0], val[2])
362
+ result.head_token = val[0].head_token
363
+ result.tail_token = val[2].tail_token
364
+ }
365
+ | multiplicative_expression "%" cast_expression
366
+ {
367
+ checkpoint(val[0].location)
368
+
369
+ result = MultiplicativeExpression.new(val[1], val[0], val[2])
370
+ result.head_token = val[0].head_token
371
+ result.tail_token = val[2].tail_token
372
+ }
373
+ ;
374
+
375
+ additive_expression
376
+ : multiplicative_expression
377
+ | additive_expression "+" multiplicative_expression
378
+ {
379
+ checkpoint(val[0].location)
380
+
381
+ result = AdditiveExpression.new(val[1], val[0], val[2])
382
+ result.head_token = val[0].head_token
383
+ result.tail_token = val[2].tail_token
384
+ }
385
+ | additive_expression "-" multiplicative_expression
386
+ {
387
+ checkpoint(val[0].location)
388
+
389
+ result = AdditiveExpression.new(val[1], val[0], val[2])
390
+ result.head_token = val[0].head_token
391
+ result.tail_token = val[2].tail_token
392
+ }
393
+ ;
394
+
395
+ shift_expression
396
+ : additive_expression
397
+ | shift_expression "<<" additive_expression
398
+ {
399
+ checkpoint(val[0].location)
400
+
401
+ result = ShiftExpression.new(val[1], val[0], val[2])
402
+ result.head_token = val[0].head_token
403
+ result.tail_token = val[2].tail_token
404
+ }
405
+ | shift_expression ">>" additive_expression
406
+ {
407
+ checkpoint(val[0].location)
408
+
409
+ result = ShiftExpression.new(val[1], val[0], val[2])
410
+ result.head_token = val[0].head_token
411
+ result.tail_token = val[2].tail_token
412
+ }
413
+ ;
414
+
415
+ relational_expression
416
+ : shift_expression
417
+ | relational_expression "<" shift_expression
418
+ {
419
+ checkpoint(val[0].location)
420
+
421
+ result = RelationalExpression.new(val[1], val[0], val[2])
422
+ result.head_token = val[0].head_token
423
+ result.tail_token = val[2].tail_token
424
+ }
425
+ | relational_expression ">" shift_expression
426
+ {
427
+ checkpoint(val[0].location)
428
+
429
+ result = RelationalExpression.new(val[1], val[0], val[2])
430
+ result.head_token = val[0].head_token
431
+ result.tail_token = val[2].tail_token
432
+ }
433
+ | relational_expression "<=" shift_expression
434
+ {
435
+ checkpoint(val[0].location)
436
+
437
+ result = RelationalExpression.new(val[1], val[0], val[2])
438
+ result.head_token = val[0].head_token
439
+ result.tail_token = val[2].tail_token
440
+ }
441
+ | relational_expression ">=" shift_expression
442
+ {
443
+ checkpoint(val[0].location)
444
+
445
+ result = RelationalExpression.new(val[1], val[0], val[2])
446
+ result.head_token = val[0].head_token
447
+ result.tail_token = val[2].tail_token
448
+ }
449
+ ;
450
+
451
+ equality_expression
452
+ : relational_expression
453
+ | equality_expression "==" relational_expression
454
+ {
455
+ checkpoint(val[0].location)
456
+
457
+ result = EqualityExpression.new(val[1], val[0], val[2])
458
+ result.head_token = val[0].head_token
459
+ result.tail_token = val[2].tail_token
460
+ }
461
+ | equality_expression "!=" relational_expression
462
+ {
463
+ checkpoint(val[0].location)
464
+
465
+ result = EqualityExpression.new(val[1], val[0], val[2])
466
+ result.head_token = val[0].head_token
467
+ result.tail_token = val[2].tail_token
468
+ }
469
+ ;
470
+
471
+ and_expression
472
+ : equality_expression
473
+ | and_expression "&" equality_expression
474
+ {
475
+ checkpoint(val[0].location)
476
+
477
+ result = AndExpression.new(val[1], val[0], val[2])
478
+ result.head_token = val[0].head_token
479
+ result.tail_token = val[2].tail_token
480
+ }
481
+ ;
482
+
483
+ exclusive_or_expression
484
+ : and_expression
485
+ | exclusive_or_expression "^" and_expression
486
+ {
487
+ checkpoint(val[0].location)
488
+
489
+ result = ExclusiveOrExpression.new(val[1], val[0], val[2])
490
+ result.head_token = val[0].head_token
491
+ result.tail_token = val[2].tail_token
492
+ }
493
+ ;
494
+
495
+ inclusive_or_expression
496
+ : exclusive_or_expression
497
+ | inclusive_or_expression "|" exclusive_or_expression
498
+ {
499
+ checkpoint(val[0].location)
500
+
501
+ result = InclusiveOrExpression.new(val[1], val[0], val[2])
502
+ result.head_token = val[0].head_token
503
+ result.tail_token = val[2].tail_token
504
+ }
505
+ ;
506
+
507
+ logical_and_expression
508
+ : inclusive_or_expression
509
+ | logical_and_expression "&&" inclusive_or_expression
510
+ {
511
+ checkpoint(val[0].location)
512
+
513
+ result = LogicalAndExpression.new(val[1], val[0], val[2])
514
+ result.head_token = val[0].head_token
515
+ result.tail_token = val[2].tail_token
516
+ }
517
+ ;
518
+
519
+ logical_or_expression
520
+ : logical_and_expression
521
+ | logical_or_expression "||" logical_and_expression
522
+ {
523
+ checkpoint(val[0].location)
524
+
525
+ result = LogicalOrExpression.new(val[1], val[0], val[2])
526
+ result.head_token = val[0].head_token
527
+ result.tail_token = val[2].tail_token
528
+ }
529
+ ;
530
+
531
+ conditional_expression
532
+ : logical_or_expression
533
+ | logical_or_expression "?" expression ":" conditional_expression
534
+ {
535
+ checkpoint(val[0].location)
536
+
537
+ result = ConditionalExpression.new(val[0], val[2], val[4], val[1])
538
+ result.head_token = val[0].head_token
539
+ result.tail_token = val[4].tail_token
540
+ }
541
+ ;
542
+
543
+ assignment_expression
544
+ : conditional_expression
545
+ | cast_expression "=" assignment_expression
546
+ {
547
+ checkpoint(val[0].location)
548
+
549
+ result = SimpleAssignmentExpression.new(val[1], val[0], val[2])
550
+ result.head_token = val[0].head_token
551
+ result.tail_token = val[2].tail_token
552
+ }
553
+ | cast_expression compound_assignment_operator assignment_expression
554
+ {
555
+ checkpoint(val[0].location)
556
+
557
+ result = CompoundAssignmentExpression.new(val[1], val[0], val[2])
558
+ result.head_token = val[0].head_token
559
+ result.tail_token = val[2].tail_token
560
+ }
561
+ ;
562
+
563
+ compound_assignment_operator
564
+ : "*="
565
+ | "/="
566
+ | "%="
567
+ | "+="
568
+ | "-="
569
+ | "<<="
570
+ | ">>="
571
+ | "&="
572
+ | "^="
573
+ | "|="
574
+ ;
575
+
576
+ expression
577
+ : assignment_expression
578
+ | expression "," assignment_expression
579
+ {
580
+ checkpoint(val[0].location)
581
+
582
+ case val[0]
583
+ when CommaSeparatedExpression
584
+ result = val[0].push(val[2])
585
+ result.tail_token = val[2].tail_token
586
+ else
587
+ result = CommaSeparatedExpression.new(val[0]).push(val[2])
588
+ result.head_token = val[0].head_token
589
+ result.tail_token = val[2].tail_token
590
+ end
591
+ }
592
+ ;
593
+
594
+ constant_expression
595
+ : conditional_expression
596
+ ;
597
+
598
+ #
599
+ # Declarations
600
+ #
601
+ declaration
602
+ : declaration_specifiers ";"
603
+ {
604
+ checkpoint(val[0].location)
605
+
606
+ @lexer.start_identifier_translation
607
+
608
+ result = Declaration.new(val[0], [], @symbol_table)
609
+ result.head_token = val[0].head_token
610
+ result.tail_token = val[1]
611
+ }
612
+ | declaration_specifiers init_declarator_list ";"
613
+ {
614
+ checkpoint(val[0].location)
615
+
616
+ result = Declaration.new(val[0], val[1], @symbol_table)
617
+ result.head_token = val[0].head_token
618
+ result.tail_token = val[2]
619
+
620
+ result.items.each do |item|
621
+ case item
622
+ when TypedefDeclaration
623
+ @lexer.add_typedef_name(item.identifier)
624
+ when FunctionDeclaration, VariableDeclaration, VariableDefinition
625
+ @lexer.add_object_name(item.identifier)
626
+ end
627
+ end
628
+ }
629
+ ;
630
+
631
+ global_declaration
632
+ : declaration
633
+ | init_declarator_list ";"
634
+ {
635
+ checkpoint(val[0].first.location)
636
+
637
+ result = Declaration.new(nil, val[0], @symbol_table)
638
+ result.head_token = val[0].first.head_token
639
+ result.tail_token = val[1]
640
+ }
641
+ ;
642
+
643
+ declaration_specifiers
644
+ : storage_class_specifier
645
+ {
646
+ checkpoint(val[0].location)
647
+
648
+ result = DeclarationSpecifiers.new
649
+ result.storage_class_specifier = val[0]
650
+ result.head_token = result.tail_token = val[0]
651
+ }
652
+ | declaration_specifiers storage_class_specifier
653
+ {
654
+ checkpoint(val[0].location)
655
+
656
+ result = val[0]
657
+ result.storage_class_specifier = val[1]
658
+ result.tail_token = val[1]
659
+ }
660
+ | type_specifier
661
+ {
662
+ checkpoint(val[0].location)
663
+
664
+ @lexer.stop_identifier_translation
665
+
666
+ result = DeclarationSpecifiers.new
667
+ result.type_specifiers.push(val[0])
668
+ result.head_token = val[0].head_token
669
+ result.tail_token = val[0].tail_token
670
+ }
671
+ | declaration_specifiers type_specifier
672
+ {
673
+ checkpoint(val[0].location)
674
+
675
+ @lexer.stop_identifier_translation
676
+
677
+ result = val[0]
678
+ result.type_specifiers.push(val[1])
679
+ result.tail_token = val[1].tail_token
680
+ }
681
+ | type_qualifier
682
+ {
683
+ checkpoint(val[0].location)
684
+
685
+ result = DeclarationSpecifiers.new
686
+ result.type_qualifiers.push(val[0])
687
+ result.head_token = result.tail_token = val[0]
688
+ }
689
+ | declaration_specifiers type_qualifier
690
+ {
691
+ checkpoint(val[0].location)
692
+
693
+ result = val[0]
694
+ result.type_qualifiers.push(val[1])
695
+ result.tail_token = val[1]
696
+ }
697
+ | function_specifier
698
+ {
699
+ checkpoint(val[0].location)
700
+
701
+ result = DeclarationSpecifiers.new
702
+ result.function_specifier = val[0]
703
+ result.head_token = result.tail_token = val[0]
704
+ }
705
+ | declaration_specifiers function_specifier
706
+ {
707
+ checkpoint(val[0].location)
708
+
709
+ result = val[0]
710
+ result.function_specifier = val[1]
711
+ result.tail_token = val[1]
712
+ }
713
+ ;
714
+
715
+ init_declarator_list
716
+ : init_declarator
717
+ {
718
+ checkpoint(val[0].location)
719
+
720
+ result = val
721
+ }
722
+ | init_declarator_list "," init_declarator
723
+ {
724
+ checkpoint(val[0].first.location)
725
+
726
+ result = val[0].push(val[2])
727
+ }
728
+ ;
729
+
730
+ init_declarator
731
+ : declarator
732
+ {
733
+ checkpoint(val[0].location)
734
+
735
+ result = InitDeclarator.new(val[0], nil)
736
+ result.head_token = val[0].head_token
737
+ result.tail_token = val[0].tail_token
738
+ }
739
+ | declarator "=" initializer
740
+ {
741
+ checkpoint(val[0].location)
742
+
743
+ result = InitDeclarator.new(val[0], val[2])
744
+ result.head_token = val[0].head_token
745
+ result.tail_token = val[2].tail_token
746
+ }
747
+ ;
748
+
749
+ storage_class_specifier
750
+ : TYPEDEF
751
+ | EXTERN
752
+ | STATIC
753
+ | AUTO
754
+ | REGISTER
755
+ ;
756
+
757
+ type_specifier
758
+ : VOID
759
+ {
760
+ checkpoint(val[0].location)
761
+
762
+ result = StandardTypeSpecifier.new(val[0])
763
+ result.head_token = result.tail_token = val[0]
764
+ }
765
+ | CHAR
766
+ {
767
+ checkpoint(val[0].location)
768
+
769
+ result = StandardTypeSpecifier.new(val[0])
770
+ result.head_token = result.tail_token = val[0]
771
+ }
772
+ | SHORT
773
+ {
774
+ checkpoint(val[0].location)
775
+
776
+ result = StandardTypeSpecifier.new(val[0])
777
+ result.head_token = result.tail_token = val[0]
778
+ }
779
+ | INT
780
+ {
781
+ checkpoint(val[0].location)
782
+
783
+ result = StandardTypeSpecifier.new(val[0])
784
+ result.head_token = result.tail_token = val[0]
785
+ }
786
+ | LONG
787
+ {
788
+ checkpoint(val[0].location)
789
+
790
+ result = StandardTypeSpecifier.new(val[0])
791
+ result.head_token = result.tail_token = val[0]
792
+ }
793
+ | FLOAT
794
+ {
795
+ checkpoint(val[0].location)
796
+
797
+ result = StandardTypeSpecifier.new(val[0])
798
+ result.head_token = result.tail_token = val[0]
799
+ }
800
+ | DOUBLE
801
+ {
802
+ checkpoint(val[0].location)
803
+
804
+ result = StandardTypeSpecifier.new(val[0])
805
+ result.head_token = result.tail_token = val[0]
806
+ }
807
+ | SIGNED
808
+ {
809
+ checkpoint(val[0].location)
810
+
811
+ result = StandardTypeSpecifier.new(val[0])
812
+ result.head_token = result.tail_token = val[0]
813
+ }
814
+ | UNSIGNED
815
+ {
816
+ checkpoint(val[0].location)
817
+
818
+ result = StandardTypeSpecifier.new(val[0])
819
+ result.head_token = result.tail_token = val[0]
820
+ }
821
+ | BOOL
822
+ {
823
+ checkpoint(val[0].location)
824
+
825
+ result = StandardTypeSpecifier.new(val[0])
826
+ result.head_token = result.tail_token = val[0]
827
+ }
828
+ | COMPLEX
829
+ {
830
+ checkpoint(val[0].location)
831
+
832
+ result = StandardTypeSpecifier.new(val[0])
833
+ result.head_token = result.tail_token = val[0]
834
+ }
835
+ | IMAGINARY
836
+ {
837
+ checkpoint(val[0].location)
838
+
839
+ result = StandardTypeSpecifier.new(val[0])
840
+ result.head_token = result.tail_token = val[0]
841
+ }
842
+ | TYPEDEF_NAME
843
+ {
844
+ checkpoint(val[0].location)
845
+
846
+ result = TypedefTypeSpecifier.new(val[0])
847
+ result.head_token = result.tail_token = val[0]
848
+ }
849
+ | struct_or_union_specifier
850
+ | enum_specifier
851
+ | TYPEOF "(" constant_expression ")"
852
+ {
853
+ checkpoint(val[0].location)
854
+
855
+ result = TypeofTypeSpecifier.new(val[2], nil)
856
+ result.head_token = val[0]
857
+ result.tail_token = val[3]
858
+ }
859
+ | TYPEOF "(" type_name ")"
860
+ {
861
+ checkpoint(val[0].location)
862
+
863
+ result = TypeofTypeSpecifier.new(nil, val[2])
864
+ result.head_token = val[0]
865
+ result.tail_token = val[3]
866
+ }
867
+ ;
868
+
869
+ struct_or_union_specifier
870
+ : STRUCT IDENTIFIER "{" struct_declaration_list "}"
871
+ {
872
+ checkpoint(val[0].location)
873
+
874
+ result = StructSpecifier.new(val[1], val[3])
875
+ result.head_token = val[0]
876
+ result.tail_token = val[4]
877
+ }
878
+ | STRUCT IDENTIFIER "{" "}"
879
+ {
880
+ checkpoint(val[0].location)
881
+
882
+ result = StructSpecifier.new(val[1], [])
883
+ result.head_token = val[0]
884
+ result.tail_token = val[3]
885
+ }
886
+ | UNION IDENTIFIER "{" struct_declaration_list "}"
887
+ {
888
+ checkpoint(val[0].location)
889
+
890
+ result = UnionSpecifier.new(val[1], val[3])
891
+ result.head_token = val[0]
892
+ result.tail_token = val[4]
893
+ }
894
+ | UNION IDENTIFIER "{" "}"
895
+ {
896
+ checkpoint(val[0].location)
897
+
898
+ result = UnionSpecifier.new(val[1], [])
899
+ result.head_token = val[0]
900
+ result.tail_token = val[3]
901
+ }
902
+ | STRUCT "{" struct_declaration_list "}"
903
+ {
904
+ checkpoint(val[0].location)
905
+
906
+ result = StructSpecifier.new(create_unnamed_type_name(val[0]), val[2])
907
+ result.head_token = val[0]
908
+ result.tail_token = val[3]
909
+ }
910
+ | STRUCT "{" "}"
911
+ {
912
+ checkpoint(val[0].location)
913
+
914
+ result = StructSpecifier.new(create_unnamed_type_name(val[0]), [])
915
+ result.head_token = val[0]
916
+ result.tail_token = val[2]
917
+ }
918
+ | UNION "{" struct_declaration_list "}"
919
+ {
920
+ checkpoint(val[0].location)
921
+
922
+ result = UnionSpecifier.new(create_unnamed_type_name(val[0]), val[2])
923
+ result.head_token = val[0]
924
+ result.tail_token = val[3]
925
+ }
926
+ | UNION "{" "}"
927
+ {
928
+ checkpoint(val[0].location)
929
+
930
+ result = UnionSpecifier.new(create_unnamed_type_name(val[0]), [])
931
+ result.head_token = val[0]
932
+ result.tail_token = val[2]
933
+ }
934
+ | STRUCT IDENTIFIER
935
+ {
936
+ checkpoint(val[0].location)
937
+
938
+ result = StructSpecifier.new(val[1], nil)
939
+ result.head_token = val[0]
940
+ result.tail_token = val[1]
941
+ }
942
+ | UNION IDENTIFIER
943
+ {
944
+ checkpoint(val[0].location)
945
+
946
+ result = UnionSpecifier.new(val[1], nil)
947
+ result.head_token = val[0]
948
+ result.tail_token = val[1]
949
+ }
950
+ ;
951
+
952
+ struct_declaration_list
953
+ : struct_declaration
954
+ {
955
+ checkpoint(val[0].location)
956
+
957
+ result = val
958
+ }
959
+ | struct_declaration_list struct_declaration
960
+ {
961
+ checkpoint(val[0].first.location)
962
+
963
+ result = val[0].push(val[1])
964
+ }
965
+ ;
966
+
967
+ struct_declaration
968
+ : specifier_qualifier_list ";"
969
+ {
970
+ checkpoint(val[0].location)
971
+
972
+ @lexer.start_identifier_translation
973
+
974
+ result = StructDeclaration.new(val[0], [])
975
+ result.head_token = val[0].head_token
976
+ result.tail_token = val[1]
977
+ }
978
+ | specifier_qualifier_list { @lexer.stop_identifier_translation }
979
+ struct_declarator_list ";"
980
+ {
981
+ checkpoint(val[0].location)
982
+
983
+ result = StructDeclaration.new(val[0], val[2])
984
+ result.head_token = val[0].head_token
985
+ result.tail_token = val[3]
986
+ }
987
+ ;
988
+
989
+ specifier_qualifier_list
990
+ : specifier_qualifier_list type_specifier
991
+ {
992
+ checkpoint(val[0].location)
993
+
994
+ @lexer.stop_identifier_translation
995
+
996
+ result = val[0]
997
+ result.type_specifiers.push(val[1])
998
+ result.tail_token = val[1].tail_token
999
+ }
1000
+ | type_specifier
1001
+ {
1002
+ checkpoint(val[0].location)
1003
+
1004
+ @lexer.stop_identifier_translation
1005
+
1006
+ result = SpecifierQualifierList.new
1007
+ result.type_specifiers.push(val[0])
1008
+ result.head_token = val[0].head_token
1009
+ result.tail_token = val[0].tail_token
1010
+ }
1011
+ | specifier_qualifier_list type_qualifier
1012
+ {
1013
+ checkpoint(val[0].location)
1014
+
1015
+ result = val[0]
1016
+ result.type_qualifiers.push(val[1])
1017
+ result.tail_token = val[1]
1018
+ }
1019
+ | type_qualifier
1020
+ {
1021
+ checkpoint(val[0].location)
1022
+
1023
+ result = SpecifierQualifierList.new
1024
+ result.type_qualifiers.push(val[0])
1025
+ result.head_token = result.tail_token = val[0]
1026
+ }
1027
+ ;
1028
+
1029
+ struct_declarator_list
1030
+ : struct_declarator
1031
+ {
1032
+ checkpoint(val[0].location)
1033
+
1034
+ result = val
1035
+ }
1036
+ | struct_declarator_list "," struct_declarator
1037
+ {
1038
+ checkpoint(val[0].first.location)
1039
+
1040
+ result = val[0].push(val[2])
1041
+ }
1042
+ ;
1043
+
1044
+ struct_declarator
1045
+ : declarator
1046
+ {
1047
+ checkpoint(val[0].location)
1048
+
1049
+ result = StructDeclarator.new(val[0], nil)
1050
+ result.head_token = val[0].head_token
1051
+ result.tail_token = val[0].tail_token
1052
+ }
1053
+ | ":" constant_expression
1054
+ {
1055
+ checkpoint(val[0].location)
1056
+
1057
+ result = StructDeclarator.new(nil, val[1])
1058
+ result.head_token = val[0]
1059
+ result.tail_token = val[1].tail_token
1060
+ }
1061
+ | declarator ":" constant_expression
1062
+ {
1063
+ checkpoint(val[0].location)
1064
+
1065
+ result = StructDeclarator.new(val[0], val[2])
1066
+ result.head_token = val[0].head_token
1067
+ result.tail_token = val[2].tail_token
1068
+ }
1069
+ ;
1070
+
1071
+ enum_specifier
1072
+ : ENUM "{" enumerator_list "}"
1073
+ {
1074
+ checkpoint(val[0].location)
1075
+
1076
+ result = EnumSpecifier.new(create_unnamed_type_name(val[0]), val[2])
1077
+ result.head_token = val[0]
1078
+ result.tail_token = val[3]
1079
+ }
1080
+ | ENUM IDENTIFIER "{" enumerator_list "}"
1081
+ {
1082
+ checkpoint(val[0].location)
1083
+
1084
+ result = EnumSpecifier.new(val[1], val[3])
1085
+ result.head_token = val[0]
1086
+ result.tail_token = val[4]
1087
+ }
1088
+ | ENUM "{" enumerator_list "," "}"
1089
+ {
1090
+ checkpoint(val[0].location)
1091
+
1092
+ result = EnumSpecifier.new(create_unnamed_type_name(val[0]), val[2])
1093
+ result.head_token = val[0]
1094
+ result.tail_token = val[4]
1095
+ }
1096
+ | ENUM IDENTIFIER "{" enumerator_list "," "}"
1097
+ {
1098
+ checkpoint(val[0].location)
1099
+
1100
+ result = EnumSpecifier.new(val[1], val[3])
1101
+ result.head_token = val[0]
1102
+ result.tail_token = val[5]
1103
+ }
1104
+ | ENUM IDENTIFIER
1105
+ {
1106
+ checkpoint(val[0].location)
1107
+
1108
+ result = EnumSpecifier.new(val[1], nil)
1109
+ result.head_token = val[0]
1110
+ result.tail_token = val[1]
1111
+ }
1112
+ ;
1113
+
1114
+ enumerator_list
1115
+ : enumerator
1116
+ {
1117
+ checkpoint(val[0].location)
1118
+
1119
+ result = val
1120
+ }
1121
+ | enumerator_list "," enumerator
1122
+ {
1123
+ checkpoint(val[0].first.location)
1124
+
1125
+ result = val[0].push(val[2])
1126
+ }
1127
+ ;
1128
+
1129
+ enumerator
1130
+ : IDENTIFIER
1131
+ {
1132
+ checkpoint(val[0].location)
1133
+
1134
+ symbol = @symbol_table.create_new_symbol(EnumeratorName, val[0])
1135
+ result = Enumerator.new(val[0], nil, symbol)
1136
+ result.head_token = result.tail_token = val[0]
1137
+ }
1138
+ | IDENTIFIER "=" constant_expression
1139
+ {
1140
+ checkpoint(val[0].location)
1141
+
1142
+ symbol = @symbol_table.create_new_symbol(EnumeratorName, val[0])
1143
+ result = Enumerator.new(val[0], val[2], symbol)
1144
+ result.head_token = val[0]
1145
+ result.tail_token = val[2].tail_token
1146
+ }
1147
+ ;
1148
+
1149
+ type_qualifier
1150
+ : CONST
1151
+ | VOLATILE
1152
+ | RESTRICT
1153
+ ;
1154
+
1155
+ function_specifier
1156
+ : INLINE
1157
+ ;
1158
+
1159
+ declarator
1160
+ : pointer direct_declarator
1161
+ {
1162
+ checkpoint(val[0].first.location)
1163
+
1164
+ result = val[1]
1165
+ result.pointer = val[0]
1166
+ result.head_token = val[0].first
1167
+ }
1168
+ | direct_declarator
1169
+ ;
1170
+
1171
+ direct_declarator
1172
+ : IDENTIFIER
1173
+ {
1174
+ checkpoint(val[0].location)
1175
+
1176
+ @lexer.start_identifier_translation
1177
+
1178
+ result = IdentifierDeclarator.new(val[0])
1179
+ result.head_token = result.tail_token = val[0]
1180
+ }
1181
+ | "(" declarator ")"
1182
+ {
1183
+ checkpoint(val[0].location)
1184
+
1185
+ result = GroupedDeclarator.new(val[1])
1186
+ result.head_token = val[0]
1187
+ result.tail_token = val[2]
1188
+ }
1189
+ | direct_declarator "[" type_qualifier_list assignment_expression "]"
1190
+ {
1191
+ checkpoint(val[0].location)
1192
+
1193
+ result = ArrayDeclarator.new(val[0], val[3])
1194
+ result.head_token = val[0].head_token
1195
+ result.tail_token = val[4]
1196
+ }
1197
+ | direct_declarator "[" type_qualifier_list "]"
1198
+ {
1199
+ checkpoint(val[0].location)
1200
+
1201
+ result = ArrayDeclarator.new(val[0], nil)
1202
+ result.head_token = val[0].head_token
1203
+ result.tail_token = val[3]
1204
+ }
1205
+ | direct_declarator "[" assignment_expression "]"
1206
+ {
1207
+ checkpoint(val[0].location)
1208
+
1209
+ result = ArrayDeclarator.new(val[0], val[2])
1210
+ result.head_token = val[0].head_token
1211
+ result.tail_token = val[3]
1212
+ }
1213
+ | direct_declarator
1214
+ "[" STATIC type_qualifier_list assignment_expression "]"
1215
+ {
1216
+ checkpoint(val[0].location)
1217
+
1218
+ result = ArrayDeclarator.new(val[0], val[4])
1219
+ result.head_token = val[0].head_token
1220
+ result.tail_token = val[5]
1221
+ }
1222
+ | direct_declarator
1223
+ "[" type_qualifier_list STATIC assignment_expression "]"
1224
+ {
1225
+ checkpoint(val[0].location)
1226
+
1227
+ result = ArrayDeclarator.new(val[0], val[4])
1228
+ result.head_token = val[0].head_token
1229
+ result.tail_token = val[5]
1230
+ }
1231
+ | direct_declarator "[" type_qualifier_list "*" "]"
1232
+ {
1233
+ checkpoint(val[0].location)
1234
+
1235
+ result = ArrayDeclarator.new(val[0], nil)
1236
+ result.head_token = val[0].head_token
1237
+ result.tail_token = val[4]
1238
+ }
1239
+ | direct_declarator "[" "*" "]"
1240
+ {
1241
+ checkpoint(val[0].location)
1242
+
1243
+ result = ArrayDeclarator.new(val[0], nil)
1244
+ result.head_token = val[0].head_token
1245
+ result.tail_token = val[3]
1246
+ }
1247
+ | direct_declarator "[" "]"
1248
+ {
1249
+ checkpoint(val[0].location)
1250
+
1251
+ result = ArrayDeclarator.new(val[0], nil)
1252
+ result.head_token = val[0].head_token
1253
+ result.tail_token = val[2]
1254
+ }
1255
+ | direct_declarator "(" parameter_type_list ")"
1256
+ {
1257
+ checkpoint(val[0].location)
1258
+
1259
+ result = AnsiFunctionDeclarator.new(val[0], val[2])
1260
+ result.head_token = val[0].head_token
1261
+ result.tail_token = val[3]
1262
+ }
1263
+ | direct_declarator "(" identifier_list ")"
1264
+ {
1265
+ checkpoint(val[0].location)
1266
+
1267
+ result = KandRFunctionDeclarator.new(val[0], val[2])
1268
+ result.head_token = val[0].head_token
1269
+ result.tail_token = val[3]
1270
+ }
1271
+ | direct_declarator "(" ")"
1272
+ {
1273
+ checkpoint(val[0].location)
1274
+
1275
+ result = AbbreviatedFunctionDeclarator.new(val[0])
1276
+ result.head_token = val[0].head_token
1277
+ result.tail_token = val[2]
1278
+ }
1279
+ ;
1280
+
1281
+ pointer
1282
+ : "*"
1283
+ {
1284
+ checkpoint(val[0].location)
1285
+
1286
+ result = val
1287
+ }
1288
+ | "*" type_qualifier_list
1289
+ {
1290
+ checkpoint(val[0].location)
1291
+
1292
+ result = val[1].unshift(val[0])
1293
+ }
1294
+ | "*" pointer
1295
+ {
1296
+ checkpoint(val[0].location)
1297
+
1298
+ result = val[1].unshift(val[0])
1299
+ }
1300
+ | "*" type_qualifier_list pointer
1301
+ {
1302
+ checkpoint(val[0].location)
1303
+
1304
+ result = val[1].unshift(val[0]).concat(val[2])
1305
+ }
1306
+ ;
1307
+
1308
+ type_qualifier_list
1309
+ : type_qualifier
1310
+ {
1311
+ checkpoint(val[0].location)
1312
+
1313
+ result = val
1314
+ }
1315
+ | type_qualifier_list type_qualifier
1316
+ {
1317
+ checkpoint(val[0].first.location)
1318
+
1319
+ result = val[0].push(val[1])
1320
+ }
1321
+ ;
1322
+
1323
+ parameter_type_list
1324
+ : parameter_list
1325
+ {
1326
+ checkpoint(val[0].first.location)
1327
+
1328
+ result = ParameterTypeList.new(val[0], false)
1329
+ result.head_token = val[0].first.head_token
1330
+ result.tail_token = val[0].last.tail_token
1331
+ }
1332
+ | parameter_list "," "..."
1333
+ {
1334
+ checkpoint(val[0].first.location)
1335
+
1336
+ result = ParameterTypeList.new(val[0], true)
1337
+ result.head_token = val[0].first.head_token
1338
+ result.tail_token = val[2]
1339
+ }
1340
+ ;
1341
+
1342
+ parameter_list
1343
+ : parameter_declaration
1344
+ {
1345
+ checkpoint(val[0].location)
1346
+
1347
+ result = val
1348
+ }
1349
+ | parameter_list "," parameter_declaration
1350
+ {
1351
+ checkpoint(val[0].first.location)
1352
+
1353
+ result = val[0].push(val[2])
1354
+ }
1355
+ ;
1356
+
1357
+ parameter_declaration
1358
+ : declaration_specifiers declarator
1359
+ {
1360
+ checkpoint(val[0].location)
1361
+
1362
+ result = ParameterDeclaration.new(val[0], val[1])
1363
+ result.head_token = val[0].head_token
1364
+ result.tail_token = val[1].tail_token
1365
+ }
1366
+ | declaration_specifiers abstract_declarator
1367
+ {
1368
+ checkpoint(val[0].location)
1369
+
1370
+ result = ParameterDeclaration.new(val[0], val[1])
1371
+ result.head_token = val[0].head_token
1372
+ result.tail_token = val[1].tail_token
1373
+ }
1374
+ | declaration_specifiers
1375
+ {
1376
+ checkpoint(val[0].location)
1377
+
1378
+ @lexer.start_identifier_translation
1379
+
1380
+ result = ParameterDeclaration.new(val[0], nil)
1381
+ result.head_token = val[0].head_token
1382
+ result.tail_token = val[0].tail_token
1383
+ }
1384
+ ;
1385
+
1386
+ identifier_list
1387
+ : IDENTIFIER
1388
+ {
1389
+ checkpoint(val[0].location)
1390
+
1391
+ result = val
1392
+ }
1393
+ | identifier_list "," IDENTIFIER
1394
+ {
1395
+ checkpoint(val[0].first.location)
1396
+
1397
+ result = val[0].push(val[2])
1398
+ }
1399
+ ;
1400
+
1401
+ type_name
1402
+ : specifier_qualifier_list
1403
+ {
1404
+ checkpoint(val[0].location)
1405
+
1406
+ @lexer.start_identifier_translation
1407
+
1408
+ result = TypeName.new(val[0], nil, @symbol_table)
1409
+ result.head_token = val[0].head_token
1410
+ result.tail_token = val[0].tail_token
1411
+ }
1412
+ | specifier_qualifier_list abstract_declarator
1413
+ {
1414
+ checkpoint(val[0].location)
1415
+
1416
+ result = TypeName.new(val[0], val[1], @symbol_table)
1417
+ result.head_token = val[0].head_token
1418
+ result.tail_token = val[1].tail_token
1419
+ }
1420
+ ;
1421
+
1422
+ abstract_declarator
1423
+ : pointer
1424
+ {
1425
+ checkpoint(val[0].first.location)
1426
+
1427
+ @lexer.start_identifier_translation
1428
+
1429
+ result = PointerAbstractDeclarator.new(nil, val[0])
1430
+ result.head_token = val[0].first
1431
+ result.tail_token = val[0].last
1432
+ }
1433
+ | pointer direct_abstract_declarator
1434
+ {
1435
+ checkpoint(val[0].first.location)
1436
+
1437
+ result = PointerAbstractDeclarator.new(val[1], val[0])
1438
+ result.head_token = val[0].first
1439
+ result.tail_token = val[1].tail_token
1440
+ }
1441
+ | direct_abstract_declarator
1442
+ ;
1443
+
1444
+ direct_abstract_declarator
1445
+ : "(" abstract_declarator ")"
1446
+ {
1447
+ checkpoint(val[0].location)
1448
+
1449
+ @lexer.start_identifier_translation
1450
+
1451
+ result = GroupedAbstractDeclarator.new(val[1])
1452
+ result.head_token = val[0]
1453
+ result.tail_token = val[2]
1454
+ }
1455
+ | "[" "]"
1456
+ {
1457
+ checkpoint(val[0].location)
1458
+
1459
+ @lexer.start_identifier_translation
1460
+
1461
+ result = ArrayAbstractDeclarator.new(nil, nil)
1462
+ result.head_token = val[0]
1463
+ result.tail_token = val[1]
1464
+ }
1465
+ | "[" assignment_expression "]"
1466
+ {
1467
+ checkpoint(val[0].location)
1468
+
1469
+ @lexer.start_identifier_translation
1470
+
1471
+ result = ArrayAbstractDeclarator.new(nil, val[1])
1472
+ result.head_token = val[0]
1473
+ result.tail_token = val[2]
1474
+ }
1475
+ | direct_abstract_declarator "[" "]"
1476
+ {
1477
+ checkpoint(val[0].location)
1478
+
1479
+ result = ArrayAbstractDeclarator.new(val[0], nil)
1480
+ result.head_token = val[0].head_token
1481
+ result.tail_token = val[2]
1482
+ }
1483
+ | direct_abstract_declarator "[" assignment_expression "]"
1484
+ {
1485
+ checkpoint(val[0].location)
1486
+
1487
+ result = ArrayAbstractDeclarator.new(val[0], val[2])
1488
+ result.head_token = val[0].head_token
1489
+ result.tail_token = val[3]
1490
+ }
1491
+ | "[" "*" "]"
1492
+ {
1493
+ checkpoint(val[0].location)
1494
+
1495
+ @lexer.start_identifier_translation
1496
+
1497
+ result = ArrayAbstractDeclarator.new(nil, nil)
1498
+ result.head_token = val[0]
1499
+ result.tail_token = val[2]
1500
+ }
1501
+ | direct_abstract_declarator "[" "*" "]"
1502
+ {
1503
+ checkpoint(val[0].location)
1504
+
1505
+ result = ArrayAbstractDeclarator.new(val[0], nil)
1506
+ result.head_token = val[0].head_token
1507
+ result.tail_token = val[3]
1508
+ }
1509
+ | "(" ")"
1510
+ {
1511
+ checkpoint(val[0].location)
1512
+
1513
+ @lexer.start_identifier_translation
1514
+
1515
+ result = FunctionAbstractDeclarator.new(nil, nil)
1516
+ result.head_token = val[0]
1517
+ result.tail_token = val[1]
1518
+ }
1519
+ | "(" { @lexer.start_identifier_translation } parameter_type_list ")"
1520
+ {
1521
+ checkpoint(val[0].location)
1522
+
1523
+ result = FunctionAbstractDeclarator.new(nil, val[2])
1524
+ result.head_token = val[0]
1525
+ result.tail_token = val[3]
1526
+ }
1527
+ | direct_abstract_declarator "(" ")"
1528
+ {
1529
+ checkpoint(val[0].location)
1530
+
1531
+ @lexer.start_identifier_translation
1532
+
1533
+ result = FunctionAbstractDeclarator.new(val[0], nil)
1534
+ result.head_token = val[0].head_token
1535
+ result.tail_token = val[2]
1536
+ }
1537
+ | direct_abstract_declarator "(" parameter_type_list ")"
1538
+ {
1539
+ checkpoint(val[0].location)
1540
+
1541
+ result = FunctionAbstractDeclarator.new(val[0], val[2])
1542
+ result.head_token = val[0].head_token
1543
+ result.tail_token = val[3]
1544
+ }
1545
+ ;
1546
+
1547
+ initializer
1548
+ : assignment_expression
1549
+ {
1550
+ checkpoint(val[0].location)
1551
+
1552
+ result = Initializer.new(val[0], nil)
1553
+ result.head_token = val[0].head_token
1554
+ result.tail_token = val[0].tail_token
1555
+ }
1556
+ | "{" "}"
1557
+ {
1558
+ checkpoint(val[0].location)
1559
+
1560
+ result = Initializer.new(nil, nil)
1561
+ result.head_token = val[0]
1562
+ result.tail_token = val[1]
1563
+ }
1564
+ | "{" initializer_list "}"
1565
+ {
1566
+ checkpoint(val[0].location)
1567
+
1568
+ result = Initializer.new(nil, val[1])
1569
+ result.head_token = val[0]
1570
+ result.tail_token = val[2]
1571
+ }
1572
+ | "{" initializer_list "," "}"
1573
+ {
1574
+ checkpoint(val[0].location)
1575
+
1576
+ result = Initializer.new(nil, val[1])
1577
+ result.head_token = val[0]
1578
+ result.tail_token = val[3]
1579
+ }
1580
+ ;
1581
+
1582
+ initializer_list
1583
+ : initializer
1584
+ {
1585
+ checkpoint(val[0].location)
1586
+
1587
+ result = val
1588
+ }
1589
+ | designation initializer
1590
+ {
1591
+ checkpoint(val[1].location)
1592
+
1593
+ result = [val[1]]
1594
+ }
1595
+ | initializer_list "," initializer
1596
+ {
1597
+ checkpoint(val[0].first.location)
1598
+
1599
+ result = val[0].push(val[2])
1600
+ }
1601
+ | initializer_list "," designation initializer
1602
+ {
1603
+ checkpoint(val[0].first.location)
1604
+
1605
+ result = val[0].push(val[3])
1606
+ }
1607
+ ;
1608
+
1609
+ designation
1610
+ : designator_list "="
1611
+ ;
1612
+
1613
+ designator_list
1614
+ : designator
1615
+ | designator_list designator
1616
+ ;
1617
+
1618
+ designator
1619
+ : "[" constant_expression "]"
1620
+ | "." IDENTIFIER
1621
+ ;
1622
+
1623
+ #
1624
+ # Statements
1625
+ #
1626
+ statement
1627
+ : labeled_statement
1628
+ | compound_statement
1629
+ | expression_statement
1630
+ | selection_statement
1631
+ | iteration_statement
1632
+ | jump_statement
1633
+ ;
1634
+
1635
+ labeled_statement
1636
+ : IDENTIFIER ":" statement
1637
+ {
1638
+ checkpoint(val[0].location)
1639
+
1640
+ result = GenericLabeledStatement.new(val[0], val[2])
1641
+ result.head_token = val[0]
1642
+ result.tail_token = val[2].tail_token
1643
+ }
1644
+ | CASE constant_expression ":" statement
1645
+ {
1646
+ checkpoint(val[0].location)
1647
+
1648
+ result = CaseLabeledStatement.new(val[1], val[3])
1649
+ result.head_token = val[0]
1650
+ result.tail_token = val[3].tail_token
1651
+ }
1652
+ | DEFAULT ":" statement
1653
+ {
1654
+ checkpoint(val[0].location)
1655
+
1656
+ result = DefaultLabeledStatement.new(val[2])
1657
+ result.head_token = val[0]
1658
+ result.tail_token = val[2].tail_token
1659
+ }
1660
+ ;
1661
+
1662
+ compound_statement
1663
+ : "{" "}"
1664
+ {
1665
+ checkpoint(val[0].location)
1666
+
1667
+ result = CompoundStatement.new([])
1668
+ result.head_token = val[0]
1669
+ result.tail_token = val[1]
1670
+ }
1671
+ | "{" { @lexer.enter_scope } block_item_list { @lexer.leave_scope } "}"
1672
+ {
1673
+ checkpoint(val[0].location)
1674
+
1675
+ result = CompoundStatement.new(val[2])
1676
+ result.head_token = val[0]
1677
+ result.tail_token = val[4]
1678
+ }
1679
+ ;
1680
+
1681
+ block_item_list
1682
+ : block_item
1683
+ {
1684
+ checkpoint(val[0].location)
1685
+
1686
+ result = val
1687
+ }
1688
+ | block_item_list block_item
1689
+ {
1690
+ checkpoint(val[0].first.location)
1691
+
1692
+ result = val[0].push(val[1])
1693
+ }
1694
+ ;
1695
+
1696
+ block_item
1697
+ : declaration
1698
+ | statement
1699
+ | local_function_definition
1700
+ ;
1701
+
1702
+ expression_statement
1703
+ : ";"
1704
+ {
1705
+ checkpoint(val[0].location)
1706
+
1707
+ result = ExpressionStatement.new(nil)
1708
+ result.head_token = result.tail_token = val[0]
1709
+ }
1710
+ | expression ";"
1711
+ {
1712
+ checkpoint(val[0].location)
1713
+
1714
+ result = ExpressionStatement.new(val[0])
1715
+ result.head_token = val[0].head_token
1716
+ result.tail_token = val[1]
1717
+ }
1718
+ ;
1719
+
1720
+ selection_statement
1721
+ : IF "(" expression ")" statement
1722
+ {
1723
+ checkpoint(val[0].location)
1724
+
1725
+ result = IfStatement.new(val[2], val[4], val[3])
1726
+ result.head_token = val[0]
1727
+ result.tail_token = val[4].tail_token
1728
+ }
1729
+ | IF "(" expression ")" statement ELSE statement
1730
+ {
1731
+ checkpoint(val[0].location)
1732
+
1733
+ result = IfElseStatement.new(val[2], val[4], val[6], val[3], val[5])
1734
+ result.head_token = val[0]
1735
+ result.tail_token = val[6].tail_token
1736
+ }
1737
+ | SWITCH "(" expression ")" statement
1738
+ {
1739
+ checkpoint(val[0].location)
1740
+
1741
+ result = SwitchStatement.new(val[2], val[4])
1742
+ result.head_token = val[0]
1743
+ result.tail_token = val[4].tail_token
1744
+ }
1745
+ ;
1746
+
1747
+ iteration_statement
1748
+ : WHILE "(" expression ")" statement
1749
+ {
1750
+ checkpoint(val[0].location)
1751
+
1752
+ result = WhileStatement.new(val[2], val[4], val[3])
1753
+ result.head_token = val[0]
1754
+ result.tail_token = val[4].tail_token
1755
+ }
1756
+ | DO statement WHILE "(" expression ")" ";"
1757
+ {
1758
+ checkpoint(val[0].location)
1759
+
1760
+ result = DoStatement.new(val[1], val[4], val[0], val[2])
1761
+ result.head_token = val[0]
1762
+ result.tail_token = val[6]
1763
+ }
1764
+ | FOR "(" expression_statement expression_statement ")" statement
1765
+ {
1766
+ checkpoint(val[0].location)
1767
+
1768
+ result = ForStatement.new(val[2], val[3], nil, val[5], val[4])
1769
+ result.head_token = val[0]
1770
+ result.tail_token = val[5].tail_token
1771
+ }
1772
+ | FOR "(" expression_statement expression_statement expression ")"
1773
+ statement
1774
+ {
1775
+ checkpoint(val[0].location)
1776
+
1777
+ result = ForStatement.new(val[2], val[3], val[4], val[6], val[5])
1778
+ result.head_token = val[0]
1779
+ result.tail_token = val[6].tail_token
1780
+ }
1781
+ | FOR "(" declaration expression_statement ")" statement
1782
+ {
1783
+ checkpoint(val[0].location)
1784
+
1785
+ result = C99ForStatement.new(val[2], val[3], nil, val[5], val[4])
1786
+ result.head_token = val[0]
1787
+ result.tail_token = val[5].tail_token
1788
+ }
1789
+ | FOR "(" declaration expression_statement expression ")" statement
1790
+ {
1791
+ checkpoint(val[0].location)
1792
+
1793
+ result = C99ForStatement.new(val[2], val[3], val[4], val[6], val[5])
1794
+ result.head_token = val[0]
1795
+ result.tail_token = val[6].tail_token
1796
+ }
1797
+ ;
1798
+
1799
+ jump_statement
1800
+ : GOTO IDENTIFIER ";"
1801
+ {
1802
+ checkpoint(val[0].location)
1803
+
1804
+ result = GotoStatement.new(val[1])
1805
+ result.head_token = val[0]
1806
+ result.tail_token = val[2]
1807
+ }
1808
+ | GOTO "*" expression ";"
1809
+ {
1810
+ checkpoint(val[0].location)
1811
+
1812
+ E(:E0015, val[1].location, val[1].value)
1813
+ result = ErrorStatement.new(val[1])
1814
+ result.head_token = val[0]
1815
+ result.tail_token = val[3]
1816
+ }
1817
+ | CONTINUE ";"
1818
+ {
1819
+ checkpoint(val[0].location)
1820
+
1821
+ result = ContinueStatement.new
1822
+ result.head_token = val[0]
1823
+ result.tail_token = val[1]
1824
+ }
1825
+ | BREAK ";"
1826
+ {
1827
+ checkpoint(val[0].location)
1828
+
1829
+ result = BreakStatement.new
1830
+ result.head_token = val[0]
1831
+ result.tail_token = val[1]
1832
+ }
1833
+ | RETURN ";"
1834
+ {
1835
+ checkpoint(val[0].location)
1836
+
1837
+ result = ReturnStatement.new(nil)
1838
+ result.head_token = val[0]
1839
+ result.tail_token = val[1]
1840
+ }
1841
+ | RETURN expression ";"
1842
+ {
1843
+ checkpoint(val[0].location)
1844
+
1845
+ result = ReturnStatement.new(val[1])
1846
+ result.head_token = val[0]
1847
+ result.tail_token = val[2]
1848
+ }
1849
+ ;
1850
+
1851
+ #
1852
+ # External definitions
1853
+ #
1854
+ translation_unit
1855
+ :
1856
+ {
1857
+ result = TranslationUnit.new
1858
+ }
1859
+ | translation_unit external_declaration
1860
+ {
1861
+ checkpoint(val[0].location)
1862
+
1863
+ result = val[0]
1864
+ if result.external_declarations.empty?
1865
+ result.head_token = val[1].head_token
1866
+ end
1867
+ result.push(val[1])
1868
+ result.tail_token = val[1].tail_token
1869
+ }
1870
+ ;
1871
+
1872
+ external_declaration
1873
+ : function_definition
1874
+ | global_declaration
1875
+ ;
1876
+
1877
+ function_definition
1878
+ : declaration_specifiers declarator declaration_list compound_statement
1879
+ {
1880
+ checkpoint(val[0].location)
1881
+
1882
+ result = KandRFunctionDefinition.new(val[0], val[1], val[2], val[3],
1883
+ @symbol_table)
1884
+ result.head_token = val[0].head_token
1885
+ result.tail_token = val[3].tail_token
1886
+ }
1887
+ | declaration_specifiers declarator compound_statement
1888
+ {
1889
+ checkpoint(val[0].location)
1890
+
1891
+ case val[1]
1892
+ when AnsiFunctionDeclarator
1893
+ result = AnsiFunctionDefinition.new(val[0], val[1], val[2],
1894
+ @symbol_table)
1895
+ when KandRFunctionDeclarator
1896
+ result = KandRFunctionDefinition.new(val[0], val[1], [], val[2],
1897
+ @symbol_table)
1898
+ when AbbreviatedFunctionDeclarator
1899
+ result = AnsiFunctionDefinition.new(val[0], val[1], val[2],
1900
+ @symbol_table)
1901
+ end
1902
+
1903
+ result.head_token = val[0].head_token
1904
+ result.tail_token = val[2].tail_token
1905
+ }
1906
+ | declarator declaration_list compound_statement
1907
+ {
1908
+ checkpoint(val[0].location)
1909
+
1910
+ result = KandRFunctionDefinition.new(nil, val[0], val[1], val[2],
1911
+ @symbol_table)
1912
+ result.head_token = val[0].head_token
1913
+ result.tail_token = val[2].tail_token
1914
+ }
1915
+ | declarator compound_statement
1916
+ {
1917
+ checkpoint(val[0].location)
1918
+
1919
+ case val[0]
1920
+ when AnsiFunctionDeclarator
1921
+ result = AnsiFunctionDefinition.new(nil, val[0], val[1],
1922
+ @symbol_table)
1923
+ when KandRFunctionDeclarator
1924
+ result = KandRFunctionDefinition.new(nil, val[0], [], val[1],
1925
+ @symbol_table)
1926
+ when AbbreviatedFunctionDeclarator
1927
+ result = AnsiFunctionDefinition.new(nil, val[0], val[1],
1928
+ @symbol_table)
1929
+ end
1930
+
1931
+ result.head_token = val[0].head_token
1932
+ result.tail_token = val[1].tail_token
1933
+ }
1934
+ ;
1935
+
1936
+ local_function_definition
1937
+ : declaration_specifiers declarator declaration_list compound_statement
1938
+ {
1939
+ checkpoint(val[0].location)
1940
+
1941
+ result = KandRFunctionDefinition.new(val[0], val[1], val[2], val[3],
1942
+ @symbol_table)
1943
+ result.head_token = val[0].head_token
1944
+ result.tail_token = val[3].tail_token
1945
+ }
1946
+ | declaration_specifiers declarator compound_statement
1947
+ {
1948
+ checkpoint(val[0].location)
1949
+
1950
+ case val[1]
1951
+ when AnsiFunctionDeclarator
1952
+ result = AnsiFunctionDefinition.new(val[0], val[1], val[2],
1953
+ @symbol_table)
1954
+ when KandRFunctionDeclarator
1955
+ result = KandRFunctionDefinition.new(val[0], val[1], [], val[2],
1956
+ @symbol_table)
1957
+ when AbbreviatedFunctionDeclarator
1958
+ result = AnsiFunctionDefinition.new(val[0], val[1], val[2],
1959
+ @symbol_table)
1960
+ end
1961
+
1962
+ result.head_token = val[0].head_token
1963
+ result.tail_token = val[2].tail_token
1964
+ }
1965
+ ;
1966
+
1967
+ declaration_list
1968
+ : declaration
1969
+ {
1970
+ checkpoint(val[0].location)
1971
+
1972
+ result = val
1973
+ }
1974
+ | declaration_list declaration
1975
+ {
1976
+ checkpoint(val[0].first.location)
1977
+
1978
+ result = val[0].push(val[1])
1979
+ }
1980
+ ;
1981
+
1982
+ end
1983
+
1984
+ ---- header
1985
+
1986
+ require "adlint/error"
1987
+ require "adlint/symbol"
1988
+ require "adlint/monitor"
1989
+ require "adlint/c/syntax"
1990
+
1991
+ ---- inner
1992
+
1993
+ include MonitorUtil
1994
+ include ReportUtil
1995
+
1996
+ def initialize(context, lexer)
1997
+ @context = context
1998
+ @lexer = lexer
1999
+ @symbol_table = context[:symbol_table]
2000
+ @token_array = []
2001
+ @unnamed_type_no = 0
2002
+ end
2003
+
2004
+ attr_reader :token_array
2005
+
2006
+ def execute
2007
+ do_parse
2008
+ end
2009
+
2010
+ private
2011
+ def next_token
2012
+ if token = @lexer.next_token
2013
+ @token_array.push(token)
2014
+ [token.type, token]
2015
+ else
2016
+ nil
2017
+ end
2018
+ end
2019
+
2020
+ def on_error(error_token_id, error_value, value_stack)
2021
+ if first_token = @token_array[-2] and second_token = @token_array[-1]
2022
+ E(:E0008, location_of(first_token),
2023
+ "#{value_of(first_token)} #{value_of(second_token)}")
2024
+ raise ParseError.new(location_of(first_token),
2025
+ @context.msg_fpath, @context.log_fpath)
2026
+ else
2027
+ E(:E0008, location_of(error_value), value_of(error_value))
2028
+ raise ParseError.new(location_of(error_value),
2029
+ @context.msg_fpath, @context.log_fpath)
2030
+ end
2031
+ end
2032
+
2033
+ def location_of(value)
2034
+ if value == "$"
2035
+ Location.new
2036
+ else
2037
+ value.location
2038
+ end
2039
+ end
2040
+
2041
+ def value_of(token)
2042
+ token == "$" ? "EOF" : token.value
2043
+ end
2044
+
2045
+ def create_unnamed_type_name(base_token)
2046
+ Token.new(:IDENTIFIER, "__adlint__unnamed_#{@unnamed_type_no += 1}",
2047
+ base_token.location)
2048
+ end
2049
+
2050
+ def report
2051
+ @context.report
2052
+ end
2053
+
2054
+ # vim:ft=racc:sw=2:ts=2:sts=2:et: