1 /*
2 ** $Id: lptree.h $
3 */
4 
5 #if !defined(lptree_h)
6 #define lptree_h
7 
8 
9 #include "lptypes.h"
10 
11 
12 /*
13 ** types of trees
14 */
15 typedef enum TTag {
16   TChar = 0,  /* 'n' = char */
17   TSet,  /* the set is stored in next CHARSETSIZE bytes */
18   TAny,
19   TTrue,
20   TFalse,
21   TRep,  /* 'sib1'* */
22   TSeq,  /* 'sib1' 'sib2' */
23   TChoice,  /* 'sib1' / 'sib2' */
24   TNot,  /* !'sib1' */
25   TAnd,  /* &'sib1' */
26   TCall,  /* ktable[key] is rule's key; 'sib2' is rule being called */
27   TOpenCall,  /* ktable[key] is rule's key */
28   TRule,  /* ktable[key] is rule's key (but key == 0 for unused rules);
29              'sib1' is rule's pattern;
30              'sib2' is next rule; 'cap' is rule's sequential number */
31   TGrammar,  /* 'sib1' is initial (and first) rule */
32   TBehind,  /* 'sib1' is pattern, 'n' is how much to go back */
33   TCapture,  /* captures: 'cap' is kind of capture (enum 'CapKind');
34                 ktable[key] is Lua value associated with capture;
35                 'sib1' is capture body */
36   TRunTime  /* run-time capture: 'key' is Lua function;
37                'sib1' is capture body */
38 } TTag;
39 
40 
41 /*
42 ** Tree trees
43 ** The first child of a tree (if there is one) is immediately after
44 ** the tree.  A reference to a second child (ps) is its position
45 ** relative to the position of the tree itself.
46 */
47 typedef struct TTree {
48   byte tag;
49   byte cap;  /* kind of capture (if it is a capture) */
50   unsigned short key;  /* key in ktable for Lua data (0 if no key) */
51   union {
52     int ps;  /* occasional second child */
53     int n;  /* occasional counter */
54   } u;
55 } TTree;
56 
57 
58 /*
59 ** A complete pattern has its tree plus, if already compiled,
60 ** its corresponding code
61 */
62 typedef struct Pattern {
63   union Instruction *code;
64   int codesize;
65   TTree tree[1];
66 } Pattern;
67 
68 
69 /* number of children for each tree */
70 extern const byte numsiblings[];
71 
72 /* access to children */
73 #define sib1(t)         ((t) + 1)
74 #define sib2(t)         ((t) + (t)->u.ps)
75 
76 
77 
78 
79 
80 
81 #endif
82 
83