Add unicode literal
This commit is contained in:
4
main.cpp
4
main.cpp
@@ -127,13 +127,15 @@ int main(){
|
|||||||
result = compile_file("new_types.kl"_s);
|
result = compile_file("new_types.kl"_s);
|
||||||
printf("%s", result.str);
|
printf("%s", result.str);
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
result = compile_file("program.kl"_s);
|
result = compile_file("program.kl"_s);
|
||||||
FILE *f = fopen("program.c", "w");
|
FILE *f = fopen("program.c", "w");
|
||||||
assert(f);
|
assert(f);
|
||||||
fprintf(f, "%.*s", (int)result.len, result.str);
|
fprintf(f, "%.*s", (int)result.len, result.str);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
system("clang.exe program.c -g -o program.exe && program.exe");
|
system("clang.exe program.c -g -o program.exe && program.exe");
|
||||||
|
#endif
|
||||||
|
|
||||||
__debugbreak();
|
__debugbreak();
|
||||||
}
|
}
|
||||||
|
|||||||
30
new_lex.cpp
30
new_lex.cpp
@@ -77,8 +77,8 @@ enum Token_Kind{
|
|||||||
TK_DocComment,
|
TK_DocComment,
|
||||||
TK_Comment,
|
TK_Comment,
|
||||||
TK_Identifier,
|
TK_Identifier,
|
||||||
|
TK_UnicodeLit,
|
||||||
TK_StringLit,
|
TK_StringLit,
|
||||||
TK_Character,
|
|
||||||
TK_Error,
|
TK_Error,
|
||||||
TK_Float,
|
TK_Float,
|
||||||
TK_Integer,
|
TK_Integer,
|
||||||
@@ -102,6 +102,7 @@ struct Token{
|
|||||||
};
|
};
|
||||||
|
|
||||||
union {
|
union {
|
||||||
|
U32 unicode;
|
||||||
U64 int_val;
|
U64 int_val;
|
||||||
F64 f64_val;
|
F64 f64_val;
|
||||||
String error_val;
|
String error_val;
|
||||||
@@ -416,17 +417,6 @@ lex__stream(Intern_Table *table, Array<Token> *array, Lex_Stream *s){
|
|||||||
t = token_make(lexcp(s), s->file, s->line, s->line_begin);
|
t = token_make(lexcp(s), s->file, s->line, s->line_begin);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
// @todo: add open and close brace handling as OPEN_SCOPE CLOSE_SCOPE
|
|
||||||
// when it comes to compound statements it's going to check for scopes
|
|
||||||
// and then it's going to specialize and look for brace string
|
|
||||||
|
|
||||||
// case '{': {
|
|
||||||
// s->inside_brace_paren++; t.kind = TK_OpenBrace;
|
|
||||||
// } break;
|
|
||||||
// case '}': {
|
|
||||||
// s->inside_brace_paren--;
|
|
||||||
// t.kind = CLOSE_SCOPE;
|
|
||||||
// } break;
|
|
||||||
default:{
|
default:{
|
||||||
if(s->inside_brace_paren) should_emit = false;
|
if(s->inside_brace_paren) should_emit = false;
|
||||||
if(should_emit){
|
if(should_emit){
|
||||||
@@ -486,6 +476,18 @@ lex__stream(Intern_Table *table, Array<Token> *array, Lex_Stream *s){
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case '\'':{
|
||||||
|
assert(s->stream.len >= s->iter);
|
||||||
|
UTF32_Result decode = utf8_to_utf32(lexcp(s), s->stream.len - s->iter);
|
||||||
|
if(!decode.error){
|
||||||
|
for(S32 i = 0; i < decode.advance; i++) lex_advance(s);
|
||||||
|
t.unicode = decode.out_str;
|
||||||
|
t.kind = TK_UnicodeLit;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
token_error(&t, "Invalid UTF8 sequence in unicode literal"_s);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
case '<': {
|
case '<': {
|
||||||
if (lexc(s) == '<') {
|
if (lexc(s) == '<') {
|
||||||
@@ -559,8 +561,6 @@ lex__stream(Intern_Table *table, Array<Token> *array, Lex_Stream *s){
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
|
||||||
case '\'':{not_implemented;} break;
|
|
||||||
case '"': {
|
case '"': {
|
||||||
t.kind = TK_StringLit;
|
t.kind = TK_StringLit;
|
||||||
lex_parse_string(s,&t,'"');
|
lex_parse_string(s,&t,'"');
|
||||||
@@ -738,7 +738,7 @@ name(Token_Kind kind){
|
|||||||
case TK_Comment: return "Comment";
|
case TK_Comment: return "Comment";
|
||||||
case TK_Identifier: return "Identifier";
|
case TK_Identifier: return "Identifier";
|
||||||
case TK_StringLit: return "String_Lit";
|
case TK_StringLit: return "String_Lit";
|
||||||
case TK_Character: return "Character";
|
case TK_UnicodeLit: return "Unicode_Lit";
|
||||||
case TK_Error: return "Error";
|
case TK_Error: return "Error";
|
||||||
case TK_Float: return "Float";
|
case TK_Float: return "Float";
|
||||||
case TK_Integer: return "int";
|
case TK_Integer: return "int";
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ parsing_error(Token *token, const char *str, ...){
|
|||||||
// @Note(Krzosa): Print nice error message
|
// @Note(Krzosa): Print nice error message
|
||||||
printf("\nError: %s", string.str);
|
printf("\nError: %s", string.str);
|
||||||
if(token){
|
if(token){
|
||||||
|
if(token->kind == TK_Error){
|
||||||
|
printf("Token Error: %.*s", (int)token->error_val.len, token->error_val.str);
|
||||||
|
}
|
||||||
printf(" %s:%d\n", token->file.str, (S32)token->line + 1);
|
printf(" %s:%d\n", token->file.str, (S32)token->line + 1);
|
||||||
|
|
||||||
// @Note(Krzosa): Print error line
|
// @Note(Krzosa): Print error line
|
||||||
@@ -372,6 +375,7 @@ parse_expr(S64 min_bp){
|
|||||||
case TK_StringLit : left = ast_str(token, token->intern_val); break;
|
case TK_StringLit : left = ast_str(token, token->intern_val); break;
|
||||||
case TK_Identifier : left = ast_ident(token, token->intern_val); break;
|
case TK_Identifier : left = ast_ident(token, token->intern_val); break;
|
||||||
case TK_Integer : left = ast_int(token, token->int_val); break;
|
case TK_Integer : left = ast_int(token, token->int_val); break;
|
||||||
|
case TK_UnicodeLit : left = ast_int(token, token->unicode); break;
|
||||||
case TK_Float : left = ast_float(token, token->f64_val); break;
|
case TK_Float : left = ast_float(token, token->f64_val); break;
|
||||||
case TK_Pointer : left = ast_expr_unary(token, TK_Pointer, parse_expr(prefix_bp.right)); break;
|
case TK_Pointer : left = ast_expr_unary(token, TK_Pointer, parse_expr(prefix_bp.right)); break;
|
||||||
case TK_Dereference: left = ast_expr_unary(token, TK_Dereference, parse_expr(prefix_bp.right)); break;
|
case TK_Dereference: left = ast_expr_unary(token, TK_Dereference, parse_expr(prefix_bp.right)); break;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ binary_test :: ()
|
|||||||
bit_and :: 3 & 1
|
bit_and :: 3 & 1
|
||||||
bit_or :: 1 | 4
|
bit_or :: 1 | 4
|
||||||
bit_xor :: 8 ^ 7
|
bit_xor :: 8 ^ 7
|
||||||
|
character :: 'ó
|
||||||
|
|
||||||
boolean_equals :: true == false
|
boolean_equals :: true == false
|
||||||
boolean_var: Bool = boolean_equals
|
boolean_var: Bool = boolean_equals
|
||||||
|
|||||||
Reference in New Issue
Block a user