1#[derive(Debug, Clone, PartialOrd, PartialEq)]
2pub enum TokenType {
3 Greek(Greek),
4 Operation(Operation),
5 Misc(Misc),
6 Relational(Relational),
7 Arrow(Arrow),
8 Logical(Logical),
9 Function(Function),
10 LBrace(LBrace),
11 RBrace(RBrace),
12 UnaryOperator(UnaryOperator),
13 BinaryOperator(BinaryOperator),
14 Division,
15 Underscorce,
16 Hat,
17 Symbol,
18 Number,
19 Text,
20 None,
21}
22
23#[derive(Debug, Clone, PartialOrd, PartialEq)]
24pub enum Greek {
25 Alpha,
26 Beta,
27 Gamma,
28 UGamma,
29 Delta,
30 UDelta,
31 Epsilon,
32 VarEpsilon,
33 Zeta,
34 Eta,
35 Theta,
36 UTheta,
37 VarTheta,
38 Iota,
39 Kappa,
40 Lambda,
41 ULambda,
42 Mu,
43 Nu,
44 Xi,
45 UXi,
46 Pi,
47 UPi,
48 Rho,
49 Sigma,
50 USigma,
51 Tau,
52 Upsilon,
53 Phi,
54 UPhi,
55 VarPhi,
56 Chi,
57 Psi,
58 UPsi,
59 Omega,
60 UOmega,
61}
62
63pub const ALPHA: &str = "alpha";
64pub const BETA: &str = "beta";
65pub const GAMMA: &str = "gamma";
66pub const U_GAMMA: &str = "Gamma";
67pub const DELTA: &str = "delta";
68pub const U_DELTA: &str = "Delta";
69pub const EPSILON: &str = "epsilon";
70pub const VAR_EPSILON: &str = "varepsilon";
71pub const ZETA: &str = "zeta";
72pub const ETA: &str = "eta";
73pub const THETA: &str = "theta";
74pub const U_THETA: &str = "Theta";
75pub const VAR_THETA: &str = "vartheta";
76pub const IOTA: &str = "iota";
77pub const KAPPA: &str = "kappa";
78pub const LAMBDA: &str = "lambda";
79pub const U_LAMBDA: &str = "Lambda";
80pub const MU: &str = "mu";
81pub const NU: &str = "nu";
82pub const XI: &str = "xi";
83pub const U_XI: &str = "Xi";
84pub const PI: &str = "pi";
85pub const U_PI: &str = "Pi";
86pub const RHO: &str = "rho";
87pub const SIGMA: &str = "sigma";
88pub const U_SIGMA: &str = "Sigma";
89pub const TAU: &str = "tau";
90pub const UPSILON: &str = "upsilon";
91pub const PHI: &str = "phi";
92pub const U_PHI: &str = "Phi";
93pub const VAR_PHI: &str = "varphi";
94pub const CHI: &str = "chi";
95pub const PSI: &str = "psi";
96pub const U_PSI: &str = "Psi";
97pub const OMEGA: &str = "omega";
98pub const U_OMEGA: &str = "Omega";
99
100pub const GREEK: &[(&[&str], TokenType)] = &[
101 (&[ALPHA], TokenType::Greek(Greek::Alpha)),
102 (&[BETA], TokenType::Greek(Greek::Beta)),
103 (&[GAMMA], TokenType::Greek(Greek::Gamma)),
104 (&[U_GAMMA], TokenType::Greek(Greek::UGamma)),
105 (&[DELTA], TokenType::Greek(Greek::Delta)),
106 (&[U_DELTA], TokenType::Greek(Greek::UDelta)),
107 (&[EPSILON], TokenType::Greek(Greek::Epsilon)),
108 (&[VAR_EPSILON], TokenType::Greek(Greek::VarEpsilon)),
109 (&[ZETA], TokenType::Greek(Greek::Zeta)),
110 (&[ETA], TokenType::Greek(Greek::Eta)),
111 (&[THETA], TokenType::Greek(Greek::Theta)),
112 (&[U_THETA], TokenType::Greek(Greek::UTheta)),
113 (&[VAR_THETA], TokenType::Greek(Greek::VarTheta)),
114 (&[IOTA], TokenType::Greek(Greek::Iota)),
115 (&[KAPPA], TokenType::Greek(Greek::Kappa)),
116 (&[LAMBDA], TokenType::Greek(Greek::Lambda)),
117 (&[U_LAMBDA], TokenType::Greek(Greek::ULambda)),
118 (&[MU], TokenType::Greek(Greek::Mu)),
119 (&[NU], TokenType::Greek(Greek::Nu)),
120 (&[XI], TokenType::Greek(Greek::Xi)),
121 (&[U_XI], TokenType::Greek(Greek::UXi)),
122 (&[PI], TokenType::Greek(Greek::Pi)),
123 (&[U_PI], TokenType::Greek(Greek::UPi)),
124 (&[RHO], TokenType::Greek(Greek::Rho)),
125 (&[SIGMA], TokenType::Greek(Greek::Sigma)),
126 (&[U_SIGMA], TokenType::Greek(Greek::USigma)),
127 (&[TAU], TokenType::Greek(Greek::Tau)),
128 (&[UPSILON], TokenType::Greek(Greek::Upsilon)),
129 (&[PHI], TokenType::Greek(Greek::Phi)),
130 (&[U_PHI], TokenType::Greek(Greek::UPhi)),
131 (&[VAR_PHI], TokenType::Greek(Greek::VarPhi)),
132 (&[CHI], TokenType::Greek(Greek::Chi)),
133 (&[PSI], TokenType::Greek(Greek::Psi)),
134 (&[U_PSI], TokenType::Greek(Greek::UPsi)),
135 (&[OMEGA], TokenType::Greek(Greek::Omega)),
136 (&[U_OMEGA], TokenType::Greek(Greek::UOmega)),
137];
138
139#[derive(Debug, Clone, PartialOrd, PartialEq)]
140pub enum Misc {
141 Int,
142 OInt,
143 Del,
144 Grad,
145 PlusMinus,
146 EmptySet,
147 Infinity,
148 Aleph,
149 Therefore,
150 Because,
151 LDots,
152 CDots,
153 VDots,
154 DDots,
155 DoublePipes,
156 DoublePipesQuad,
157 Angle,
158 Frown,
159 Triangle,
160 Diamond,
161 Square,
162 LFloor,
163 RFloor,
164 LCeiling,
165 RCeiling,
166 Lim,
167 CC,
168 NN,
169 QQ,
170 RR,
171 ZZ,
172}
173
174pub const INT: &str = "int";
175pub const O_INT: &str = "oint";
176pub const DEL: &str = "del";
177pub const DEL_TEX: &str = "partial";
178pub const GRAD: &str = "grad";
179pub const GRAD_TEX: &str = "nabla";
180pub const PM: &str = "+-";
181pub const PM_TEX: &str = "pm";
182pub const EMPTY_SET: &str = "O/";
183pub const EMPTY_SET_TEX: &str = "emptyset";
184pub const INFINITY: &str = "oo";
185pub const INFINITY_TEX: &str = "infty";
186pub const ALEPH: &str = "aleph";
187pub const THEREFORE: &str = ":.";
188pub const THEREFORE_TEX: &str = "therefore";
189pub const BECAUSE: &str = ":'";
190pub const BECAUSE_TEX: &str = "because";
191pub const L_DOTS: &str = "|...|";
192pub const L_DOTS_TEX: &str = "|ldots|";
193pub const C_DOTS: &str = "|cdots|";
194pub const V_DOTS: &str = "vdots";
195pub const D_DOTS: &str = "ddots";
196pub const DOUBLE_PIPES: &str = "|\\ |";
197pub const DOUBLE_PIPES_QUAD: &str = "|quad|";
198pub const ANGLE: &str = "/_";
199pub const ANGLE_TEX: &str = "angle";
200pub const FROWN: &str = "frown";
201pub const TRIANGLE: &str = "/_\\";
202pub const TRIANGLE_TEX: &str = "triangle";
203pub const DIAMOND: &str = "diamond";
204pub const SQUARE: &str = "square";
205pub const L_FLOOR: &str = "|__";
206pub const L_FLOOR_TEX: &str = "lfloor";
207pub const R_FLOOR: &str = "__|";
208pub const R_FLOOR_TEX: &str = "rfloor";
209pub const L_CEILING: &str = "|~";
210pub const L_CEILING_TEX: &str = "lceiling";
211pub const R_CEILING: &str = "~|";
212pub const R_CEILING_TEX: &str = "rceiling";
213pub const LIM: &str = "lim";
214pub const CC: &str = "CC";
215pub const NN: &str = "NN";
216pub const QQ: &str = "QQ";
217pub const RR: &str = "RR";
218pub const ZZ: &str = "ZZ";
219
220pub const MISC: &[(&[&str], TokenType)] = &[
221 (&[INT], TokenType::Misc(Misc::Int)),
222 (&[O_INT], TokenType::Misc(Misc::OInt)),
223 (&[DEL, DEL_TEX], TokenType::Misc(Misc::Del)),
224 (&[GRAD, GRAD_TEX], TokenType::Misc(Misc::Grad)),
225 (&[PM, PM_TEX], TokenType::Misc(Misc::PlusMinus)),
226 (&[EMPTY_SET, EMPTY_SET_TEX], TokenType::Misc(Misc::EmptySet)),
227 (&[INFINITY, INFINITY_TEX], TokenType::Misc(Misc::Infinity)),
228 (&[ALEPH], TokenType::Misc(Misc::Aleph)),
229 (
230 &[THEREFORE, THEREFORE_TEX],
231 TokenType::Misc(Misc::Therefore),
232 ),
233 (&[BECAUSE, BECAUSE_TEX], TokenType::Misc(Misc::Because)),
234 (&[L_DOTS, L_DOTS_TEX], TokenType::Misc(Misc::LDots)),
235 (&[C_DOTS], TokenType::Misc(Misc::CDots)),
236 (&[V_DOTS], TokenType::Misc(Misc::VDots)),
237 (&[D_DOTS], TokenType::Misc(Misc::DDots)),
238 (&[DOUBLE_PIPES], TokenType::Misc(Misc::DoublePipes)),
239 (&[DOUBLE_PIPES_QUAD], TokenType::Misc(Misc::DoublePipesQuad)),
240 (&[ANGLE, ANGLE_TEX], TokenType::Misc(Misc::Angle)),
241 (&[FROWN], TokenType::Misc(Misc::Frown)),
242 (&[TRIANGLE, TRIANGLE_TEX], TokenType::Misc(Misc::Triangle)),
243 (&[DIAMOND], TokenType::Misc(Misc::Diamond)),
244 (&[SQUARE], TokenType::Misc(Misc::Square)),
245 (&[L_FLOOR, L_FLOOR_TEX], TokenType::Misc(Misc::LFloor)),
246 (&[R_FLOOR, R_FLOOR_TEX], TokenType::Misc(Misc::RFloor)),
247 (&[L_CEILING, L_CEILING_TEX], TokenType::Misc(Misc::LCeiling)),
248 (&[R_CEILING, R_CEILING_TEX], TokenType::Misc(Misc::RCeiling)),
249 (&[LIM], TokenType::Misc(Misc::Lim)),
250 (&[CC], TokenType::Misc(Misc::CC)),
251 (&[NN], TokenType::Misc(Misc::NN)),
252 (&[QQ], TokenType::Misc(Misc::QQ)),
253 (&[RR], TokenType::Misc(Misc::RR)),
254 (&[ZZ], TokenType::Misc(Misc::ZZ)),
255];
256
257#[derive(Debug, Clone, PartialOrd, PartialEq)]
258pub enum Relational {
259 Equals,
260 NotEquals,
261 Lt,
262 Gt,
263 Lte,
264 Gte,
265 Mlt,
266 Mgt,
267 Prec,
268 PrecEq,
269 Succ,
270 SuccEq,
271 In,
272 NotIn,
273 Sub,
274 Sup,
275 SubEq,
276 SupEq,
277 Equiv,
278 Cong,
279 Approx,
280 Prop,
281}
282
283pub const EQUALS: &str = "=";
284pub const NOT_EQUALS: &str = "!=";
285pub const NOT_EQUALS_TEX: &str = "ne";
286pub const LT: &str = "<";
287pub const LT_TEX: &str = "lt";
288pub const GT: &str = ">";
289pub const GT_TEX: &str = "gt";
290pub const LTE: &str = "<=";
291pub const LTE_TEX: &str = "le";
292pub const GTE: &str = ">=";
293pub const GTE_TEX: &str = "ge";
294pub const MLT: &str = "mlt";
295pub const MLT_TEX: &str = "ll";
296pub const MGT: &str = "mgt";
297pub const MGT_TEX: &str = "gg";
298pub const PREC: &str = "-<";
299pub const PREC_TEX: &str = "prec";
300pub const PREC_EQ: &str = "-<=";
301pub const PREC_EQ_TEX: &str = "preceq";
302pub const SUCC: &str = ">-";
303pub const SUCC_TEX: &str = "subb";
304pub const SUCC_EQ: &str = ">-=";
305pub const SUCC_EQ_TEX: &str = "succeq";
306pub const IN: &str = "in";
307pub const NOT_IN: &str = "!in";
308pub const NOT_IN_TEX: &str = "notin";
309pub const SUB: &str = "sub";
310pub const SUB_TEX: &str = "subset";
311pub const SUP: &str = "sup";
312pub const SUP_TEX: &str = "supset";
313pub const SUB_EQ: &str = "sube";
314pub const SUB_EQ_TEX: &str = "subseteq";
315pub const SUP_EQ: &str = "supe";
316pub const SUP_EQ_TEX: &str = "supseteq";
317pub const EQUIV: &str = "-=";
318pub const EQUIV_TEX: &str = "equiv";
319pub const CONG: &str = "~=";
320pub const CONG_TEX: &str = "cong";
321pub const APPROX: &str = "~~";
322pub const APPROX_TEX: &str = "approx";
323pub const PROP: &str = "prop";
324pub const PROP_TEX: &str = "propto";
325
326pub const RELATIONAL: &[(&[&str], TokenType)] = &[
327 (&[EQUALS], TokenType::Relational(Relational::Equals)),
328 (
329 &[NOT_EQUALS, NOT_EQUALS_TEX],
330 TokenType::Relational(Relational::NotEquals),
331 ),
332 (&[LT, LT_TEX], TokenType::Relational(Relational::Lt)),
333 (&[GT, GT_TEX], TokenType::Relational(Relational::Gt)),
334 (&[LTE, LTE_TEX], TokenType::Relational(Relational::Lte)),
335 (&[GTE, GTE_TEX], TokenType::Relational(Relational::Gte)),
336 (&[MLT, MLT_TEX], TokenType::Relational(Relational::Mlt)),
337 (&[MGT, MGT_TEX], TokenType::Relational(Relational::Mgt)),
338 (&[PREC, PREC_TEX], TokenType::Relational(Relational::Prec)),
339 (
340 &[PREC_EQ, PREC_EQ_TEX],
341 TokenType::Relational(Relational::PrecEq),
342 ),
343 (&[SUCC, SUCC_TEX], TokenType::Relational(Relational::Succ)),
344 (
345 &[SUCC_EQ, SUCC_EQ_TEX],
346 TokenType::Relational(Relational::SuccEq),
347 ),
348 (&[IN], TokenType::Relational(Relational::NotIn)),
349 (
350 &[NOT_IN, NOT_IN_TEX],
351 TokenType::Relational(Relational::NotIn),
352 ),
353 (&[SUB, SUB_TEX], TokenType::Relational(Relational::Sub)),
354 (&[SUP, SUP_TEX], TokenType::Relational(Relational::Sup)),
355 (
356 &[SUB_EQ, SUB_EQ_TEX],
357 TokenType::Relational(Relational::SubEq),
358 ),
359 (
360 &[SUP_EQ, SUP_EQ_TEX],
361 TokenType::Relational(Relational::SupEq),
362 ),
363 (
364 &[EQUIV, EQUIV_TEX],
365 TokenType::Relational(Relational::Equiv),
366 ),
367 (&[CONG, CONG_TEX], TokenType::Relational(Relational::Cong)),
368 (
369 &[APPROX, APPROX_TEX],
370 TokenType::Relational(Relational::Approx),
371 ),
372 (&[PROP, PROP_TEX], TokenType::Relational(Relational::Prop)),
373];
374
375#[derive(Debug, Clone, PartialOrd, PartialEq)]
376pub enum Arrow {
377 UpArrow,
378 DownArrow,
379 RightArrow,
380 ToArrow,
381 RightArrowTail,
382 RightArrowTwoHead,
383 RightArrowTwoHeadTail,
384 MapsTo,
385 LeftArrow,
386 LeftRightArrow,
387 DoubleRightArrow,
388 DoubleLeftArrow,
389 DoubleLeftRightArrow,
390}
391
392pub const UP_ARROW: &str = "uarr";
393pub const UP_ARROW_TEX: &str = "uparrow";
394pub const DOWN_ARROW: &str = "darr";
395pub const DOWN_ARROW_TEX: &str = "downarrow";
396pub const RIGHT_ARROW: &str = "rarr";
397pub const RIGHT_ARROW_TEX: &str = "rightarrow";
398pub const TO_ARROW: &str = "->";
399pub const TO_ARROW_TEX: &str = "to";
400pub const R_ARROW_TAIL: &str = ">->";
401pub const R_ARROW_TAIL_TEX: &str = "rightarrowtail";
402pub const R_ARROW_TWO_HEAD: &str = "->>";
403pub const R_ARROW_TWO_HEAD_TEX: &str = "twoheadrightarrow";
404pub const R_ARROW_TWO_HEAD_TAIL: &str = ">->>";
405pub const R_ARROW_TWO_HEAD_TAIL_TEX: &str = "twoheadrightarrowtail";
406pub const MAPS_TO: &str = "|->";
407pub const MAPS_TO_TEX: &str = "mapsto";
408pub const LEFT_ARROW: &str = "larr";
409pub const LEFT_ARROW_TEX: &str = "leftarrow";
410pub const LEFT_RIGHT_ARROW: &str = "harr";
411pub const LEFT_RIGHT_ARROW_TEX: &str = "leftrightarrow";
412pub const DOUBLE_RIGHT_ARROW: &str = "rArr";
413pub const DOUBLE_RIGHT_ARROW_TEX: &str = "Rightarrow";
414pub const DOUBLE_LEFT_ARROW: &str = "lArr";
415pub const DOUBLE_LEFT_ARROW_TEX: &str = "Leftarrow";
416pub const DOUBLE_LEFT_RIGHT_ARROW: &str = "hArr";
417pub const DOUBLE_LEFT_RIGHT_ARROW_TEX: &str = "Leftrightarrow";
418
419pub const ARROWS: &[(&[&str], TokenType)] = &[
420 (&[UP_ARROW, UP_ARROW_TEX], TokenType::Arrow(Arrow::UpArrow)),
421 (
422 &[DOWN_ARROW, DOWN_ARROW_TEX],
423 TokenType::Arrow(Arrow::DownArrow),
424 ),
425 (
426 &[RIGHT_ARROW, RIGHT_ARROW_TEX],
427 TokenType::Arrow(Arrow::RightArrow),
428 ),
429 (&[TO_ARROW, TO_ARROW_TEX], TokenType::Arrow(Arrow::ToArrow)),
430 (
431 &[R_ARROW_TAIL, R_ARROW_TAIL_TEX],
432 TokenType::Arrow(Arrow::RightArrowTail),
433 ),
434 (
435 &[R_ARROW_TWO_HEAD, R_ARROW_TWO_HEAD_TEX],
436 TokenType::Arrow(Arrow::RightArrowTwoHead),
437 ),
438 (
439 &[R_ARROW_TWO_HEAD_TAIL, R_ARROW_TWO_HEAD_TAIL_TEX],
440 TokenType::Arrow(Arrow::RightArrowTwoHeadTail),
441 ),
442 (&[MAPS_TO, MAPS_TO_TEX], TokenType::Arrow(Arrow::MapsTo)),
443 (
444 &[LEFT_ARROW, LEFT_ARROW_TEX],
445 TokenType::Arrow(Arrow::LeftArrow),
446 ),
447 (
448 &[LEFT_RIGHT_ARROW, LEFT_RIGHT_ARROW_TEX],
449 TokenType::Arrow(Arrow::LeftRightArrow),
450 ),
451 (
452 &[DOUBLE_RIGHT_ARROW, DOUBLE_RIGHT_ARROW_TEX],
453 TokenType::Arrow(Arrow::DoubleRightArrow),
454 ),
455 (
456 &[DOUBLE_LEFT_ARROW, DOUBLE_LEFT_ARROW_TEX],
457 TokenType::Arrow(Arrow::DoubleLeftArrow),
458 ),
459 (
460 &[DOUBLE_LEFT_RIGHT_ARROW, DOUBLE_LEFT_RIGHT_ARROW_TEX],
461 TokenType::Arrow(Arrow::DoubleLeftRightArrow),
462 ),
463];
464
465#[derive(Debug, Clone, PartialOrd, PartialEq)]
466pub enum Logical {
467 And,
468 Or,
469 Not,
470 Implies,
471 If,
472 Iff,
473 ForAll,
474 Exists,
475 Bot,
476 Top,
477 VDash,
478 Models,
479}
480
481pub const AND: &str = "and";
482pub const OR: &str = "or";
483pub const NOT: &str = "not";
484pub const NOT_TEX: &str = "neq";
485pub const IMPLIES: &str = "=>";
486pub const IMPLIES_TEX: &str = "implies";
487pub const IF: &str = "if";
488pub const IFF: &str = "<=>";
489pub const IFF_TEX: &str = "iff";
490pub const FOR_ALL: &str = "AA";
491pub const FOR_ALL_TEX: &str = "forall";
492pub const EXISTS: &str = "EE";
493pub const EXISTS_TEX: &str = "exists";
494pub const BOT: &str = "_|_";
495pub const BOT_TEX: &str = "bot";
496pub const TOP: &str = "TT";
497pub const TOP_TEX: &str = "top";
498pub const V_DASH: &str = "|--";
499pub const V_DASH_TEX: &str = "vdash";
500pub const MODELS: &str = "|==";
501pub const MODELS_TEX: &str = "models";
502
503pub const LOGICAL: &[(&[&str], TokenType)] = &[
504 (&[AND], TokenType::Logical(Logical::And)),
505 (&[OR], TokenType::Logical(Logical::Or)),
506 (&[NOT, NOT_TEX], TokenType::Logical(Logical::Not)),
507 (
508 &[IMPLIES, IMPLIES_TEX],
509 TokenType::Logical(Logical::Implies),
510 ),
511 (&[IF], TokenType::Logical(Logical::If)),
512 (&[IFF, IFF_TEX], TokenType::Logical(Logical::Iff)),
513 (&[FOR_ALL, FOR_ALL_TEX], TokenType::Logical(Logical::ForAll)),
514 (&[EXISTS, EXISTS_TEX], TokenType::Logical(Logical::Exists)),
515 (&[BOT, BOT_TEX], TokenType::Logical(Logical::Bot)),
516 (&[TOP, TOP_TEX], TokenType::Logical(Logical::Top)),
517 (&[V_DASH, V_DASH_TEX], TokenType::Logical(Logical::VDash)),
518 (&[MODELS, MODELS_TEX], TokenType::Logical(Logical::Models)),
519];
520
521#[derive(Debug, Clone, PartialOrd, PartialEq)]
522pub enum Operation {
523 Plus,
524 Minus,
525 CDot,
526 Ast,
527 Star,
528 Slash,
529 Backslash,
530 Times,
531 Div,
532 LTimes,
533 RTimes,
534 Bowtie,
535 Circ,
536 OPlus,
537 OTimes,
538 ODot,
539 Sum,
540 Prod,
541 Wedge,
542 BigWedge,
543 Vee,
544 BigVee,
545 Cap,
546 BigCap,
547 Cup,
548 BigCup,
549}
550
551pub const PLUS: &str = "+";
552pub const MINUS: &str = "-";
553pub const C_DOT: &str = "*";
554pub const C_DOT_TEX: &str = "cdot";
555pub const AST: &str = "**";
556pub const AST_TEX: &str = "ast";
557pub const STAR: &str = "***";
558pub const STAR_TEX: &str = "star";
559pub const SLASH: &str = "//";
560pub const BACKSLASH: &str = "\\\\";
561pub const BACKSLASH_TEX_1: &str = "backslash";
562pub const BACKSLASH_TEX_2: &str = "setminus";
563pub const TIMES: &str = "xx";
564pub const TIMES_TEX: &str = "times";
565pub const DIV: &str = "-:";
566pub const DIV_TEX: &str = "div";
567pub const L_TIMES: &str = "|><";
568pub const L_TIMES_TEX: &str = "ltimes";
569pub const R_TIMES: &str = "><|";
570pub const R_TIMES_TEX: &str = "rtimes";
571pub const BOWTIE: &str = "|><|";
572pub const BOWTIE_TEX: &str = "bowtie";
573pub const CIRC: &str = "@";
574pub const CIRC_TEX: &str = "circ";
575pub const O_PLUS: &str = "o+";
576pub const O_PLUS_TEX: &str = "oplus";
577pub const O_TIMES: &str = "ox";
578pub const O_TIMES_TEX: &str = "otimes";
579pub const O_DOT: &str = "o.";
580pub const O_DOT_TEX: &str = "odot";
581pub const SUM: &str = "sum";
582pub const PROD: &str = "prod";
583pub const WEDGE: &str = "^^";
584pub const WEDGE_TEX: &str = "wedge";
585pub const BIG_WEDGE: &str = "^^^";
586pub const BIG_WEDGE_TEX: &str = "bigwedge";
587pub const VEE: &str = "vv";
588pub const VEE_TEX: &str = "vee";
589pub const BIG_VEE: &str = "vvv";
590pub const BIG_VEE_TEX: &str = "bigvee";
591pub const CAP: &str = "nn";
592pub const CAP_TEX: &str = "cap";
593pub const BIG_CAP: &str = "nnn";
594pub const BIG_CAP_TEX: &str = "bigcap";
595pub const CUP: &str = "uu";
596pub const CUP_TEX: &str = "cup";
597pub const BIG_CUP: &str = "uuu";
598pub const BIG_CUP_TEX: &str = "bigcup";
599
600pub const OPERATION: &[(&[&str], TokenType)] = &[
601 (&[C_DOT, C_DOT_TEX], TokenType::Operation(Operation::CDot)),
602 (&[AST, AST_TEX], TokenType::Operation(Operation::Ast)),
603 (&[STAR, STAR_TEX], TokenType::Operation(Operation::Star)),
604 (&[SLASH], TokenType::Operation(Operation::Slash)),
605 (
606 &[BACKSLASH, BACKSLASH_TEX_1, BACKSLASH_TEX_2],
607 TokenType::Operation(Operation::Backslash),
608 ),
609 (&[TIMES, TIMES_TEX], TokenType::Operation(Operation::Times)),
610 (&[DIV, DIV_TEX], TokenType::Operation(Operation::Div)),
611 (
612 &[L_TIMES, L_TIMES_TEX],
613 TokenType::Operation(Operation::LTimes),
614 ),
615 (
616 &[R_TIMES, R_TIMES_TEX],
617 TokenType::Operation(Operation::RTimes),
618 ),
619 (
620 &[BOWTIE, BOWTIE_TEX],
621 TokenType::Operation(Operation::Bowtie),
622 ),
623 (&[CIRC, CIRC_TEX], TokenType::Operation(Operation::Circ)),
624 (
625 &[O_PLUS, O_PLUS_TEX],
626 TokenType::Operation(Operation::OPlus),
627 ),
628 (
629 &[O_TIMES, O_TIMES_TEX],
630 TokenType::Operation(Operation::Times),
631 ),
632 (&[O_DOT], TokenType::Operation(Operation::ODot)),
633 (&[SUM], TokenType::Operation(Operation::Sum)),
634 (&[PROD], TokenType::Operation(Operation::Prod)),
635 (
636 &[BIG_WEDGE, BIG_WEDGE_TEX],
637 TokenType::Operation(Operation::BigWedge),
638 ),
639 (&[WEDGE, WEDGE_TEX], TokenType::Operation(Operation::Wedge)),
640 (&[VEE, VEE_TEX], TokenType::Operation(Operation::Vee)),
641 (
642 &[BIG_CAP, BIG_CAP_TEX],
643 TokenType::Operation(Operation::BigCap),
644 ),
645 (&[CAP, CAP_TEX], TokenType::Operation(Operation::Cap)),
646 (
647 &[BIG_CUP, BIG_CUP_TEX],
648 TokenType::Operation(Operation::BigCup),
649 ),
650 (&[CUP, CUP_TEX], TokenType::Operation(Operation::Cup)),
651 (&[PLUS], TokenType::Operation(Operation::Plus)),
652 (&[MINUS], TokenType::Operation(Operation::Minus)),
653];
654
655pub const L_PAREN: &str = "(";
658pub const L_BRACKET: &str = "[";
659pub const L_BRACE: &str = "{";
660pub const L_COLON_BRACE: &str = "{:";
661pub const L_ANGLE: &str = "<<";
662
663pub const L_ANGLE_TEX: &str = "langle";
664
665#[derive(Debug, Clone, PartialOrd, PartialEq)]
666pub enum LBrace {
667 LParen,
668 LBracket,
669 LBrace,
670 LColonBrace,
671 LAngle,
672}
673
674pub const LBRACES: &[(&[&str], TokenType)] = &[
675 (&[L_COLON_BRACE], TokenType::LBrace(LBrace::LColonBrace)),
676 (&[L_PAREN], TokenType::LBrace(LBrace::LParen)),
677 (&[L_BRACKET], TokenType::LBrace(LBrace::LBracket)),
678 (&[L_BRACE], TokenType::LBrace(LBrace::LBrace)),
679 (&[L_ANGLE, L_ANGLE_TEX], TokenType::LBrace(LBrace::LAngle)),
680];
681
682pub const R_PAREN: &str = ")";
683pub const R_BRACKET: &str = "]";
684pub const R_BRACE: &str = "}";
685pub const R_COLON_BRACE: &str = ":}";
686pub const R_ANGLE: &str = ">>";
687pub const R_ANGLE_TEX: &str = "rangle";
688
689#[derive(Debug, Clone, PartialOrd, PartialEq)]
690pub enum RBrace {
691 RParen,
692 RBracket,
693 RBrace,
694 RColonBrace,
695 RAngle,
696}
697
698pub const RBRACES: &[(&[&str], TokenType)] = &[
699 (&[R_COLON_BRACE], TokenType::RBrace(RBrace::RColonBrace)),
700 (&[R_PAREN], TokenType::RBrace(RBrace::RParen)),
701 (&[R_BRACKET], TokenType::RBrace(RBrace::RBracket)),
702 (&[R_BRACE], TokenType::RBrace(RBrace::RBrace)),
703 (&[R_ANGLE, R_ANGLE_TEX], TokenType::RBrace(RBrace::RAngle)),
704];
705
706pub const HAT: &str = "hat";
709pub const BAR: &str = "bar";
710pub const BAR_TEX: &str = "overline";
711pub const UL: &str = "ul";
712pub const UL_TEX: &str = "underline";
713pub const VEC: &str = "vec";
714pub const TILDE: &str = "tilde";
715pub const DOT: &str = "dot";
716pub const D_DOT: &str = "ddot";
717pub const U_BRACE: &str = "ubrace";
718pub const U_BRACE_TEX: &str = "underbrace";
719pub const O_BRACE: &str = "obrace";
720pub const O_BRACE_TEX: &str = "overbrace";
721pub const CANCEL: &str = "cancel";
722
723pub const SQRT: &str = "sqrt";
724pub const TEXT: &str = "text";
725pub const ABS: &str = "abs";
726pub const FLOOR: &str = "floor";
727pub const CEIL: &str = "ceil";
728pub const NORM: &str = "norm";
729
730pub const UNARY_OPERATORS: &[(&[&str], TokenType)] = &[
731 (&[HAT], TokenType::UnaryOperator(UnaryOperator::Hat)),
732 (
733 &[BAR, BAR_TEX],
734 TokenType::UnaryOperator(UnaryOperator::Bar),
735 ),
736 (&[UL, UL_TEX], TokenType::UnaryOperator(UnaryOperator::Ul)),
737 (&[VEC], TokenType::UnaryOperator(UnaryOperator::Vec)),
738 (&[TILDE], TokenType::UnaryOperator(UnaryOperator::Tilde)),
739 (&[DOT], TokenType::UnaryOperator(UnaryOperator::Dot)),
740 (&[D_DOT], TokenType::UnaryOperator(UnaryOperator::DDot)),
741 (
742 &[U_BRACE, U_BRACE_TEX],
743 TokenType::UnaryOperator(UnaryOperator::UBrace),
744 ),
745 (
746 &[O_BRACE, O_BRACE_TEX],
747 TokenType::UnaryOperator(UnaryOperator::OBrace),
748 ),
749 (&[CANCEL], TokenType::UnaryOperator(UnaryOperator::Cancel)),
750 (&[SQRT], TokenType::UnaryOperator(UnaryOperator::Sqrt)),
751 (&[TEXT], TokenType::UnaryOperator(UnaryOperator::Text)),
752 (&[ABS], TokenType::UnaryOperator(UnaryOperator::Abs)),
753 (&[FLOOR], TokenType::UnaryOperator(UnaryOperator::Floor)),
754 (&[CEIL], TokenType::UnaryOperator(UnaryOperator::Ceil)),
755 (&[NORM], TokenType::UnaryOperator(UnaryOperator::Norm)),
756];
757
758#[derive(Debug, Clone, PartialOrd, PartialEq)]
759pub enum UnaryOperator {
760 Hat,
761 Bar,
762 Ul,
763 Vec,
764 Tilde,
765 Dot,
766 DDot,
767 UBrace,
768 OBrace,
769 Cancel,
770 Sqrt,
771 Text,
772 Abs,
773 Floor,
774 Ceil,
775 Norm,
776}
777
778pub const ROOT: &str = "root";
781pub const OVERSET: &str = "overset";
782pub const UNDERSET: &str = "underset";
783pub const COLOR: &str = "color";
784
785#[derive(Debug, Clone, PartialOrd, PartialEq)]
786pub enum BinaryOperator {
787 Root,
788 Overset,
789 Underset,
790 Color,
791}
792
793pub const BINARY_OPERATORS: &[(&[&str], TokenType)] = &[
794 (&[ROOT], TokenType::BinaryOperator(BinaryOperator::Root)),
795 (
796 &[OVERSET],
797 TokenType::BinaryOperator(BinaryOperator::Overset),
798 ),
799 (
800 &[UNDERSET],
801 TokenType::BinaryOperator(BinaryOperator::Underset),
802 ),
803 (&[COLOR], TokenType::BinaryOperator(BinaryOperator::Color)),
804];
805
806#[derive(Debug, Clone, PartialOrd, PartialEq)]
807pub enum Function {
808 Sin,
809 Cos,
810 Tan,
811 Sec,
812 Csc,
813 Cot,
814 Arcsin,
815 Arccos,
816 Arctan,
817 Sinh,
818 Cosh,
819 Tanh,
820 Sech,
821 Csch,
822 Coth,
823 Exp,
824 Log,
825 Ln,
826 Det,
827 Dim,
828 Mod,
829 Gcd,
830 Lcm,
831 Lub,
832 Glb,
833 Min,
834 Max,
835 F,
836 G,
837}
838
839pub const F_SIN: &str = "sin";
840pub const F_COS: &str = "cos";
841pub const F_TAN: &str = "tan";
842pub const F_SEC: &str = "sec";
843pub const F_CSC: &str = "csc";
844pub const F_COT: &str = "cot";
845pub const F_ARCSIN: &str = "arcsin";
846pub const F_ARCCOS: &str = "arccos";
847pub const F_ARCTAN: &str = "arctan";
848pub const F_SINH: &str = "sinh";
849pub const F_COSH: &str = "cosh";
850pub const F_TANH: &str = "tanh";
851pub const F_SECH: &str = "sech";
852pub const F_CSCH: &str = "csch";
853pub const F_COTH: &str = "coth";
854pub const F_EXP: &str = "exp";
855pub const F_LOG: &str = "log";
856pub const F_LN: &str = "ln";
857pub const F_DET: &str = "det";
858pub const F_DIM: &str = "dim";
859pub const F_MOD: &str = "mod";
860pub const F_GCD: &str = "gcd";
861pub const F_LCM: &str = "lcm";
862pub const F_LUB: &str = "lub";
863pub const F_GLB: &str = "glb";
864pub const F_MIN: &str = "min";
865pub const F_MAX: &str = "max";
866pub const F_F: &str = "f";
867pub const F_G: &str = "g";
868
869pub const FUNCTION: &[(&[&str], TokenType)] = &[
870 (&[F_SIN], TokenType::Function(Function::Sin)),
871 (&[F_COS], TokenType::Function(Function::Cos)),
872 (&[F_TAN], TokenType::Function(Function::Tan)),
873 (&[F_SEC], TokenType::Function(Function::Sec)),
874 (&[F_CSC], TokenType::Function(Function::Csc)),
875 (&[F_COT], TokenType::Function(Function::Cot)),
876 (&[F_ARCSIN], TokenType::Function(Function::Arcsin)),
877 (&[F_ARCCOS], TokenType::Function(Function::Arccos)),
878 (&[F_ARCTAN], TokenType::Function(Function::Arctan)),
879 (&[F_SINH], TokenType::Function(Function::Sinh)),
880 (&[F_COSH], TokenType::Function(Function::Cosh)),
881 (&[F_TANH], TokenType::Function(Function::Tanh)),
882 (&[F_SECH], TokenType::Function(Function::Sech)),
883 (&[F_CSCH], TokenType::Function(Function::Csch)),
884 (&[F_COTH], TokenType::Function(Function::Coth)),
885 (&[F_EXP], TokenType::Function(Function::Exp)),
886 (&[F_LOG], TokenType::Function(Function::Log)),
887 (&[F_LN], TokenType::Function(Function::Ln)),
888 (&[F_DET], TokenType::Function(Function::Det)),
889 (&[F_DIM], TokenType::Function(Function::Dim)),
890 (&[F_MOD], TokenType::Function(Function::Mod)),
891 (&[F_GCD], TokenType::Function(Function::Gcd)),
892 (&[F_LCM], TokenType::Function(Function::Lcm)),
893 (&[F_LUB], TokenType::Function(Function::Lub)),
894 (&[F_GLB], TokenType::Function(Function::Glb)),
895 (&[F_MIN], TokenType::Function(Function::Min)),
896 (&[F_MAX], TokenType::Function(Function::Max)),
897 (&[F_F], TokenType::Function(Function::F)),
898 (&[F_G], TokenType::Function(Function::G)),
899];