|
@@ -27,6 +27,9 @@ bool run_function(struct str str);
|
|
|
bool tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
|
|
bool tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
|
|
|
enum err *out_err);
|
|
enum err *out_err);
|
|
|
|
|
|
|
|
|
|
+bool tkn_parse_decl(struct tokenizer *tkn, struct token *out_tk,
|
|
|
|
|
+ enum err *out_err);
|
|
|
|
|
+
|
|
|
enum c_token_type {
|
|
enum c_token_type {
|
|
|
_TT = TK_LAST,
|
|
_TT = TK_LAST,
|
|
|
TK_PP_DEF,
|
|
TK_PP_DEF,
|
|
@@ -85,9 +88,11 @@ main(int argc, char *argv[])
|
|
|
goto error_exit;
|
|
goto error_exit;
|
|
|
}
|
|
}
|
|
|
switch ( tk.type ) {
|
|
switch ( tk.type ) {
|
|
|
- case TK_POUND:
|
|
|
|
|
- if ( ! tkn_parse_pp_directive(&tkn, NULL, &err) ) goto error_exit;
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ case TK_POUND: {
|
|
|
|
|
+ struct token pp_tk = {0};
|
|
|
|
|
+ if ( ! tkn_parse_pp_directive(&tkn, &pp_tk, &err) ) goto error_exit;
|
|
|
|
|
+ } break;
|
|
|
|
|
+ case TK_ID: if ( ! tkn_parse_decl(&tkn, NULL, &err) ) goto error_exit;
|
|
|
case TK_NL: break;
|
|
case TK_NL: break;
|
|
|
default: fprintf(stderr, "%s ERROR: Invalid Token `%s`\n",
|
|
default: fprintf(stderr, "%s ERROR: Invalid Token `%s`\n",
|
|
|
tokenizer_token_loc_temp(&tkn, &tk, TLF_VIM, NULL),
|
|
tokenizer_token_loc_temp(&tkn, &tk, TLF_VIM, NULL),
|
|
@@ -98,20 +103,6 @@ main(int argc, char *argv[])
|
|
|
tk = tokenizer_next_token(&tkn, &err);
|
|
tk = tokenizer_next_token(&tkn, &err);
|
|
|
} while ( tk.type != TK_EOF );
|
|
} while ( tk.type != TK_EOF );
|
|
|
|
|
|
|
|
-/*
|
|
|
|
|
- if ( ! tkn_expect(&tkn, TK_POUND) ) return 1;
|
|
|
|
|
-
|
|
|
|
|
- if ( ! tkn_expect_id(&tkn, "run") ) return 1;
|
|
|
|
|
-
|
|
|
|
|
- if ( ! tkn_expect(&tkn, TK_L_CUR_BRACES) ) return 1;
|
|
|
|
|
-
|
|
|
|
|
- if ( ! tkn_parse_function(&tkn) ) return 1;
|
|
|
|
|
-
|
|
|
|
|
- if ( ! tkn_expect(&tkn, TK_R_CUR_BRACES) ) return 1;
|
|
|
|
|
-
|
|
|
|
|
- if ( ! tkn_expect(&tkn, TK_EOF) ) return 1;
|
|
|
|
|
-*/
|
|
|
|
|
-
|
|
|
|
|
printf("%s\n", err_to_name[err]);
|
|
printf("%s\n", err_to_name[err]);
|
|
|
|
|
|
|
|
error_exit:
|
|
error_exit:
|
|
@@ -251,6 +242,7 @@ tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
|
|
|
case TK_NUM_LIT:
|
|
case TK_NUM_LIT:
|
|
|
tk_ws = (struct token_wstr *) &tk;
|
|
tk_ws = (struct token_wstr *) &tk;
|
|
|
break;
|
|
break;
|
|
|
|
|
+ case TK_NL: goto define_wout_value;
|
|
|
default:
|
|
default:
|
|
|
fprintf(stderr,
|
|
fprintf(stderr,
|
|
|
"%s Got wrong token, expected:"
|
|
"%s Got wrong token, expected:"
|
|
@@ -268,6 +260,7 @@ tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
|
|
|
tk_def.loc_end = tk_ws->loc_end;
|
|
tk_def.loc_end = tk_ws->loc_end;
|
|
|
|
|
|
|
|
if ( ! tkn_expect(tkn, TK_NL, NULL, perr) ) return false;
|
|
if ( ! tkn_expect(tkn, TK_NL, NULL, perr) ) return false;
|
|
|
|
|
+define_wout_value:
|
|
|
|
|
|
|
|
LIB_SET_IF_NOT_NULL(out_tk, *(struct token *) &tk_def);
|
|
LIB_SET_IF_NOT_NULL(out_tk, *(struct token *) &tk_def);
|
|
|
return true;
|
|
return true;
|
|
@@ -277,7 +270,30 @@ tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
|
|
|
struct token_pp_inc tk_inc = {0};
|
|
struct token_pp_inc tk_inc = {0};
|
|
|
tk_inc.type = TK_PP_INC;
|
|
tk_inc.type = TK_PP_INC;
|
|
|
|
|
|
|
|
- if ( ! tkn_expect(tkn, TK_L_ANG_BRACKET, NULL, perr) ) return false;
|
|
|
|
|
|
|
+ tk = tokenizer_next_token(tkn, &err);
|
|
|
|
|
+ if ( err != ERR_OK ) {
|
|
|
|
|
+ fprintf(stderr, "Failed to get next token: %s\n",
|
|
|
|
|
+ err_to_name[err]);
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ( tk.type == TK_STR_LIT ) {
|
|
|
|
|
+ tk_ws = (struct token_wstr *) &tk;
|
|
|
|
|
+ tk_inc.loc_start = tk_ws->loc_start;
|
|
|
|
|
+ tk_inc.loc_end = tk_ws->loc_end;
|
|
|
|
|
+
|
|
|
|
|
+ memcpy(buf, tk_ws->string.data, tk_ws->string.size);
|
|
|
|
|
+ tk_inc.string.data = buf;
|
|
|
|
|
+ tk_inc.string.size = tk_ws->string.size;
|
|
|
|
|
+ goto include_str_lit;
|
|
|
|
|
+ } else if ( tk.type != TK_L_ANG_BRACKET) {
|
|
|
|
|
+ fprintf(stderr,
|
|
|
|
|
+ "%s Got wrong token, expected:"
|
|
|
|
|
+ " TK_ID/TK_STR_LIT/TK_NUM_LIT, got: %s\n",
|
|
|
|
|
+ tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
|
|
|
|
|
+ token_to_cstr(tk.type));
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
if ( ! tkn_expect(tkn, TK_ID, &tk, perr) ) return false;
|
|
if ( ! tkn_expect(tkn, TK_ID, &tk, perr) ) return false;
|
|
|
tk_ws = (struct token_wstr *) &tk;
|
|
tk_ws = (struct token_wstr *) &tk;
|
|
@@ -285,17 +301,18 @@ tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
|
|
|
tk_inc.loc_start = tk_ws->loc_start;
|
|
tk_inc.loc_start = tk_ws->loc_start;
|
|
|
tk_inc.loc_end = tk_ws->loc_end;
|
|
tk_inc.loc_end = tk_ws->loc_end;
|
|
|
|
|
|
|
|
|
|
+ memcpy(buf, tk_ws->string.data, tk_ws->string.size);
|
|
|
|
|
+
|
|
|
tk_inc.string.data = buf;
|
|
tk_inc.string.data = buf;
|
|
|
tk_inc.string.size = tk_ws->string.size;
|
|
tk_inc.string.size = tk_ws->string.size;
|
|
|
|
|
|
|
|
- memcpy(buf, tk_ws->string.data, tk_ws->string.size);
|
|
|
|
|
-
|
|
|
|
|
if ( ! tkn_expect(tkn, TK_DOT, NULL, perr) ) return false;
|
|
if ( ! tkn_expect(tkn, TK_DOT, NULL, perr) ) return false;
|
|
|
if ( ! tkn_expect_id(tkn, "h", NULL, perr) ) return false;
|
|
if ( ! tkn_expect_id(tkn, "h", NULL, perr) ) return false;
|
|
|
|
|
|
|
|
if ( ! tkn_expect(tkn, TK_R_ANG_BRACKET, NULL, perr) ) return false;
|
|
if ( ! tkn_expect(tkn, TK_R_ANG_BRACKET, NULL, perr) ) return false;
|
|
|
if ( ! tkn_expect(tkn, TK_NL, NULL, perr) ) return false;
|
|
if ( ! tkn_expect(tkn, TK_NL, NULL, perr) ) return false;
|
|
|
|
|
|
|
|
|
|
+include_str_lit:
|
|
|
LIB_SET_IF_NOT_NULL(out_tk, *(struct token *) &tk_inc);
|
|
LIB_SET_IF_NOT_NULL(out_tk, *(struct token *) &tk_inc);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
@@ -312,11 +329,75 @@ tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /* Format src.c:line:col: msg */
|
|
|
|
|
|
|
+ *perr = -1;
|
|
|
fprintf(stderr, "%s ERROR: Invalid Pre-Compiler directive `%.*s`\n",
|
|
fprintf(stderr, "%s ERROR: Invalid Pre-Compiler directive `%.*s`\n",
|
|
|
tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
|
|
tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
|
|
|
(int) tk_ws->string.size, tk_ws->string.data);
|
|
(int) tk_ws->string.size, tk_ws->string.data);
|
|
|
|
|
+ return false;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool
|
|
|
|
|
+tkn_parse_decl(struct tokenizer *tkn, struct token *out_tk, enum err *out_err)
|
|
|
|
|
+{
|
|
|
|
|
+ /* static char buf[1024] = {0}; */
|
|
|
|
|
+ /* static char buf2[1024] = {0}; */
|
|
|
|
|
+ struct token tk = {0};
|
|
|
|
|
+ struct token_wstr *tk_ws = NULL;
|
|
|
|
|
+ struct token_wstr tk_type = {0};
|
|
|
|
|
+ enum err err = ERR_OK;
|
|
|
|
|
+ enum err *perr = &err;
|
|
|
|
|
+
|
|
|
|
|
+ LIB_ARG_IF_NOT_NULL_MUST_BE(out_err, ERR_OK, false);
|
|
|
|
|
+ LIB_ARG_MUST_NOT_BE_NULL(tkn, out_err, false);
|
|
|
|
|
+
|
|
|
|
|
+ if ( out_err != NULL ) {
|
|
|
|
|
+ perr = out_err;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ tk_type = *(struct token_wstr *) &tkn->last;
|
|
|
|
|
+
|
|
|
|
|
+ if ( ! tkn_expect(tkn, TK_ID, &tk, perr) ) return false;
|
|
|
|
|
+
|
|
|
|
|
+ switch ( tokenizer_next_token_type(tkn, perr) ) {
|
|
|
|
|
+ case TK_L_BRACES: {
|
|
|
|
|
+ TODO("Implement function declaration");
|
|
|
|
|
+ } break;
|
|
|
|
|
+ case TK_INVALID:
|
|
|
|
|
+ fprintf(stderr, "Failed to get next token: %s\n", err_to_name[*perr]);
|
|
|
|
|
+ return false;
|
|
|
|
|
+ default:
|
|
|
|
|
+ fprintf(stderr,
|
|
|
|
|
+ "%s Got wrong token, expected: TK_L_BRACES, got: %s\n",
|
|
|
|
|
+ tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
|
|
|
|
|
+ token_to_cstr(tk.type));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+/*
|
|
|
|
|
+ tk = tokenizer_next_token(tkn, perr);
|
|
|
|
|
+ if ( *perr != ERR_OK ) {
|
|
|
|
|
+ fprintf(stderr, "Failed to get next token: %s\n", err_to_name[*perr]);
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ( tk.type != TK_ID ) {
|
|
|
|
|
+ fprintf(stderr, "%s Got wrong token, expected: TK_ID, got: %s\n",
|
|
|
|
|
+ tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
|
|
|
|
|
+ token_to_cstr(tk.type));
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ UNUSED(tk_type);
|
|
|
|
|
+ UNUSED(out_tk);
|
|
|
|
|
+
|
|
|
|
|
+ *perr = ERR_OK;
|
|
|
|
|
+ tk_ws = (struct token_wstr *) &tkn->last;
|
|
|
|
|
+ fprintf(stderr, "%s ERROR: Invalid declaration id `%.*s`\n",
|
|
|
|
|
+ tokenizer_token_loc_temp(tkn, &tkn->last, TLF_VIM, NULL),
|
|
|
|
|
+ (int) tk_ws->string.size, tk_ws->string.data);
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|