📄 eqn.y
字号:
/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com)This file is part of groff.groff is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 2, or (at your option) any laterversion.groff is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public Licensefor more details.You should have received a copy of the GNU General Public License alongwith groff; see the file COPYING. If not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA. */%{#include <stdio.h>#include <string.h>#include <stdlib.h>#include "lib.h"#include "box.h"extern int non_empty_flag;char *strsave(const char *);int yylex();void yyerror(const char *);%}%union { char *str; box *b; pile_box *pb; matrix_box *mb; int n; column *col;}%token OVER%token SMALLOVER%token SQRT%token SUB%token SUP%token LPILE%token RPILE%token CPILE%token PILE%token LEFT%token RIGHT%token TO%token FROM%token SIZE%token FONT%token ROMAN%token BOLD%token ITALIC%token FAT%token ACCENT%token BAR%token UNDER%token ABOVE%token <str> TEXT%token <str> QUOTED_TEXT%token FWD%token BACK%token DOWN%token UP%token MATRIX%token COL%token LCOL%token RCOL%token CCOL%token MARK%token LINEUP%token TYPE%token VCENTER%token PRIME%token SPLIT%token NOSPLIT%token UACCENT%token SPECIAL/* these are handled in the lexer */%token SPACE%token GFONT%token GSIZE%token DEFINE%token NDEFINE%token TDEFINE%token SDEFINE%token UNDEF%token IFDEF%token INCLUDE%token DELIM%token CHARTYPE%token SET%token GRFONT%token GBFONT/* The original eqn manual says that `left' is right associative. It's lying.Consider `left ( ~ left ( ~ right ) right )'. */%right LEFT%left RIGHT%right LPILE RPILE CPILE PILE TEXT QUOTED_TEXT MATRIX MARK LINEUP '^' '~' '\t' '{' SPLIT NOSPLIT%right FROM TO%left SQRT OVER SMALLOVER%right SUB SUP%right ROMAN BOLD ITALIC FAT FONT SIZE FWD BACK DOWN UP TYPE VCENTER SPECIAL%right BAR UNDER PRIME%left ACCENT UACCENT%type <b> mark from_to sqrt_over script simple equation nonsup%type <n> number%type <str> text delim%type <pb> pile_element_list pile_arg%type <mb> column_list%type <col> column column_arg column_element_list%%top: /* empty */ | equation { $1->top_level(); non_empty_flag = 1; } ;equation: mark { $$ = $1; } | equation mark { list_box *lb = $1->to_list_box(); if (!lb) lb = new list_box($1); lb->append($2); $$ = lb; } ;mark: from_to { $$ = $1; } | MARK mark { $$ = make_mark_box($2); } | LINEUP mark { $$ = make_lineup_box($2); } ;from_to: sqrt_over %prec FROM { $$ = $1; } | sqrt_over TO from_to { $$ = make_limit_box($1, 0, $3); } | sqrt_over FROM sqrt_over { $$ = make_limit_box($1, $3, 0); } | sqrt_over FROM sqrt_over TO from_to { $$ = make_limit_box($1, $3, $5); } | sqrt_over FROM sqrt_over FROM from_to { $$ = make_limit_box($1, make_limit_box($3, $5, 0), 0); } ;sqrt_over: script { $$ = $1; } | SQRT sqrt_over { $$ = make_sqrt_box($2); } | sqrt_over OVER sqrt_over { $$ = make_over_box($1, $3); } | sqrt_over SMALLOVER sqrt_over { $$ = make_small_over_box($1, $3); } ;script: nonsup { $$ = $1; } | simple SUP script { $$ = make_script_box($1, 0, $3); } ;nonsup: simple %prec SUP { $$ = $1; } | simple SUB nonsup { $$ = make_script_box($1, $3, 0); } | simple SUB simple SUP script { $$ = make_script_box($1, $3, $5); } ;simple: TEXT { $$ = split_text($1); } | QUOTED_TEXT { $$ = new quoted_text_box($1); } | SPLIT QUOTED_TEXT { $$ = split_text($2); } | NOSPLIT TEXT { $$ = new quoted_text_box($2); } | '^' { $$ = new half_space_box; } | '~' { $$ = new space_box; } | '\t' { $$ = new tab_box; } | '{' equation '}' { $$ = $2; } | PILE pile_arg { $2->set_alignment(CENTER_ALIGN); $$ = $2; } | LPILE pile_arg { $2->set_alignment(LEFT_ALIGN); $$ = $2; } | RPILE pile_arg { $2->set_alignment(RIGHT_ALIGN); $$ = $2; } | CPILE pile_arg { $2->set_alignment(CENTER_ALIGN); $$ = $2; } | MATRIX '{' column_list '}' { $$ = $3; } | LEFT delim equation RIGHT delim { $$ = make_delim_box($2, $3, $5); } | LEFT delim equation { $$ = make_delim_box($2, $3, 0); } | simple BAR { $$ = make_overline_box($1); } | simple UNDER { $$ = make_underline_box($1); } | simple PRIME { $$ = make_prime_box($1); } | simple ACCENT simple { $$ = make_accent_box($1, $3); } | simple UACCENT simple { $$ = make_uaccent_box($1, $3); } | ROMAN simple { $$ = new font_box(strsave(get_grfont()), $2); } | BOLD simple { $$ = new font_box(strsave(get_gbfont()), $2); } | ITALIC simple { $$ = new font_box(strsave(get_gfont()), $2); } | FAT simple { $$ = new fat_box($2); } | FONT text simple { $$ = new font_box($2, $3); } | SIZE text simple { $$ = new size_box($2, $3); } | FWD number simple { $$ = new hmotion_box($2, $3); } | BACK number simple { $$ = new hmotion_box(-$2, $3); } | UP number simple { $$ = new vmotion_box($2, $3); } | DOWN number simple { $$ = new vmotion_box(-$2, $3); } | TYPE text simple { $3->set_spacing_type($2); $$ = $3; } | VCENTER simple { $$ = new vcenter_box($2); } | SPECIAL text simple { $$ = make_special_box($2, $3); } ; number: text { int n; if (sscanf($1, "%d", &n) == 1) $$ = n; a_delete $1; } ;pile_element_list: equation { $$ = new pile_box($1); } | pile_element_list ABOVE equation { $1->append($3); $$ = $1; } ;pile_arg: '{' pile_element_list '}' { $$ = $2; } | number '{' pile_element_list '}' { $3->set_space($1); $$ = $3; } ;column_list: column { $$ = new matrix_box($1); } | column_list column { $1->append($2); $$ = $1; } ;column_element_list: equation { $$ = new column($1); } | column_element_list ABOVE equation { $1->append($3); $$ = $1; } ;column_arg: '{' column_element_list '}' { $$ = $2; } | number '{' column_element_list '}' { $3->set_space($1); $$ = $3; } ;column: COL column_arg { $2->set_alignment(CENTER_ALIGN); $$ = $2; } | LCOL column_arg { $2->set_alignment(LEFT_ALIGN); $$ = $2; } | RCOL column_arg { $2->set_alignment(RIGHT_ALIGN); $$ = $2; } | CCOL column_arg { $2->set_alignment(CENTER_ALIGN); $$ = $2; } ;text: TEXT { $$ = $1; } | QUOTED_TEXT { $$ = $1; } ;delim: text { $$ = $1; } | '{' { $$ = strsave("{"); } | '}' { $$ = strsave("}"); } ;%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -