设为首页 加入收藏

TOP

自己动手写C语言编译器(3)(四)
2014-11-23 22:37:13 来源: 作者: 【 】 浏览:2
Tags:自己 手写 语言 编译器
if (c == '\r') {

LINENO++;

if (eolIsSignificantP)

{

//end of line 作为结束的标识。

peekc = SKIP_LF;

return ttype = TT_EOL;

}

c = read();

if (c == '\n')

c = read();

} else {

if (c == '\n') {

LINENO++;

if (eolIsSignificantP) {

//end of line 作为结束的标识。

return ttype = TT_EOL;

}

}

c = read();

}

if (c < 0)

return ttype = TT_EOF;

ctype = c < 256 ct[c] : CT_ALPHA;

}

if ((ctype & CT_DIGIT) != 0) {

bool neg = false;

if (c == '-') {

c = read();

if (c != '.' && (c < '0' || c > '9')) {

peekc = c;

return ttype = '-';

}

neg = true;

}

double v = 0;

int decexp = 0;

int seendot = 0;

while (true) {

if (c == '.' && seendot == 0)

seendot = 1;

else if ('0' <= c && c <= '9') {

v = v * 10 + (c - '0');

decexp += seendot;

} else

break;

c = read();

}

peekc = c;

if (decexp != 0) {

double denom = 10;

decexp--;

while (decexp > 0) {

denom *= 10;

decexp--;

}

/* Do one division of a likely-to-be-more-accurate number */

v = v / denom;

}

nval = neg -v : v;

return ttype = TT_NUMBER;

}

if ((ctype & CT_ALPHA) != 0) {

int i = 0;

do {

if (i >= buf.size()) {

buf.resize(buf.size()*2);

}

buf[i++] = (char) c;

c = read();

ctype = c < 0 CT_WHITESPACE : c < 256 ct[c] : CT_ALPHA;

} while ((ctype & (CT_ALPHA | CT_DIGIT)) != 0);

peekc = c;

sval.resize(i, 0);

std::copy(buf.begin(), buf.end(), sval.begin());

return ttype = TT_WORD;

}

if ((ctype & CT_QUOTE) != 0) {

ttype = c;

int i = 0;

int d = read();

while (d >= 0 && d != ttype && d != '\n' && d != '\r')

{

if (d == '\\') {

c = read();

int first = c; /* To allow \377, but not \477 */

if (c >= '0' && c <= '7') {

c = c - '0';

int c2 = read();

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇位运算及其应用实例(2) 下一篇自己动手写C语言编译器(5)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: