view node_new.c @ 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

/* Pojedynczy wezel drzewa parsowania. */

#include "node.h"
#include "node_new.h"
#include "parser.h"
#include "pascal.tab.h"


/* Utowrzenie nowego węzła z wyrażeniem. */
ExprNode *
newExprNode(Parser *parser, enum NodeKind kind)
{
    ExprNode *node;

    node = g_new(ExprNode,1);
    node->kind = kind;
    node->list = NULL;
    node->expr = NULL;
    node->expr2 = NULL;
    node->symbol = NULL;
    node->value = NULL;
    
    /* Dodajemy komentarze. */
    node->bcomm = parser->blockcomment;
    parser->blockcomment = NULL;
    parser->codecomment = &(node->ccomm);
    return node;
}

/* Utowrzenie nowego węzła z rozkazem. */
StmtNode *
newStmtNode(Parser *parser, enum NodeKind kind)
{
    StmtNode *node;

    node = g_new(StmtNode,1);
    node->kind = kind;
    node->list = NULL;
    node->stmt = NULL;
    node->stmt2 = NULL;
    node->symbol = NULL;
    node->expr = NULL;
    node->expr2 = NULL;
    node->parent = NULL;
    node->label = NULL;
    
    /* Dodajemy komentarze. */
    node->bcomm = parser->blockcomment;
    parser->blockcomment = NULL;
    parser->codecomment = &(node->ccomm);
    return node;
}

/* Utworzenie nowego węzła z symbolem. */
SymbolNode *
newSymbolNode(Parser *parser, const char *name, enum NodeKind kind)
{
    SymbolNode *node;

    node = g_new(SymbolNode, 1);
    node->kind = kind;
    node->name = g_string_new(name);
    node->symbols = NULL;
    node->stmt = NULL;
    node->type = NULL;
    node->parent = NULL;
    node->list = NULL;
    node->base = NULL;
    node->expr = NULL;

    /* Stała, jaką ma zwrócic tokenizer. */
    switch (kind) {
        case SYM_TYPE_POINTER:
        case SYM_TYPE_STRING:
        case SYM_TYPE_ARRAY:
        case SYM_TYPE_SET:
        case SYM_TYPE_SUBRANGE:
        case SYM_TYPE_ENUM:
        case SYM_TYPE_RECORD:
        case SYM_TYPE_FILE:
            node->token = ID_TYPE;
            break;
        case SYM_VAR_LOCAL:
        case SYM_VAR_PARAM:
        case SYM_VAR_VARPARAM:
        case SYM_VAR_DEARR:
        case SYM_VAR_DEREF:
        case SYM_VAR_CAST:
            node->token = ID_VAR;
            break;
        case SYM_VAR_FIELD:
            node->token = ID_FIELD;
            break;
        case SYM_LABEL:
            node->token = ID_LABEL;
            break;
        case SYM_PROC:
            node->token = ID_PROC;
            break;
        case SYM_FUNC:
            node->token = ID_FUNC;
            break;
        case SYM_CONST:
            node->token = ID_CONST;
            break;
        case SYM_UNIT:
            node->token = ID_UNIT;
            break;
        default:
            node->token = 0;
    }

    /* Dodajemy komentarze. */
    node->bcomm = parser->blockcomment;
    parser->blockcomment = NULL;
    parser->codecomment = &(node->ccomm);
    
    return node;
}