自制编译器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.
相关产品推荐
相关产品推荐

