/contrib/groff/src/preproc/eqn/eqn.y

https://bitbucket.org/freebsd/freebsd-head/ · Happy · 330 lines · 301 code · 29 blank · 0 comment · 0 complexity · 89e54ab6ad7a65fbae7499b41115da7a MD5 · raw file

  1. /* Copyright (C) 1989, 1990, 1991, 1992, 2004 Free Software Foundation, Inc.
  2. Written by James Clark (jjc@jclark.com)
  3. This file is part of groff.
  4. groff is free software; you can redistribute it and/or modify it under
  5. the terms of the GNU General Public License as published by the Free
  6. Software Foundation; either version 2, or (at your option) any later
  7. version.
  8. groff is distributed in the hope that it will be useful, but WITHOUT ANY
  9. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  11. for more details.
  12. You should have received a copy of the GNU General Public License along
  13. with groff; see the file COPYING. If not, write to the Free Software
  14. Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
  15. %{
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <stdlib.h>
  19. #include "lib.h"
  20. #include "box.h"
  21. extern int non_empty_flag;
  22. int yylex();
  23. void yyerror(const char *);
  24. %}
  25. %union {
  26. char *str;
  27. box *b;
  28. pile_box *pb;
  29. matrix_box *mb;
  30. int n;
  31. column *col;
  32. }
  33. %token OVER
  34. %token SMALLOVER
  35. %token SQRT
  36. %token SUB
  37. %token SUP
  38. %token LPILE
  39. %token RPILE
  40. %token CPILE
  41. %token PILE
  42. %token LEFT
  43. %token RIGHT
  44. %token TO
  45. %token FROM
  46. %token SIZE
  47. %token FONT
  48. %token ROMAN
  49. %token BOLD
  50. %token ITALIC
  51. %token FAT
  52. %token ACCENT
  53. %token BAR
  54. %token UNDER
  55. %token ABOVE
  56. %token <str> TEXT
  57. %token <str> QUOTED_TEXT
  58. %token FWD
  59. %token BACK
  60. %token DOWN
  61. %token UP
  62. %token MATRIX
  63. %token COL
  64. %token LCOL
  65. %token RCOL
  66. %token CCOL
  67. %token MARK
  68. %token LINEUP
  69. %token TYPE
  70. %token VCENTER
  71. %token PRIME
  72. %token SPLIT
  73. %token NOSPLIT
  74. %token UACCENT
  75. %token SPECIAL
  76. /* these are handled in the lexer */
  77. %token SPACE
  78. %token GFONT
  79. %token GSIZE
  80. %token DEFINE
  81. %token NDEFINE
  82. %token TDEFINE
  83. %token SDEFINE
  84. %token UNDEF
  85. %token IFDEF
  86. %token INCLUDE
  87. %token DELIM
  88. %token CHARTYPE
  89. %token SET
  90. %token GRFONT
  91. %token GBFONT
  92. /* The original eqn manual says that `left' is right associative. It's lying.
  93. Consider `left ( ~ left ( ~ right ) right )'. */
  94. %right LEFT
  95. %left RIGHT
  96. %right LPILE RPILE CPILE PILE TEXT QUOTED_TEXT MATRIX MARK LINEUP '^' '~' '\t' '{' SPLIT NOSPLIT
  97. %right FROM TO
  98. %left SQRT OVER SMALLOVER
  99. %right SUB SUP
  100. %right ROMAN BOLD ITALIC FAT FONT SIZE FWD BACK DOWN UP TYPE VCENTER SPECIAL
  101. %right BAR UNDER PRIME
  102. %left ACCENT UACCENT
  103. %type <b> mark from_to sqrt_over script simple equation nonsup
  104. %type <n> number
  105. %type <str> text delim
  106. %type <pb> pile_element_list pile_arg
  107. %type <mb> column_list
  108. %type <col> column column_arg column_element_list
  109. %%
  110. top:
  111. /* empty */
  112. | equation
  113. { $1->top_level(); non_empty_flag = 1; }
  114. ;
  115. equation:
  116. mark
  117. { $$ = $1; }
  118. | equation mark
  119. {
  120. list_box *lb = $1->to_list_box();
  121. if (!lb)
  122. lb = new list_box($1);
  123. lb->append($2);
  124. $$ = lb;
  125. }
  126. ;
  127. mark:
  128. from_to
  129. { $$ = $1; }
  130. | MARK mark
  131. { $$ = make_mark_box($2); }
  132. | LINEUP mark
  133. { $$ = make_lineup_box($2); }
  134. ;
  135. from_to:
  136. sqrt_over %prec FROM
  137. { $$ = $1; }
  138. | sqrt_over TO from_to
  139. { $$ = make_limit_box($1, 0, $3); }
  140. | sqrt_over FROM sqrt_over
  141. { $$ = make_limit_box($1, $3, 0); }
  142. | sqrt_over FROM sqrt_over TO from_to
  143. { $$ = make_limit_box($1, $3, $5); }
  144. | sqrt_over FROM sqrt_over FROM from_to
  145. { $$ = make_limit_box($1, make_limit_box($3, $5, 0), 0); }
  146. ;
  147. sqrt_over:
  148. script
  149. { $$ = $1; }
  150. | SQRT sqrt_over
  151. { $$ = make_sqrt_box($2); }
  152. | sqrt_over OVER sqrt_over
  153. { $$ = make_over_box($1, $3); }
  154. | sqrt_over SMALLOVER sqrt_over
  155. { $$ = make_small_over_box($1, $3); }
  156. ;
  157. script:
  158. nonsup
  159. { $$ = $1; }
  160. | simple SUP script
  161. { $$ = make_script_box($1, 0, $3); }
  162. ;
  163. nonsup:
  164. simple %prec SUP
  165. { $$ = $1; }
  166. | simple SUB nonsup
  167. { $$ = make_script_box($1, $3, 0); }
  168. | simple SUB simple SUP script
  169. { $$ = make_script_box($1, $3, $5); }
  170. ;
  171. simple:
  172. TEXT
  173. { $$ = split_text($1); }
  174. | QUOTED_TEXT
  175. { $$ = new quoted_text_box($1); }
  176. | SPLIT QUOTED_TEXT
  177. { $$ = split_text($2); }
  178. | NOSPLIT TEXT
  179. { $$ = new quoted_text_box($2); }
  180. | '^'
  181. { $$ = new half_space_box; }
  182. | '~'
  183. { $$ = new space_box; }
  184. | '\t'
  185. { $$ = new tab_box; }
  186. | '{' equation '}'
  187. { $$ = $2; }
  188. | PILE pile_arg
  189. { $2->set_alignment(CENTER_ALIGN); $$ = $2; }
  190. | LPILE pile_arg
  191. { $2->set_alignment(LEFT_ALIGN); $$ = $2; }
  192. | RPILE pile_arg
  193. { $2->set_alignment(RIGHT_ALIGN); $$ = $2; }
  194. | CPILE pile_arg
  195. { $2->set_alignment(CENTER_ALIGN); $$ = $2; }
  196. | MATRIX '{' column_list '}'
  197. { $$ = $3; }
  198. | LEFT delim equation RIGHT delim
  199. { $$ = make_delim_box($2, $3, $5); }
  200. | LEFT delim equation
  201. { $$ = make_delim_box($2, $3, 0); }
  202. | simple BAR
  203. { $$ = make_overline_box($1); }
  204. | simple UNDER
  205. { $$ = make_underline_box($1); }
  206. | simple PRIME
  207. { $$ = make_prime_box($1); }
  208. | simple ACCENT simple
  209. { $$ = make_accent_box($1, $3); }
  210. | simple UACCENT simple
  211. { $$ = make_uaccent_box($1, $3); }
  212. | ROMAN simple
  213. { $$ = new font_box(strsave(get_grfont()), $2); }
  214. | BOLD simple
  215. { $$ = new font_box(strsave(get_gbfont()), $2); }
  216. | ITALIC simple
  217. { $$ = new font_box(strsave(get_gfont()), $2); }
  218. | FAT simple
  219. { $$ = new fat_box($2); }
  220. | FONT text simple
  221. { $$ = new font_box($2, $3); }
  222. | SIZE text simple
  223. { $$ = new size_box($2, $3); }
  224. | FWD number simple
  225. { $$ = new hmotion_box($2, $3); }
  226. | BACK number simple
  227. { $$ = new hmotion_box(-$2, $3); }
  228. | UP number simple
  229. { $$ = new vmotion_box($2, $3); }
  230. | DOWN number simple
  231. { $$ = new vmotion_box(-$2, $3); }
  232. | TYPE text simple
  233. { $3->set_spacing_type($2); $$ = $3; }
  234. | VCENTER simple
  235. { $$ = new vcenter_box($2); }
  236. | SPECIAL text simple
  237. { $$ = make_special_box($2, $3); }
  238. ;
  239. number:
  240. text
  241. {
  242. int n;
  243. if (sscanf($1, "%d", &n) == 1)
  244. $$ = n;
  245. a_delete $1;
  246. }
  247. ;
  248. pile_element_list:
  249. equation
  250. { $$ = new pile_box($1); }
  251. | pile_element_list ABOVE equation
  252. { $1->append($3); $$ = $1; }
  253. ;
  254. pile_arg:
  255. '{' pile_element_list '}'
  256. { $$ = $2; }
  257. | number '{' pile_element_list '}'
  258. { $3->set_space($1); $$ = $3; }
  259. ;
  260. column_list:
  261. column
  262. { $$ = new matrix_box($1); }
  263. | column_list column
  264. { $1->append($2); $$ = $1; }
  265. ;
  266. column_element_list:
  267. equation
  268. { $$ = new column($1); }
  269. | column_element_list ABOVE equation
  270. { $1->append($3); $$ = $1; }
  271. ;
  272. column_arg:
  273. '{' column_element_list '}'
  274. { $$ = $2; }
  275. | number '{' column_element_list '}'
  276. { $3->set_space($1); $$ = $3; }
  277. ;
  278. column:
  279. COL column_arg
  280. { $2->set_alignment(CENTER_ALIGN); $$ = $2; }
  281. | LCOL column_arg
  282. { $2->set_alignment(LEFT_ALIGN); $$ = $2; }
  283. | RCOL column_arg
  284. { $2->set_alignment(RIGHT_ALIGN); $$ = $2; }
  285. | CCOL column_arg
  286. { $2->set_alignment(CENTER_ALIGN); $$ = $2; }
  287. ;
  288. text: TEXT
  289. { $$ = $1; }
  290. | QUOTED_TEXT
  291. { $$ = $1; }
  292. ;
  293. delim:
  294. text
  295. { $$ = $1; }
  296. | '{'
  297. { $$ = strsave("{"); }
  298. | '}'
  299. { $$ = strsave("}"); }
  300. ;
  301. %%