| 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 | |
| 83 | |