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