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呢?
c4droid我来水经验的。 tk = tk * 147 + *p++;
确定是书上源码么?我怎么感觉*p++是错的。。。先*再++还是先++再*?
hackershit 发表于 2015-1-21 12:56
tk = tk * 147 + *p++;
确定是书上源码么?我怎么感觉*p++是错的。。。先*再++还是先++再*?
这个当然是先* 再++了 我是新手,不是很懂 单单这段代码看不出为什么是147,我估计这里是建立hash映射吧?找找何hash表中和这里的tk有关的东西应该能看出来。 本帖最后由 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情况 hackershit 发表于 2015-1-21 12:56
tk = tk * 147 + *p++;
确定是书上源码么?我怎么感觉*p++是错的。。。先*再++还是先++再*?
先*后++ xuexi 路过{:1_1:} 额(⊙o⊙)…好像。。有点。。。问题(话说我也不太清楚) 我是來學習的 584768970 发表于 2015-1-21 13:41
这个当然是先* 再++了
* 和 ++ 不是处于同一优先级吗,结合性是自右至左结合,不应该是先执行 p++ 再 * 吗? {:5_90:} pp是什么意思
{:1_1:}
页:
[1]