You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制编译器cradle.c编译报错求助:附代码及错误信息

解决你的编译器Cradle代码编译错误

咱们逐个拆解你遇到的三个问题,一步步修复:

1. Getchar函数的递归与返回值错误

你写的Getchar函数现在是无限递归调用自己,而且返回的是函数指针而非字符值,这直接导致了return makes integer from pointer without a cast警告。另外,你应该调用标准库的getchar()来读取输入,为了避免和标准库函数重名,建议把自定义读取函数改名为GetChar(大写C开头),区分度更高。

修复后的GetChar函数:

int GetChar() { 
    Look = getchar(); // 调用标准库的getchar()读取输入
    return Look; 
}

(注:标准库getchar()返回int类型,用来处理EOF场景,所以自定义函数也用int返回类型更严谨)

2. 未定义main函数

C语言程序必须有main作为入口函数,编译器找不到它就会报对‘main’的未定义引用错误。我们需要添加一个简单的main函数,用来初始化并测试你的编译器基础功能:

int main() {
    Init();
    // 这里可以加测试逻辑,比如读取一个标识符或数字
    printf("Enter a name: ");
    char name = GetName();
    printf("You entered: %c\n", name);
    return 0;
}

3. GetNum函数里的函数名大小写错误

你在GetNum里调用了GetChar()(大写C),但原函数定义是Getchar(小写c),大小写不匹配导致链接错误对‘GetChar’的未定义引用。只要把所有调用处的函数名统一成GetChar就能解决。

另外,你的代码遗漏了<ctype.h>头文件,isalpha、toupper、isdigit这些字符判断函数都依赖这个头文件,必须补上。


修复后的完整Cradle.c代码

#include "cradle.h" 
#include <stdio.h> 
#include <stdlib.h>
#include <ctype.h> // 新增:用于字符判断函数

#define MAX_BUF 256 // 若cradle.h中已定义MAX_BUF,可删除此行

char tmp[MAX_BUF]; 
char Look; 

// 自定义读取字符函数,与标准库getchar区分
int GetChar() { 
    Look = getchar(); 
    return Look; 
} 

void Error(char *s) { printf("\nError: %s.", s); } 
void Abort(char *s) { Error(s); exit(1); } 
void Expected(char *s) { sprintf(tmp,"%s Expected", s); Abort(tmp); } 

void Match(char x) { 
    if(Look == x) { 
        GetChar(); 
    } else { 
        sprintf(tmp,"'%c'", x); 
        Expected(tmp); 
    } 
} 

char GetName() { 
    char c = Look; 
    if(!isalpha(Look)) { 
        sprintf(tmp,"Name"); 
        Expected(tmp); 
    } 
    GetChar(); 
    return toupper(c); 
} 

char GetNum() { 
    char c = Look; 
    if(!isdigit(Look)) { 
        sprintf(tmp,"Integer"); 
        Expected(tmp); 
    } 
    GetChar(); // 修正:统一调用GetChar
    return c; 
} 

void Emit(char *s) { printf("\t%s", s); } 
void EmitLn(char *s) { Emit(s); printf("\n"); } 

void Init() { GetChar(); } 

// 新增:程序入口main函数
int main() {
    Init();
    // 测试读取标识符
    printf("Input an identifier (starts with letter): ");
    char id = GetName();
    printf("Parsed identifier: %c\n", id);
    
    // 测试读取数字
    printf("Input a number: ");
    char num = GetNum();
    printf("Parsed number: %c\n", num);
    
    return 0;
}

编译验证

现在用gcc编译应该能正常通过:

gcc cradle.c -o cradle
./cradle

运行后可以测试输入名字和数字,验证基础的词法分析功能。

内容的提问来源于stack exchange,提问作者Gabrielle L.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:40:01