polymath_rs/tokens/
types.rs

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
655// Braces
656
657pub 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
706// Unary operators
707
708pub 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
778// Binary operators
779
780pub 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];