adlint 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: