Mercurial > pasana
view 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 |
line wrap: on
line source
/* Wezły drzewa parsowania. */ /* Konstruktory są w plikach node_new.* */ #ifndef NODE_H #define NODE_H #include <glib.h> #include "symbols.h" /* Zeby oszczedzic sobie pisania. */ typedef struct StmtNode StmtNode; typedef struct SymbolNode SymbolNode; typedef struct ExprNode ExprNode; enum NodeKind { /* Rodzaje symboli. */ NODE_NONE, SYM_TYPE_POINTER, SYM_TYPE_STRING, SYM_TYPE_ARRAY, SYM_TYPE_SET, SYM_TYPE_SUBRANGE, SYM_TYPE_ENUM, SYM_TYPE_RECORD, SYM_TYPE_FILE, SYM_TYPE_MAXIMUM, SYM_VAR_LOCAL, SYM_VAR_PARAM, SYM_VAR_VARPARAM, SYM_VAR_FIELD, SYM_VAR_DEARR, SYM_VAR_DEREF, SYM_VAR_CAST, SYM_VAR_MAXIMUM, SYM_LABEL, SYM_PROC, SYM_FUNC, SYM_CONST, SYM_UNIT, SYM_PROG, SYM_TAG_FIELD, /* pole wariantowe w zmiennej rekordowej. */ SYM_MAXIMUM, /* Rodzaje rozkazów */ STMT_BLOCK, STMT_IF, STMT_WHILE, STMT_REPEAT, STMT_FOR, STMT_FOR_DOWN, STMT_WITH, STMT_PROC, STMT_ASSIGN, STMT_GOTO, STMT_CASE_HEAD, STMT_CASE_CASE, STMT_MAXIMUM, /* Rodzaje wyrażeń */ EXPR_VAR, /* wywołanie zmiennej */ EXPR_CONST, /* wywołanie stałej */ EXPR_PAREN, /* nawiasy */ EXPR_FUNC, /* wywolanie funkcji */ EXPR_STRING, /* stała tekstowa */ EXPR_NUMBER, /* stała liczbowa */ EXPR_UN, /* operator unarny */ EXPR_BIN, /* operator binarny -- działanie*/ EXPR_EQ, /* operator binarny -- porównanie*/ EXPR_NIL, /* Stała NIL */ EXPR_ADDR, /* Adres zmiennej @zmienna lub expr:expr*/ EXPR_RANGE, /* Zakres z operatorem `..' */ EXPR_ARRAY, EXPR_RECORD, EXPR_CASES, /* Lista przypadków */ EXPR_VARIANT, /* Record variant */ EXPR_SET, EXPR_MAXIMUM, NODE_MAXIMUM }; /* Rodzaje operatorów. */ enum OperKind { OPER_NONE, OPER_PLUS, OPER_MINUS, OPER_STAR, OPER_SLASH, OPER_DIV, OPER_MOD, OPER_SHL, OPER_SHR, OPER_EQ, OPER_NEQ, OPER_GT, OPER_LT, OPER_GEQ, OPER_LEQ, OPER_IN, OPER_XOR, OPER_OR, OPER_AND, OPER_NOT }; /* Dowolny węzeł. */ union AnyNode { SymbolNode *symbol; StmtNode *stmt; ExprNode *expr; }; typedef union AnyNode AnyNode; /* Wyrażenie. */ struct ExprNode { /* Rodzaj wyrażenia. */ enum NodeKind kind; /* Dla operatorów -- pierwszy parametr; * Dla zakresów -- początek zakresu; * Dla adresu -- segment pamięci; */ struct ExprNode *expr; /* Dla operatorów binarnych -- drugi parametr; * Dla zakresów -- koniec zakresu; * Dla adresu -- offset pamięci; */ struct ExprNode *expr2; /* Dla operatorów -- rodzaj operatora. */ enum OperKind oper; /* Dla wywołania zmiennej, funkcji lub stałej -- dany symbol; * Dla adresu -- obiekt o tym samym adresie; */ SymbolNode *symbol; /* Dla wywołania procedury -- lista parametrów; * Dla stałej zbiorowej -- lista wyrażeń elementów; * Dla stałej tablicowej -- jw.; * Dla stałej rekordowej -- lista wyrażeń pÓl; */ GList *list; /* Dla stałych -- ich wartość. * Dla pola rekordu -- jego nazwa. */ GString *value; /* Komentarze. */ GString *bcomm; GString *ccomm; }; /* Symbol. */ struct SymbolNode { /* Rodzaj symbolu. */ enum NodeKind kind; /* Numer zwracany przez tokenizer. */ int token; /* Oryginalna nazwa symbolu (z zachowaniem wielkości liter). */ GString *name; /* Dla programu, procedur i funckji -- tablica symboli zdefiniowanych wewnątrz; * Dla typu rekordowego -- tablica pól rekordu; */ Namespace *symbols; /* Dla programu, procedury i funkcji -- ciało (polecenie blokowe); * Dla etykiety -- polecenie, którego dotyczy; */ StmtNode *stmt; /* Dla zmiennych, stałych i funkcji -- typ; * Dla typów -- typ bazowy; * Dla rzutowania -- nowy typ; * Dla rekordów -- typ wyróżnikowy wariantów; */ SymbolNode *type; /* Dla programu -- lista nazw parametrów; * Dla procedury i funkcji -- parametry formalne; * Dla typu wyliczeniowego -- stałe zdefiniowane jako jego wartości; * Dla typu rekordowego -- pola wariantowe w postaci instrukcji case; * Dla typu tablicowego -- lista typów indeksów; * Dla elementu tablicy -- lista wyrażeń indeksów; * Dla pól rekordu -- lista etykiet wyboru; */ GList *list; /* Dla dereferencji wskaźnika -- zmienna wskazywana; * Dla rzutowania -- zmienna rzutowana; * Dla elementu tablicy -- zmienna tablicowa; * Dla rekordów -- pole wyróżnikowe; */ SymbolNode *base; /* Dla stałych -- ich wartość; * Dla łańcuchów -- wielkość łańcucha; * Dla typów okrojonych -- ich zakres; */ ExprNode *expr; /* Symbol do którego należy tablica symboli w której jest nasz symbol; * Dla programu równa NULL; */ SymbolNode *parent; /* Komentarze. */ GString *bcomm; GString *ccomm; }; /* Rozkaz. */ struct StmtNode { enum NodeKind kind; /* Rodzaj rozkazu. */ GList *list; /* Lista polecen dla bloku lub lista parametrow dla proc i with i * goto. */ struct StmtNode *stmt, *stmt2; /* Polecenia wewnętrzne (stmt2 dla else) */ SymbolNode *symbol; /* Na jakim symbolu operuje (przypisanie, procedura) */ SymbolNode *label; /* Etykieta tego rozkazu. */ ExprNode *expr; /* Wyrażenie dla if, until, while, for */ ExprNode *expr2; /* drugie wyrażenie dla for */ StmtNode *parent; /* Komentarze. */ GString *bcomm; GString *ccomm; }; #endif /* not NODE_H */
