ability to call external variadic functions

This commit is contained in:
Andrew Kelley
2015-12-09 01:03:04 -07:00
parent 4eff5f114b
commit dfda85e870
10 changed files with 121 additions and 29 deletions

View File

@@ -104,6 +104,8 @@ enum TokenizeState {
TokenizeStateBang,
TokenizeStateLessThan,
TokenizeStateGreaterThan,
TokenizeStateDot,
TokenizeStateDotDot,
TokenizeStateError,
};
@@ -323,10 +325,40 @@ void tokenize(Buf *buf, Tokenization *out) {
begin_token(&t, TokenIdCmpGreaterThan);
t.state = TokenizeStateGreaterThan;
break;
case '.':
begin_token(&t, TokenIdDot);
t.state = TokenizeStateDot;
break;
default:
tokenize_error(&t, "invalid character: '%c'", c);
}
break;
case TokenizeStateDot:
switch (c) {
case '.':
t.state = TokenizeStateDotDot;
t.cur_tok->id = TokenIdEllipse;
break;
default:
t.pos -= 1;
end_token(&t);
t.state = TokenizeStateStart;
continue;
}
break;
case TokenizeStateDotDot:
switch (c) {
case '.':
t.state = TokenizeStateStart;
end_token(&t);
break;
default:
t.pos -= 1;
end_token(&t);
t.state = TokenizeStateStart;
continue;
}
break;
case TokenizeStateGreaterThan:
switch (c) {
case '=':
@@ -561,9 +593,11 @@ void tokenize(Buf *buf, Tokenization *out) {
case TokenizeStateBang:
case TokenizeStateLessThan:
case TokenizeStateGreaterThan:
case TokenizeStateDot:
end_token(&t);
break;
case TokenizeStateSawSlash:
case TokenizeStateDotDot:
tokenize_error(&t, "unexpected EOF");
break;
case TokenizeStateLineComment:
@@ -637,6 +671,8 @@ static const char * token_name(Token *token) {
case TokenIdBitShiftRight: return "BitShiftRight";
case TokenIdSlash: return "Slash";
case TokenIdPercent: return "Percent";
case TokenIdDot: return "Dot";
case TokenIdEllipse: return "Ellipse";
}
return "(invalid token)";
}