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