考研 408 × 求职面试
知识点 · 编译原理 · 进阶
每日一题 · 编译原理
解析
面试小贴士 · 编译原理
代码实现 · C
#include <stdio.h>
#include <string.h>
typedef struct { int is_decl; const char *name; int val; } Item;
typedef struct { const char *name; int val; } Sym;
int main(void) {
Item prog[] = { {0, "y", 0}, {1, "x", 10}, {0, "x", 0}, {1, "y", 20} };
int n = (int)(sizeof(prog) / sizeof(prog[0]));
Sym syms[4];
int m = 0;
// Pass 1:先收集所有声明,建立符号表
for (int i = 0; i < n; i++) {
if (prog[i].is_decl) {
syms[m].name = prog[i].name;
syms[m].val = prog[i].val;
m++;
}
}
// Pass 2:再解析使用,因此可处理前向引用
for (int i = 0; i < n; i++) {
if (prog[i].is_decl) continue;
int ok = 0;
for (int j = 0; j < m; j++) {
if (strcmp(prog[i].name, syms[j].name) == 0) {
printf("use %s = %d\n", prog[i].name, syms[j].val);
ok = 1;
break;
}
}
if (!ok) printf("use %s: undefined\n", prog[i].name);
}
return 0;
}