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