- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理 第二章 一个简单的编译器
带有符号表功能的词法分析器 int lexan() { char lexbuf[100]; char c; while (1) { 从输入字符序列读取一个字符,保存到c; if (c == ‘ ‘ || c == ‘\t’) ; else if (c == ‘\n’) lineno++; else if (isdigit(c)) { tokenval = c及后续数字组成的数值; return NUM; } 带有符号表功能的词法分析器 else if (isalpha(c)) { 将c及后续字母、数字放入lexbuf; p = lookup(lexbuf); if (p = 0) p = insert(lexbuf, ID); tokenval = p; return 符号表项p的token值; } else { tokenval = NONE; return 字符c对应的整数; } } } Lcc的符号表 字符串的管理 //string.c static struct string { char *str; int len; struct string *link; } *buckets[1024]; char *stringn(const char *str, int len) { int i; unsigned int h; const char *end; struct string *p; assert(str); for (h = 0, i = len, end = str; i 0; i--) // Hash h = (h1) + scatter[*(unsigned char *)end++]; h = NELEMS(buckets)-1; 字符串管理 for (p = buckets[h]; p; p = p-link) //搜索 if (len == p-len) { const char *s1 = str; char *s2 = p-str; do { if (s1 == end) return p-str; } while (*s1++ == *s2++); } { static char *next, *strlimit; //创建 if (len + 1 = strlimit - next) { //现有空间不够 int n = len + 4*1024; next = allocate(n, PERM); //分配空间 strlimit = next + n; } 字符串管理 p-len = len; for (p-str = next; str end; ) *next++ = *str++; //复制字符串 *next++ = 0; p-link = buckets[h]; //放入Hash表 buckets[h] = p; return p-str; } } 符号表 //sym.c struct table { int level; Table previous; struct entry { struct symbol sym; struct entry *link; } *buckets[256]; Symbol all; }; 符号表 Symbol lookup(const char *name, Table tp) { struct entry *p; unsigned h = (unsigned long)name(HASHSIZE-1); assert(tp); do for (p = tp-buckets[h]; p; p = p-link) if (name == p-sym.name) return p-sym; while ((tp = tp-previous) != NULL); return NULL; } 符号表 Symbol install(const char *name, Table *tpp, int level, int arena) { Table tp = *tpp; struct entry *p; unsigned h = (unsigned long)name(HASHSIZE-1); assert(level == 0 || level = tp-level); if (level 0 tp-level l
文档评论(0)