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