PageRenderTime 55ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/src/gibbon-jelly-fish-parser.y

#
Happy | 316 lines | 288 code | 28 blank | 0 comment | 0 complexity | 03ccead3f13d0be1f6cdeb7722ef7172 MD5 | raw file
Possible License(s): LGPL-3.0, GPL-3.0
  1. /*
  2. * This file is part of gibbon.
  3. * Gibbon is a Gtk+ frontend for the First Internet Backgammon Server FIBS.
  4. * Copyright (C) 2009-2012 Guido Flohr, http://guido-flohr.net/.
  5. *
  6. * gibbon is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * gibbon is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with gibbon. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. %{
  20. #ifdef HAVE_CONFIG_H
  21. # include "config.h"
  22. #endif
  23. #include <glib.h>
  24. #include <glib/gi18n.h>
  25. #include "gibbon-jelly-fish-parser.h"
  26. #include "gibbon-jelly-fish-reader-priv.h"
  27. #define reader gibbon_jelly_fish_lexer_get_extra(scanner)
  28. /*
  29. * Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
  30. * as well as gratuitiously global symbol names, so we can have multiple
  31. * yacc generated parsers in the same program. Note that these are only
  32. * the variables produced by yacc. If other parser generators (bison,
  33. * byacc, etc) produce additional global names that conflict at link time,
  34. * then those parser generators need to be fixed instead of adding those
  35. * names to this list.
  36. */
  37. #define yymaxdepth gibbon_jelly_fish_parser_maxdepth
  38. #define yyparse(s) gibbon_jelly_fish_parser_parse(s)
  39. #define yylex gibbon_jelly_fish_lexer_lex
  40. extern int gibbon_jelly_fish_lexer_lex (YYSTYPE * lvalp, void *scanner);
  41. #define yyerror gibbon_jelly_fish_reader_yyerror
  42. #define yylval gibbon_jelly_fish_parser_lval
  43. #define yychar gibbon_jelly_fish_parser_char
  44. #define yydebug gibbon_jelly_fish_parser_debug
  45. #define yypact gibbon_jelly_fish_parser_pact
  46. #define yyr1 gibbon_jelly_fish_parser_r1
  47. #define yyr2 gibbon_jelly_fish_parser_r2
  48. #define yydef gibbon_jelly_fish_parser_def
  49. #define yychk gibbon_jelly_fish_parser_chk
  50. #define yypgo gibbon_jelly_fish_parser_pgo
  51. #define yyact gibbon_jelly_fish_parser_act
  52. #define yyexca gibbon_jelly_fish_parser_exca
  53. #define yyerrflag gibbon_jelly_fish_parser_errflag
  54. #define yynerrs gibbon_jelly_fish_parser_nerrs
  55. #define yyps gibbon_jelly_fish_parser_ps
  56. #define yypv gibbon_jelly_fish_parser_pv
  57. #define yys gibbon_jelly_fish_parser_s
  58. #define yy_yys gibbon_jelly_fish_parser_yys
  59. #define yystate gibbon_jelly_fish_parser_state
  60. #define yytmp gibbon_jelly_fish_parser_tmp
  61. #define yyv gibbon_jelly_fish_parser_v
  62. #define yy_yyv gibbon_jelly_fish_parser_yyv
  63. #define yyval gibbon_jelly_fish_parser_val
  64. #define yylloc gibbon_jelly_fish_parser_lloc
  65. #define yyreds gibbon_jelly_fish_parser_reds /* With YYDEBUG defined */
  66. #define yytoks gibbon_jelly_fish_parser_toks /* With YYDEBUG defined */
  67. #define yylhs gibbon_jelly_fish_parser_yylhs
  68. #define yylen gibbon_jelly_fish_parser_yylen
  69. #define yydefred gibbon_jelly_fish_parser_yydefred
  70. #define yysdgoto gibbon_jelly_fish_parser_yydgoto
  71. #define yysindex gibbon_jelly_fish_parser_yysindex
  72. #define yyrindex gibbon_jelly_fish_parser_yyrindex
  73. #define yygindex gibbon_jelly_fish_parser_yygindex
  74. #define yytable gibbon_jelly_fish_parser_yytable
  75. #define yycheck gibbon_jelly_fish_parser_yycheck
  76. static guint gibbon_jelly_fish_parser_encode_movement (guint64 from,
  77. guint64 to);
  78. %}
  79. %union {
  80. guint64 num;
  81. gchar *name;
  82. }
  83. %token <num> INTEGER
  84. %token <name> PLAYER
  85. %token MATCH_LENGTH
  86. %token GAME
  87. %token COLON
  88. %token WHITESPACE
  89. %token PAREN
  90. %token <num> ROLL
  91. %token SLASH
  92. %token <num> POINT
  93. %token DOUBLES
  94. %token DROPS
  95. %token TAKES
  96. %token <num> WINS
  97. %type <name> opponent
  98. %type <num> movement
  99. %type <num> movements
  100. %pure-parser
  101. %lex-param {void *scanner}
  102. %parse-param {void *scanner}
  103. %%
  104. jelly_fish_file
  105. : prolog games { gibbon_jelly_fish_reader_free_names (reader); }
  106. ;
  107. prolog
  108. : INTEGER MATCH_LENGTH
  109. {
  110. _gibbon_jelly_fish_reader_set_match_length (reader, $1);
  111. }
  112. ;
  113. games
  114. : game
  115. | games game
  116. ;
  117. game
  118. : game_prolog opponents
  119. {
  120. _gibbon_jelly_fish_reader_set_side (
  121. reader,
  122. GIBBON_POSITION_SIDE_BLACK
  123. );
  124. }
  125. actions
  126. ;
  127. game_prolog
  128. : GAME INTEGER
  129. {
  130. if (!_gibbon_jelly_fish_reader_add_game (reader))
  131. YYABORT;
  132. }
  133. ;
  134. opponents
  135. : opponent opponent
  136. {
  137. _gibbon_jelly_fish_reader_set_black (reader, $1);
  138. _gibbon_jelly_fish_reader_set_white (reader, $2);
  139. gibbon_jelly_fish_reader_free_names (reader);
  140. }
  141. ;
  142. opponent
  143. : PLAYER COLON INTEGER { $$ = $1; }
  144. ;
  145. actions
  146. : /* empty */
  147. | action actions
  148. ;
  149. action
  150. : move
  151. ;
  152. move
  153. : INTEGER PAREN
  154. half_move
  155. {
  156. _gibbon_jelly_fish_reader_set_side (
  157. reader,
  158. GIBBON_POSITION_SIDE_WHITE
  159. );
  160. }
  161. half_move
  162. {
  163. _gibbon_jelly_fish_reader_set_side (
  164. reader,
  165. GIBBON_POSITION_SIDE_BLACK
  166. );
  167. }
  168. | INTEGER PAREN half_move
  169. {
  170. _gibbon_jelly_fish_reader_set_side (
  171. reader,
  172. GIBBON_POSITION_SIDE_BLACK
  173. );
  174. }
  175. | INTEGER PAREN WHITESPACE
  176. {
  177. _gibbon_jelly_fish_reader_set_side (
  178. reader,
  179. GIBBON_POSITION_SIDE_WHITE
  180. );
  181. }
  182. half_move
  183. {
  184. _gibbon_jelly_fish_reader_set_side (
  185. reader,
  186. GIBBON_POSITION_SIDE_BLACK
  187. );
  188. }
  189. | INTEGER PAREN WHITESPACE
  190. {
  191. _gibbon_jelly_fish_reader_set_side (
  192. reader,
  193. GIBBON_POSITION_SIDE_WHITE
  194. );
  195. }
  196. WINS
  197. {
  198. if (!_gibbon_jelly_fish_reader_win_game (reader, $5))
  199. YYABORT;
  200. _gibbon_jelly_fish_reader_set_side (
  201. reader,
  202. GIBBON_POSITION_SIDE_NONE
  203. );
  204. }
  205. | WHITESPACE
  206. {
  207. _gibbon_jelly_fish_reader_set_side (
  208. reader,
  209. GIBBON_POSITION_SIDE_WHITE
  210. );
  211. }
  212. WINS
  213. {
  214. if (!_gibbon_jelly_fish_reader_win_game (reader, $3))
  215. YYABORT;
  216. _gibbon_jelly_fish_reader_set_side (
  217. reader,
  218. GIBBON_POSITION_SIDE_NONE
  219. );
  220. }
  221. | WINS
  222. {
  223. if (!_gibbon_jelly_fish_reader_win_game (reader, $1))
  224. YYABORT;
  225. _gibbon_jelly_fish_reader_set_side (
  226. reader,
  227. GIBBON_POSITION_SIDE_NONE
  228. );
  229. }
  230. ;
  231. half_move
  232. : ROLL movements
  233. {
  234. if (!_gibbon_jelly_fish_reader_move (reader, $1, $2))
  235. YYABORT;
  236. }
  237. | DOUBLES
  238. {
  239. if (!_gibbon_jelly_fish_reader_double (reader))
  240. YYABORT;
  241. }
  242. | TAKES
  243. {
  244. if (!_gibbon_jelly_fish_reader_take (reader))
  245. YYABORT;
  246. }
  247. | DROPS
  248. {
  249. if (!_gibbon_jelly_fish_reader_drop (reader))
  250. YYABORT;
  251. }
  252. ;
  253. movements
  254. : /* empty */
  255. {
  256. $$ = 0;
  257. }
  258. | movement /* $$ = $1 */
  259. | movement movement
  260. {
  261. $$ = $1 << 16 | $2;
  262. }
  263. | movement movement movement
  264. {
  265. $$ = $1 << 32 | $2 << 16 | $3;
  266. }
  267. | movement movement movement movement
  268. {
  269. $$ = $1 << 48 | $2 << 32 | $3 << 16 | $4;
  270. }
  271. ;
  272. movement
  273. : POINT SLASH POINT
  274. {
  275. if ($1 == $3) {
  276. yyerror (scanner,
  277. _("Start and end point are equal!"));
  278. YYABORT;
  279. }
  280. $$ = gibbon_jelly_fish_parser_encode_movement ($1, $3);
  281. }
  282. ;
  283. %%
  284. static guint
  285. gibbon_jelly_fish_parser_encode_movement (guint64 from, guint64 to)
  286. {
  287. return (from << 8 | to);
  288. }