【问题标题】:Code generation from INTEGER to int从 INTEGER 到 int 的代码生成
【发布时间】:2012-01-12 14:29:15
【问题描述】:

我正在尝试制作一个编译器,如果编译器被赋予了标记 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;

改为 我希望这是足够的信息(当然编译器还有很多) 提前谢谢你

【问题讨论】:

  • 我删除了 Flex 标签;因为我很确定这与 Adob​​e Flex 无关,我添加了与词法分析器相关的 gnu-flex 标签。

标签: c compilation code-generation bison flex-lexer


【解决方案1】:

我建议创建一个非常简单的测试用例(就像您在问题中提出的那样),然后在调试器中运行您的编译器。当您逐行执行时,问题应该对您很明显。至少它通常对我有用。您还可以修改您的程序以在其执行的关键点打印出额外的信息,这样您就可以看到它在做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2012-03-04
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多