mudgangster

Tiny, scriptable MUD client
Log | Files | Refs | README

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