Mercurial > pasana
comparison node.h @ 2:ff5e493bc9cb default tip
2003-01-29
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sat, 13 Oct 2012 21:14:50 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:1361f218a6e5 | 2:ff5e493bc9cb |
|---|---|
| 1 /* Wezły drzewa parsowania. */ | |
| 2 /* Konstruktory są w plikach node_new.* */ | |
| 3 | |
| 4 #ifndef NODE_H | |
| 5 #define NODE_H | |
| 6 | |
| 7 #include <glib.h> | |
| 8 #include "symbols.h" | |
| 9 | |
| 10 /* Zeby oszczedzic sobie pisania. */ | |
| 11 typedef struct StmtNode StmtNode; | |
| 12 typedef struct SymbolNode SymbolNode; | |
| 13 typedef struct ExprNode ExprNode; | |
| 14 | |
| 15 enum NodeKind { | |
| 16 /* Rodzaje symboli. */ | |
| 17 NODE_NONE, | |
| 18 SYM_TYPE_POINTER, | |
| 19 SYM_TYPE_STRING, | |
| 20 SYM_TYPE_ARRAY, | |
| 21 SYM_TYPE_SET, | |
| 22 SYM_TYPE_SUBRANGE, | |
| 23 SYM_TYPE_ENUM, | |
| 24 SYM_TYPE_RECORD, | |
| 25 SYM_TYPE_FILE, | |
| 26 SYM_TYPE_MAXIMUM, | |
| 27 SYM_VAR_LOCAL, | |
| 28 SYM_VAR_PARAM, | |
| 29 SYM_VAR_VARPARAM, | |
| 30 SYM_VAR_FIELD, | |
| 31 SYM_VAR_DEARR, | |
| 32 SYM_VAR_DEREF, | |
| 33 SYM_VAR_CAST, | |
| 34 SYM_VAR_MAXIMUM, | |
| 35 SYM_LABEL, | |
| 36 SYM_PROC, | |
| 37 SYM_FUNC, | |
| 38 SYM_CONST, | |
| 39 SYM_UNIT, | |
| 40 SYM_PROG, | |
| 41 SYM_TAG_FIELD, /* pole wariantowe w zmiennej rekordowej. */ | |
| 42 SYM_MAXIMUM, | |
| 43 /* Rodzaje rozkazów */ | |
| 44 STMT_BLOCK, | |
| 45 STMT_IF, | |
| 46 STMT_WHILE, | |
| 47 STMT_REPEAT, | |
| 48 STMT_FOR, | |
| 49 STMT_FOR_DOWN, | |
| 50 STMT_WITH, | |
| 51 STMT_PROC, | |
| 52 STMT_ASSIGN, | |
| 53 STMT_GOTO, | |
| 54 STMT_CASE_HEAD, | |
| 55 STMT_CASE_CASE, | |
| 56 STMT_MAXIMUM, | |
| 57 /* Rodzaje wyrażeń */ | |
| 58 EXPR_VAR, /* wywołanie zmiennej */ | |
| 59 EXPR_CONST, /* wywołanie stałej */ | |
| 60 EXPR_PAREN, /* nawiasy */ | |
| 61 EXPR_FUNC, /* wywolanie funkcji */ | |
| 62 EXPR_STRING, /* stała tekstowa */ | |
| 63 EXPR_NUMBER, /* stała liczbowa */ | |
| 64 EXPR_UN, /* operator unarny */ | |
| 65 EXPR_BIN, /* operator binarny -- działanie*/ | |
| 66 EXPR_EQ, /* operator binarny -- porównanie*/ | |
| 67 EXPR_NIL, /* Stała NIL */ | |
| 68 EXPR_ADDR, /* Adres zmiennej @zmienna lub expr:expr*/ | |
| 69 EXPR_RANGE, /* Zakres z operatorem `..' */ | |
| 70 EXPR_ARRAY, | |
| 71 EXPR_RECORD, | |
| 72 EXPR_CASES, /* Lista przypadków */ | |
| 73 EXPR_VARIANT, /* Record variant */ | |
| 74 EXPR_SET, | |
| 75 EXPR_MAXIMUM, | |
| 76 NODE_MAXIMUM | |
| 77 }; | |
| 78 | |
| 79 /* Rodzaje operatorów. */ | |
| 80 enum OperKind { | |
| 81 OPER_NONE, | |
| 82 OPER_PLUS, | |
| 83 OPER_MINUS, | |
| 84 OPER_STAR, | |
| 85 OPER_SLASH, | |
| 86 OPER_DIV, | |
| 87 OPER_MOD, | |
| 88 OPER_SHL, | |
| 89 OPER_SHR, | |
| 90 OPER_EQ, | |
| 91 OPER_NEQ, | |
| 92 OPER_GT, | |
| 93 OPER_LT, | |
| 94 OPER_GEQ, | |
| 95 OPER_LEQ, | |
| 96 OPER_IN, | |
| 97 OPER_XOR, | |
| 98 OPER_OR, | |
| 99 OPER_AND, | |
| 100 OPER_NOT | |
| 101 }; | |
| 102 | |
| 103 /* Dowolny węzeł. */ | |
| 104 union AnyNode { | |
| 105 SymbolNode *symbol; | |
| 106 StmtNode *stmt; | |
| 107 ExprNode *expr; | |
| 108 }; | |
| 109 typedef union AnyNode AnyNode; | |
| 110 | |
| 111 /* Wyrażenie. */ | |
| 112 struct ExprNode { | |
| 113 /* Rodzaj wyrażenia. */ | |
| 114 enum NodeKind kind; | |
| 115 | |
| 116 /* Dla operatorów -- pierwszy parametr; | |
| 117 * Dla zakresów -- początek zakresu; | |
| 118 * Dla adresu -- segment pamięci; | |
| 119 */ | |
| 120 struct ExprNode *expr; | |
| 121 /* Dla operatorów binarnych -- drugi parametr; | |
| 122 * Dla zakresów -- koniec zakresu; | |
| 123 * Dla adresu -- offset pamięci; | |
| 124 */ | |
| 125 struct ExprNode *expr2; | |
| 126 /* Dla operatorów -- rodzaj operatora. */ | |
| 127 enum OperKind oper; | |
| 128 /* Dla wywołania zmiennej, funkcji lub stałej -- dany symbol; | |
| 129 * Dla adresu -- obiekt o tym samym adresie; | |
| 130 */ | |
| 131 SymbolNode *symbol; | |
| 132 /* Dla wywołania procedury -- lista parametrów; | |
| 133 * Dla stałej zbiorowej -- lista wyrażeń elementów; | |
| 134 * Dla stałej tablicowej -- jw.; | |
| 135 * Dla stałej rekordowej -- lista wyrażeń pÓl; | |
| 136 */ | |
| 137 GList *list; | |
| 138 /* Dla stałych -- ich wartość. | |
| 139 * Dla pola rekordu -- jego nazwa. | |
| 140 */ | |
| 141 GString *value; | |
| 142 | |
| 143 /* Komentarze. */ | |
| 144 GString *bcomm; | |
| 145 GString *ccomm; | |
| 146 }; | |
| 147 | |
| 148 /* Symbol. */ | |
| 149 struct SymbolNode { | |
| 150 /* Rodzaj symbolu. */ | |
| 151 enum NodeKind kind; | |
| 152 /* Numer zwracany przez tokenizer. */ | |
| 153 int token; | |
| 154 /* Oryginalna nazwa symbolu (z zachowaniem wielkości liter). */ | |
| 155 GString *name; | |
| 156 | |
| 157 /* Dla programu, procedur i funckji -- tablica symboli zdefiniowanych wewnątrz; | |
| 158 * Dla typu rekordowego -- tablica pól rekordu; | |
| 159 */ | |
| 160 Namespace *symbols; | |
| 161 /* Dla programu, procedury i funkcji -- ciało (polecenie blokowe); | |
| 162 * Dla etykiety -- polecenie, którego dotyczy; | |
| 163 */ | |
| 164 StmtNode *stmt; | |
| 165 /* Dla zmiennych, stałych i funkcji -- typ; | |
| 166 * Dla typów -- typ bazowy; | |
| 167 * Dla rzutowania -- nowy typ; | |
| 168 * Dla rekordów -- typ wyróżnikowy wariantów; | |
| 169 */ | |
| 170 SymbolNode *type; | |
| 171 /* Dla programu -- lista nazw parametrów; | |
| 172 * Dla procedury i funkcji -- parametry formalne; | |
| 173 * Dla typu wyliczeniowego -- stałe zdefiniowane jako jego wartości; | |
| 174 * Dla typu rekordowego -- pola wariantowe w postaci instrukcji case; | |
| 175 * Dla typu tablicowego -- lista typów indeksów; | |
| 176 * Dla elementu tablicy -- lista wyrażeń indeksów; | |
| 177 * Dla pól rekordu -- lista etykiet wyboru; | |
| 178 */ | |
| 179 GList *list; | |
| 180 /* Dla dereferencji wskaźnika -- zmienna wskazywana; | |
| 181 * Dla rzutowania -- zmienna rzutowana; | |
| 182 * Dla elementu tablicy -- zmienna tablicowa; | |
| 183 * Dla rekordów -- pole wyróżnikowe; | |
| 184 */ | |
| 185 SymbolNode *base; | |
| 186 /* Dla stałych -- ich wartość; | |
| 187 * Dla łańcuchów -- wielkość łańcucha; | |
| 188 * Dla typów okrojonych -- ich zakres; | |
| 189 */ | |
| 190 ExprNode *expr; | |
| 191 /* Symbol do którego należy tablica symboli w której jest nasz symbol; | |
| 192 * Dla programu równa NULL; | |
| 193 */ | |
| 194 SymbolNode *parent; | |
| 195 | |
| 196 /* Komentarze. */ | |
| 197 GString *bcomm; | |
| 198 GString *ccomm; | |
| 199 }; | |
| 200 | |
| 201 /* Rozkaz. */ | |
| 202 struct StmtNode { | |
| 203 enum NodeKind kind; /* Rodzaj rozkazu. */ | |
| 204 GList *list; /* Lista polecen dla bloku lub lista parametrow dla proc i with i | |
| 205 * goto. */ | |
| 206 struct StmtNode *stmt, *stmt2; /* Polecenia wewnętrzne (stmt2 dla else) */ | |
| 207 SymbolNode *symbol; /* Na jakim symbolu operuje (przypisanie, procedura) */ | |
| 208 SymbolNode *label; /* Etykieta tego rozkazu. */ | |
| 209 ExprNode *expr; /* Wyrażenie dla if, until, while, for */ | |
| 210 ExprNode *expr2; /* drugie wyrażenie dla for */ | |
| 211 StmtNode *parent; | |
| 212 | |
| 213 /* Komentarze. */ | |
| 214 GString *bcomm; | |
| 215 GString *ccomm; | |
| 216 }; | |
| 217 | |
| 218 #endif /* not NODE_H */ |
