core: Add support for '#ifdef' directive
Signed-off-by: Ian Moffett <ian@mirocom.org>
This commit is contained in:
@@ -158,6 +158,69 @@ parse_define(struct rifle_state *state, struct token *tok)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip to an '#endif' token
|
||||
*
|
||||
* @state: Compiler state
|
||||
* @tok: Last token
|
||||
*
|
||||
* Returns zero on success
|
||||
*/
|
||||
static int
|
||||
parse_skip_to_endif(struct rifle_state *state, struct token *tok)
|
||||
{
|
||||
if (state == NULL || tok == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (tok->type != TT_ENDIF) {
|
||||
if (parse_scan(state, tok) < 0) {
|
||||
ueof(state);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse an '#ifdef' preprocessing directive
|
||||
*
|
||||
* @state: Compiler state
|
||||
* @tok: Last token
|
||||
*
|
||||
* Returns zero on success
|
||||
*/
|
||||
static int
|
||||
parse_ifdef(struct rifle_state *state, struct token *tok)
|
||||
{
|
||||
struct symbol *symbol;
|
||||
|
||||
if (state == NULL || tok == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (tok->type != TT_IFDEF) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* EXPECT <IDENT> */
|
||||
if (parse_expect(state, TT_IDENT, tok) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
symbol = symbol_from_name(
|
||||
&state->symtab,
|
||||
tok->s
|
||||
);
|
||||
|
||||
if (symbol == NULL) {
|
||||
parse_skip_to_endif(state, tok);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle the preprocessing stage
|
||||
*
|
||||
@@ -175,6 +238,14 @@ parse_preprocess(struct rifle_state *state)
|
||||
return -1;
|
||||
}
|
||||
|
||||
break;
|
||||
case TT_IFDEF:
|
||||
if (parse_ifdef(state, &tok) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
break;
|
||||
case TT_ENDIF:
|
||||
break;
|
||||
default:
|
||||
tokbuf_push(&state->tokbuf, &tok);
|
||||
@@ -185,6 +256,18 @@ parse_preprocess(struct rifle_state *state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
parse_begin(struct rifle_state *state)
|
||||
{
|
||||
struct token tok;
|
||||
|
||||
while (parse_scan(state, &tok) == 0) {
|
||||
printf("got token %s\n", tokstr(&tok));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
parser_parse(struct rifle_state *state)
|
||||
{
|
||||
@@ -199,6 +282,13 @@ parser_parse(struct rifle_state *state)
|
||||
return -1;
|
||||
}
|
||||
|
||||
break;
|
||||
case 1:
|
||||
/* Parse loop */
|
||||
if (parse_begin(state) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,9 +39,11 @@ compile(const char *in_path)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (parser_parse(&state) < 0) {
|
||||
rifle_state_destroy(&state);
|
||||
return -1;
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
if (parser_parse(&state) < 0) {
|
||||
rifle_state_destroy(&state);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
rifle_state_destroy(&state);
|
||||
|
||||
Reference in New Issue
Block a user