Mercurial > pasana
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/node.h Sat Oct 13 21:14:50 2012 +0200 @@ -0,0 +1,218 @@ +/* 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 */
