lptree.h (1976B)
1 /* 2 ** $Id: lptree.h,v 1.3 2016/09/13 18:07:51 roberto Exp $ 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