鱼C论坛

 找回密码
 立即注册
查看: 2713|回复: 15

c4编译器里的一个问题

[复制链接]
发表于 2015-1-21 10:05:31 | 显示全部楼层 |阅读模式
10鱼币
if ((tk >= 'a' && tk <= 'z') || (tk >= 'A' && tk <= 'Z') || tk == '_') {
      pp = p - 1;
while ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || *p == '_')
        tk = tk * 147 + *p++;
c4编译器源码里第68到71行是这样的 这里tk是当前的词语,p指针指向下一个字符。这里我猜是要读取一词语。
只是这个147不太理解
文本处理时候上一个字符应该是左移八位吧 为什么是*147呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-21 12:48:08 From FishC Mobile | 显示全部楼层
c4droid  我来水经验的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-21 12:56:48 | 显示全部楼层
tk = tk * 147 + *p++;

确定是书上源码么?我怎么感觉  *p++是错的。。。先*再++还是先++再*?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-21 13:41:03 | 显示全部楼层
hackershit 发表于 2015-1-21 12:56
tk = tk * 147 + *p++;

确定是书上源码么?我怎么感觉  *p++是错的。。。先*再++还是先++再*?

这个当然是先* 再++了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-21 14:38:08 | 显示全部楼层
我是新手,不是很懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-21 16:58:57 | 显示全部楼层
单单这段代码看不出为什么是147,我估计这里是建立hash映射吧?找找何hash表中和这里的tk有关的东西应该能看出来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-22 08:15:29 | 显示全部楼层
本帖最后由 584768970 于 2015-1-22 08:23 编辑
仰望天上的光 发表于 2015-1-21 16:58
单单这段代码看不出为什么是147,我估计这里是建立hash映射吧?找找何hash表中和这里的tk有关的东西应该能 ...
char *p, *lp, // current position in source code
     *data;   // data/bss pointer

int *e, *le,  // current position in emitted code
    *id,      // currently parsed identifier
    *sym,     // symbol table (simple list of identifiers)
    tk,       // current token
    ival,     // current token value
    ty,       // current expression type
    loc,      // local variable offset
    line,     // current line number
    src,      // print source and assembly flag
    debug;    // print executed instructions

// tokens and classes (operators last and in precedence order)
enum {
  Num = 128, Fun, Sys, Glo, Loc, Id,
  Char, Else, Enum, If, Int, Return, Sizeof, While,
  Assign, Cond, Lor, Lan, Or, Xor, And, Eq, Ne, Lt, Gt, Le, Ge, Shl, Shr, Add, Sub, Mul, Div, Mod, Inc, Dec, Brak
};

// opcodes
enum { LEA ,IMM ,JMP ,JSR ,BZ  ,BNZ ,ENT ,ADJ ,LEV ,LI  ,LC  ,SI  ,SC  ,PSH ,
       OR  ,XOR ,AND ,EQ  ,NE  ,LT  ,GT  ,LE  ,GE  ,SHL ,SHR ,ADD ,SUB ,MUL ,DIV ,MOD ,
       OPEN,READ,CLOS,PRTF,MALC,MSET,MCMP,EXIT };

// types
enum { CHAR, INT, PTR };

// identifier offsets (since we can't create an ident struct)
enum { Tk, Hash, Name, Class, Type, Val, HClass, HType, HVal, Idsz };
这里是全局变量和枚举
if ((tk >= 'a' && tk <= 'z') || (tk >= 'A' && tk <= 'Z') || tk == '_') {
      pp = p - 1;
      while ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || *p == '_')
        tk = tk * 147 + *p++;
      tk = (tk << 6) + (p - pp);
      id = sym;
      while (id[Tk]) {
        if (tk == id[Hash] && !memcmp((char *)id[Name], pp, p - pp)) { tk = id[Tk]; return; }
        id = id + Idsz;
      }
      id[Name] = (int)pp;
      id[Hash] = tk;
      tk = id[Tk] = Id;
      return;
    }
这是68行到82行 该函数是多个if-else-if-else-if  组成的 这里是一中if情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-7 17:53:30 | 显示全部楼层
hackershit 发表于 2015-1-21 12:56
tk = tk * 147 + *p++;

确定是书上源码么?我怎么感觉  *p++是错的。。。先*再++还是先++再*?

先*后++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-16 13:15:54 | 显示全部楼层
xuexi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-18 13:49:47 | 显示全部楼层
路过{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-25 20:19:19 | 显示全部楼层
额(⊙o⊙)…好像。。有点。。。问题(话说我也不太清楚)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-19 20:38:22 | 显示全部楼层
我是來學習的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-19 21:30:42 | 显示全部楼层
584768970 发表于 2015-1-21 13:41
这个当然是先* 再++了

* 和 ++ 不是处于同一优先级吗,结合性是自右至左结合,不应该是先执行 p++ 再 * 吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-20 10:02:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-20 23:06:31 | 显示全部楼层
pp是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-25 13:46:55 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 23:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表