home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / usr.bin / groff / eqn / eqn.y < prev    next >
Encoding:
Text File  |  1991-04-30  |  6.5 KB  |  329 lines

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