Генерация кода от INTEGER до INT - PullRequest
0 голосов
/ 04 декабря 2011

Я пытаюсь создать компилятор, и если компилятору дан токен INTEGER, REAL или CHARACTER, я бы хотел, чтобы он генерировал код для создания int, float или char вместо этого.Язык, на котором я пишу, - это C, и я использую flex и bison.

Мои методы лексера:

    SYMTABNODEPTR newSymTabNode()
{
    return ((SYMTABNODEPTR)malloc(sizeof(SYMTABNODE)));
}

int installId(char *id) 
{
    extern SYMTABNODEPTR symTab[SYMTABSIZE]; 
    extern int currentSymTabSize;
    int index;

    index = lookup(id);
    if (index >= 0)
    {
        return (index);
    }
    else 
    {
       symTab[currentSymTabSize] = newSymTabNode();
       strcpy(symTab[currentSymTabSize]->identifier,id);
       //symTab[currentSymTabSize]->type=0;
       return(currentSymTabSize++);
    }
}

int lookup(char *s)
{
    extern SYMTABNODEPTR symTab[SYMTABSIZE];
    extern int currentSymTabSize;
    int i;

    for(i=0; i<currentSymTabSize; i++)
    {
        if(strcmp(s,symTab[i]->identifier) == 0)
        {
            return (i);
        }
    }
    return (-1);    
}

и в моем анализаторе у меня есть:

struct symTabNode {
    char identifier [IDLENGTH];
};

typedef struct symTabNode SYMTABNODE;
typedef SYMTABNODE *SYMTABNODEPTR;

SYMTABNODEPTR symTab[SYMTABSIZE];

%token<iVal> IDENTIFIER NUMBER CHARACTER_CONSTANT EQUAL GTLT LT GT LTEQ GTEQ PLUS MINUS TIMES DIVIDE ASSIGN CHARACTER INTEGER REALCONST

type                    :   CHARACTER
                            {
                                $$ = create_node($1, TYPE_NODE, NULL, NULL, NULL);
                            }
                        |   INTEGER
                            {
                                $$ = create_node($1, TYPE_NODE, NULL, NULL, NULL);
                            }
                        |   REALCONST
                            {
                                $$ = create_node($1, TYPE_NODE, NULL, NULL, NULL);
                            }

void GenerateCode(TERNARY_TREE t)
    {

        if (t == NULL) return;
            switch(t->nodeIdentifier)
            {
                case(TYPE_NODE):
                        printf("%s ",symTab[t->item]);

                    break;
                default:
                    GenerateCode(t->first);
                    GenerateCode(t->second);
                    GenerateCode(t->third);
}

Мой компилятор в настоящее время выводит:

INTEGER a, b, c;
REAL d, e;
CHARACTER f;

было бы замечательно иметь

int a, b, c;
float d, e;
char f;

вместо этого, я надеюсь, что этого достаточно информации (конечно, компилятору еще много) СпасибоВы заранее

1 Ответ

1 голос
/ 04 декабря 2011

Я рекомендую создать очень простой тестовый пример (очень похожий на вопрос), а затем запустить компилятор в отладчике.По мере того, как вы шагаете по строке, проблема должна стать для вас очевидной.По крайней мере, это обычно для меня.Вы также можете изменить свою программу для вывода дополнительной информации в ключевые моменты ее выполнения, чтобы вы могли видеть, что она делает.

...