TeX in C
Explore TeX with modern c compiler.
lexer.h
浏览该文件的文档.
1 #pragma once
2 #ifndef INC_LEXER_H
12 #define INC_LEXER_H
13 #include <stdio.h> // FILE
14 #include "global.h"
15 #include "tex_constant.h" // [const] BUF_SIZE, HALF_ERROR_LINE, STACK_SIZE, MAX_IN_OPEN, PARAM_SIZE, NEST_SIZE, EMPTY, MIN_QUARTER_WORD
16 // [enum] CatCode
17 
22 #define LOC cur_input.locfield // end group S25x37_P13x18
24 
28 // [#211]
29 #define V_MODE 1 // vertical mode
30 #define H_MODE (V_MODE + MAX_COMMAND + 1) // horizontal mode
31 #define M_MODE (H_MODE + MAX_COMMAND + 1) // math mode
32 
34 #define ignoredepth (-65536000L)
35 
46 typedef struct {
48  Pointer headfield, tailfield;
49  Integer pgfield, mlfield;
51 } ListStateRecord; // (16+128+128+64) = (336)
52 
54 #define mode cur_list.modefield
56 #define head cur_list.headfield
58 #define tail cur_list.tailfield
60 #define prevgraf cur_list.pgfield
62 #define aux cur_list.auxfield
64 #define prevdepth aux.sc
66 #define spacefactor aux.hh.UU.lh
68 #define clang aux.hh.rh
70 #define incompleatnoad aux.int_
72 #define modeline cur_list.mlfield
73 
75 #define tailappend(x) (link(tail) = (x), tail = link(tail)) // end group S211x219_P77x80
77 
87 #define CS_TOKEN_FLAG (dwa_do_8 * 16 - 1)
88 
89 #define leftbracetoken (dwa_do_8 * LEFT_BRACE)
90 #define leftbracelimit (dwa_do_8 * (LEFT_BRACE + 1))
91 #define rightbracetoken (dwa_do_8 * RIGHT_BRACE)
92 #define rightbracelimit (dwa_do_8 * (RIGHT_BRACE + 1))
93 #define mathshifttoken (dwa_do_8 * MATH_SHIFT)
94 #define tabtoken (dwa_do_8 * TAB_MARK)
95 #define outparamtoken (dwa_do_8 * OUT_PARAM)
96 #define spacetoken (dwa_do_8 * SPACER + ' ')
97 #define lettertoken (dwa_do_8 * LETTER)
98 #define othertoken (dwa_do_8 * OTHER_CHAR)
99 #define matchtoken (dwa_do_8 * MATCH)
100 #define endmatchtoken (dwa_do_8 * END_MATCH) // end group S289x296_P115x118
102 
115 typedef struct {
116  QuarterWord statefield, indexfield;
117  HalfWord startfield, locfield, limitfield, namefield;
119  Pointer tok_list, tok_loc, tok_name, tok_param;
120 } InStateRecord;
121 
124  SKIPPING = 1,
128  ABSORBING
129 };
130 
132 enum TokenType {
140 
149  WRITE_TEXT
150 };
151 
153 #define TOKEN_LIST 0
154 
171 #define STATE cur_input.statefield
172 #define IINDEX cur_input.indexfield
173 #define START cur_input.startfield
174 #define LIMIT cur_input.limitfield
175 #define NAME cur_input.namefield
176 
178 #define MID_LINE 1
180 #define SKIP_BLANKS (MAX_CHAR_CODE + 2)
182 #define NEW_LINE (MAX_CHAR_CODE + MAX_CHAR_CODE + 3)
183 
185 #define terminal_input (NAME == 0)
187 #define curfile (inputfile[IINDEX - 1])
188 
190 #define token_type IINDEX
192 #define param_start LIMIT // end group S300x320_P121x130
197 // [p131#322] leave an input level, re-enter the old
198 #define popinput() (inputptr--, cur_input = inputstack[inputptr])
199 // [p131#323] backs up a simple token list
200 #define backlist(x) begintokenlist((x), BACKED_UP)
201 // [p131#323] inserts a simple token list
202 #define inslist(x) begintokenlist((x), INSERTED) // end group S321x331_P131x133
207 // #define switch_ 25
209 // #define startcs 26
210 // [p141#358]
211 #define noexpandflag 257
212 
214 #define ishex(x) \
215  ((((x) >= '0') && ((x) <= '9')) || (((x) >= 'a') && ((x) <= 'f')))
216 
218 #define end_line_char_inactive ((end_line_char < 0) || (end_line_char > 255))
219  // end group S332x365_P134x143
221 
222 
223 // [#213] semantic
224 extern ListStateRecord nest[NEST_SIZE + 1];
225 extern UChar nest_ptr;
226 extern UChar max_nest_stack;
228 
229 
230 extern EightBits curcmd;
231 extern HalfWord curchr;
232 extern Pointer curcs;
233 extern HalfWord curtok;
234 
236 extern UChar inputptr;
237 extern InStateRecord cur_input;
238 
239 extern char openparens;
240 extern Integer line;
241 extern FILE* inputfile[MAX_IN_OPEN];
242 extern char scanner_status;
243 extern Pointer warning_index;
244 extern Pointer defref;
245 extern Pointer paramstack[PARAM_SIZE + 1];
246 extern int paramptr;
247 extern Integer maxparamstack;
248 extern Integer align_state;
249 extern UChar baseptr;
250 
251 extern Pointer parloc;
252 extern HalfWord partoken;
253 extern Boolean force_eof;
254 
255 
256 extern void showtokenlist(Integer p, Integer q, Integer l);
257 extern void token_show(Pointer p);
258 extern void print_meaning(EightBits _cmd, HalfWord _chr);
259 extern void showcurcmdchr(void);
260 extern void runaway(void);
261 extern void showcontext(void);
262 extern Boolean init_lexer(void);
263 
264 extern void begintokenlist(HalfWord p, QuarterWord t);
265 extern void endtokenlist(void);
266 extern void backinput(void);
267 extern void backerror(void);
268 extern void inserror(void);
269 extern void beginfilereading(void);
270 extern void endfilereading(void);
271 extern void clearforerrorprompt(void);
272 
273 extern void get_next(void);
274 extern void firm_up_the_line(void);
275 extern void get_token(void);
276 
277 extern HalfWord _pack_tok(Pointer _cs, EightBits _cmd, HalfWord _chr);
278 extern UChar get_maxinstack();
279 
280 
281 // [#211] semantic
282 
283 extern void lexer_semantic_init();
284 extern void print_mode(Integer m);
285 extern void pushnest(void);
286 extern void popnest(void);
287 extern void showactivities(void);
288 
289 #endif // INC_LEXER_H
uint16_t QuarterWord
[p43#113]: QuarterWord(8=>16) .
Definition: tex_types.h:126
uint32_t HalfWord
[p43#113]: HalfWord(16=>32) .
Definition: tex_types.h:127
#define PARAM_SIZE
[#11] maximum number of simultaneous macro parameters.
Definition: tex_constant.h:90
#define STACK_SIZE
[#11] maximum number of simultaneous input sources.
Definition: tex_constant.h:75
#define MAX_IN_OPEN
[#11] maximum number of input files and error insertions that can be going on simultaneously.
Definition: tex_constant.h:79
#define NEST_SIZE
[#11] maximum number of semantic levels simultaneously active.
Definition: tex_constant.h:93
ListStateRecord cur_list
Definition: lexer.c:30
UChar max_nest_stack
Definition: lexer.c:29
void print_mode(Integer m)
Definition: lexer.c:146
void pushnest(void)
[#216] enter a new semantic level, save the old.
Definition: lexer.c:167
void lexer_semantic_init()
[#215]
Definition: lexer.c:129
void popnest(void)
[#217] leave a semantic level, re-enter the old.
Definition: lexer.c:182
UChar nest_ptr
Definition: lexer.c:28
ListStateRecord nest[NEST_SIZE+1]
[ #211~219: PART 16: THE SEMANTIC NEST ]
Definition: lexer.c:27
void showactivities(void)
[#218] displays what TEX is working on, at all levels.
Definition: lexer.c:189
UChar EightBits
[#25]: EightBits::UChar(8) = [0, 255]
Definition: tex_types.h:98
void print_meaning(EightBits _cmd, HalfWord _chr)
[p118#296] displays cur cmd and cur chr in symbolic form, including the expansion of a macro or mark.
Definition: lexer.c:424
void showtokenlist(Integer p, Integer q, Integer l)
[p117#292]
Definition: lexer.c:321
void token_show(Pointer p)
[p118#295] display a token list, given a pointer to its reference count.
Definition: lexer.c:418
HalfWord curchr
[#297]: operand of current command a character code or other modifier of the command code.
Definition: lexer.c:43
EightBits curcmd
[#297]: current command set by get_next a command code from the long list of codes given above.
Definition: lexer.c:40
HalfWord curtok
[#297]: packed representative of curcmd and curchr.
Definition: lexer.c:48
void showcurcmdchr(void)
[p120#299] displays the current command.
Definition: lexer.c:446
Pointer curcs
[#297]: control sequence found here, zero if none found the eqtb location of the current control sequ...
Definition: lexer.c:46
void showcontext(void)
[#311] prints where the scanner is.
Definition: lexer.c:502
Integer maxparamstack
[#308] largest value of param ptr, will be ≤ param size + 9 . / xref[only tex.c]: macrocall
Definition: lexer.c:99
int paramptr
[#308] first unused entry in param stack. / xref[only tex.c]: macrocall
Definition: lexer.c:96
Pointer paramstack[PARAM_SIZE+1]
[#308] token list pointers for parameters. / xref[only tex.c]: macrocall
Definition: lexer.c:93
char scanner_status
[#305] can a subfile end now?
Definition: lexer.c:85
FILE * inputfile[MAX_IN_OPEN]
xref[]: start_input
Definition: lexer.c:81
Integer align_state
[#309] group level with respect to current alignment.
Definition: lexer.c:101
char openparens
the number of open text files xref[2, only tex.c]: start_input, final_cleanup
Definition: lexer.c:78
InStateRecord inputstack[STACK_SIZE+1]
[#301]:
Definition: lexer.c:60
TokenType
[p125#307]
Definition: lexer.h:132
Pointer defref
[#305] reference count of token list being defined
Definition: lexer.c:89
ScannerStatus
[p124#305]: scanner status
Definition: lexer.h:123
InStateRecord cur_input
xref[]: 35, 36, 87, 301, 302, 311, 321, 322, 534, 1131, error, open_log_file
Definition: lexer.c:72
UChar inputptr
[#301]: first unused location of input stack.
Definition: lexer.c:66
Integer line
current line number in the current source file.
Definition: lexer.c:79
void runaway(void)
[#306] uses scanner status to print a warning message when a subfile has ended, and at certain other ...
Definition: lexer.c:469
UChar baseptr
[#310] shallowest level shown by show context.
Definition: lexer.c:104
Pointer warning_index
[#305] identifier relevant to non-normal scanner status
Definition: lexer.c:87
@ MARK_TEXT
\topmark, etc.
Definition: lexer.h:148
@ PARAMETER
parameter
Definition: lexer.h:133
@ EVERY_DISPLAY_TEXT
\everydisplay
Definition: lexer.h:143
@ EVERY_JOB_TEXT
\everyjob
Definition: lexer.h:146
@ OUTPUT_TEXT
output routines
Definition: lexer.h:139
@ MACRO
defined control sequences
Definition: lexer.h:138
@ INSERTED
inserted texts
Definition: lexer.h:137
@ V_TEMPLATE
<v_j> template
Definition: lexer.h:135
@ WRITE_TEXT
\write
Definition: lexer.h:149
@ EVERY_PAR_TEXT
\everypar
Definition: lexer.h:141
@ U_TEMPLATE
<u_j> template
Definition: lexer.h:134
@ EVERY_HBOX_TEXT
\everyhbox
Definition: lexer.h:144
@ BACKED_UP
text to be reread
Definition: lexer.h:136
@ EVERY_MATH_TEXT
\everymath
Definition: lexer.h:142
@ EVERY_CR_TEXT
\everycr
Definition: lexer.h:147
@ EVERY_VBOX_TEXT
\everyvbox
Definition: lexer.h:145
@ ALIGNING
when reading an alignment preamble
Definition: lexer.h:127
@ DEFINING
when reading a macro definition
Definition: lexer.h:125
@ ABSORBING
when reading a balanced text
Definition: lexer.h:128
@ MATCHING
when reading macro arguments
Definition: lexer.h:126
@ SKIPPING
when passing conditional text
Definition: lexer.h:124
void clearforerrorprompt(void)
[#330] removes completed error-inserted lines from memory
Definition: lexer.c:808
void endfilereading(void)
[#329] variables must be downdated when such a level of input is finished
Definition: lexer.c:799
void begintokenlist(HalfWord p, QuarterWord t)
Definition: lexer.c:661
void backerror(void)
[#327] back up one token and call error
Definition: lexer.c:760
void inserror(void)
[#327] back up one inserted token and call error
Definition: lexer.c:768
Boolean init_lexer(void)
[#331] 初始化变量
Definition: lexer.c:820
void endtokenlist(void)
[#324] leave a token-list input level
Definition: lexer.c:707
void beginfilereading(void)
[#328] starts a new level of input for lines of characters to be read from a file,...
Definition: lexer.c:778
void backinput(void)
[#325] undoes one token of input
Definition: lexer.c:733
void firm_up_the_line(void)
[#363] If the user has set the pausing parameter to some positive value, and if nonstop mode has not ...
Definition: lexer.c:1423
void get_token(void)
[#365]
Definition: lexer.c:1451
HalfWord partoken
Definition: lexer.c:114
Boolean force_eof
Definition: lexer.c:116
void get_next(void)
Definition: lexer.c:1419
Pointer parloc
Definition: lexer.c:112
UChar get_maxinstack()
Definition: lexer.c:121
HalfWord _pack_tok(Pointer _cs, EightBits _cmd, HalfWord _chr)
[p143#365] 辅助函数
Definition: lexer.c:1458
[#300]: InStateRecord(1344) .
Definition: lexer.h:115
QuarterWord indexfield
Definition: lexer.h:116
QuarterWord tok_type
Definition: lexer.h:118
HalfWord limitfield
Definition: lexer.h:117
Pointer tok_list
Definition: lexer.h:119
[#212]: ListStateRecord(366) .
Definition: lexer.h:46
Int16 modefield
(16) only need [-203, 203]
Definition: lexer.h:47
Integer mlfield
(64)*2= 128
Definition: lexer.h:49
MemoryWord auxfield
(64)
Definition: lexer.h:50
Pointer headfield
Definition: lexer.h:48
int64_t Integer
Integer(64) =
Definition: tex_types.h:42
size_t Pointer
Pointer::size_t(64), a flag or a location in mem or eqtb.
Definition: tex_types.h:45
bool Boolean
布尔类型定义
Definition: tex_types.h:11
uint8_t UChar
UChar(8) = [0, 255]
Definition: tex_types.h:38
int16_t Int16
Int16(16) =
Definition: tex_types.h:47
[p43#113]: MemoryWord(64) .
Definition: tex_types.h:164