584768970 发表于 2015-1-21 10:05:31

c4编译器里的一个问题

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呢?

907806863 发表于 2015-1-21 12:48:08

c4droid我来水经验的。

hackershit 发表于 2015-1-21 12:56:48

tk = tk * 147 + *p++;

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

584768970 发表于 2015-1-21 13:41:03

hackershit 发表于 2015-1-21 12:56
tk = tk * 147 + *p++;

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

这个当然是先* 再++了

wingtree 发表于 2015-1-21 14:38:08

我是新手,不是很懂

仰望天上的光 发表于 2015-1-21 16:58:57

单单这段代码看不出为什么是147,我估计这里是建立hash映射吧?找找何hash表中和这里的tk有关的东西应该能看出来。

584768970 发表于 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) {
      if (tk == id && !memcmp((char *)id, pp, p - pp)) { tk = id; return; }
      id = id + Idsz;
      }
      id = (int)pp;
      id = tk;
      tk = id = Id;
      return;
    }
这是68行到82行 该函数是多个if-else-if-else-if组成的 这里是一中if情况

lixiaoshuai 发表于 2015-2-7 17:53:30

hackershit 发表于 2015-1-21 12:56
tk = tk * 147 + *p++;

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

先*后++

xx6625303 发表于 2015-2-16 13:15:54

xuexi

freeparty 发表于 2015-2-18 13:49:47

路过{:1_1:}

782981223 发表于 2015-3-25 20:19:19

额(⊙o⊙)…好像。。有点。。。问题(话说我也不太清楚)

neon_young 发表于 2015-5-19 20:38:22

我是來學習的

哥斯拉不说话 发表于 2015-5-19 21:30:42

584768970 发表于 2015-1-21 13:41
这个当然是先* 再++了

* 和 ++ 不是处于同一优先级吗,结合性是自右至左结合,不应该是先执行 p++ 再 * 吗?

364904690 发表于 2015-5-20 10:02:36

{:5_90:}

Zhangchi 发表于 2015-5-20 23:06:31

pp是什么意思

2413780002 发表于 2015-5-25 13:46:55

{:1_1:}
页: [1]
查看完整版本: c4编译器里的一个问题