Add .import and .export directive to the grammar and parser

This commit is contained in:
omicron 2025-04-07 10:49:57 +02:00
parent f061419edf
commit c932c3c609
6 changed files with 52 additions and 2 deletions

View File

@ -3,10 +3,14 @@
<label> ::= <identifier> <colon> <label> ::= <identifier> <colon>
<directive> ::= <dot> <section_directive> <directive> ::= <dot> (<section_directive> | <export_directive> | <import_directive> )
<section_directive> ::= "section" <identifier> <section_directive> ::= "section" <identifier>
<export_directive> ::= "export" <identifier>
<import_directive> ::= "import" <identifier>
<instruction> ::= <identifier> <operands> <instruction> ::= <identifier> <operands>
<operands> ::= <operand> ( <comma> <operand> )* <operands> ::= <operand> ( <comma> <operand> )*

View File

@ -123,6 +123,10 @@ const char *ast_node_id_to_cstr(node_id_t id) {
return "NODE_PLUS_OR_MINUS"; return "NODE_PLUS_OR_MINUS";
case NODE_SECTION_DIRECTIVE: case NODE_SECTION_DIRECTIVE:
return "NODE_SECTION_DIRECTIVE"; return "NODE_SECTION_DIRECTIVE";
case NODE_IMPORT_DIRECTIVE:
return "NODE_IMPORT_DIRECTIVE";
case NODE_EXPORT_DIRECTIVE:
return "NODE_EXPORT_DIRECTIVE";
case NODE_REGISTER: case NODE_REGISTER:
return "NODE_REGISTER"; return "NODE_REGISTER";
case NODE_SECTION: case NODE_SECTION:
@ -157,6 +161,10 @@ const char *ast_node_id_to_cstr(node_id_t id) {
return "NODE_ASTERISK"; return "NODE_ASTERISK";
case NODE_DOT: case NODE_DOT:
return "NODE_DOT"; return "NODE_DOT";
case NODE_IMPORT:
return "NODE_IMPORT";
case NODE_EXPORT:
return "NODE_EXPORT";
} }
assert(!"Unreachable, weird node id" && id); assert(!"Unreachable, weird node id" && id);
__builtin_unreachable(); __builtin_unreachable();

View File

@ -29,10 +29,14 @@ typedef enum node_id {
NODE_REGISTER_OFFSET, NODE_REGISTER_OFFSET,
NODE_PLUS_OR_MINUS, NODE_PLUS_OR_MINUS,
NODE_SECTION_DIRECTIVE, NODE_SECTION_DIRECTIVE,
NODE_IMPORT_DIRECTIVE,
NODE_EXPORT_DIRECTIVE,
// Validated primitives // Validated primitives
NODE_REGISTER, NODE_REGISTER,
NODE_SECTION, NODE_SECTION,
NODE_IMPORT,
NODE_EXPORT,
// Primitive nodes // Primitive nodes
NODE_IDENTIFIER, NODE_IDENTIFIER,

View File

@ -119,8 +119,24 @@ parse_result_t parse_section_directive(tokenlist_entry_t *current) {
return parse_consecutive(current, NODE_SECTION_DIRECTIVE, parsers); return parse_consecutive(current, NODE_SECTION_DIRECTIVE, parsers);
} }
parse_result_t parse_import_directive(tokenlist_entry_t *current) {
parser_t parsers[] = {parse_import, parse_identifier, nullptr};
return parse_consecutive(current, NODE_IMPORT_DIRECTIVE, parsers);
}
parse_result_t parse_export_directive(tokenlist_entry_t *current) {
parser_t parsers[] = {parse_export, parse_identifier, nullptr};
return parse_consecutive(current, NODE_EXPORT_DIRECTIVE, parsers);
}
parse_result_t parse_directive_options(tokenlist_entry_t *current) {
parser_t parsers[] = {parse_section_directive, parse_import_directive,
parse_export_directive, nullptr};
return parse_any(current, parsers);
}
parse_result_t parse_directive(tokenlist_entry_t *current) { parse_result_t parse_directive(tokenlist_entry_t *current) {
parser_t parsers[] = {parse_dot, parse_section_directive, nullptr}; parser_t parsers[] = {parse_dot, parse_directive_options, nullptr};
return parse_consecutive(current, NODE_DIRECTIVE, parsers); return parse_consecutive(current, NODE_DIRECTIVE, parsers);
} }

View File

@ -101,3 +101,19 @@ parse_result_t parse_section(tokenlist_entry_t *current) {
return parse_token(current, TOKEN_IDENTIFIER, NODE_SECTION, return parse_token(current, TOKEN_IDENTIFIER, NODE_SECTION,
is_section_token); is_section_token);
} }
bool is_import_token(lexer_token_t *token) {
return strcmp(token->value, "import") == 0;
}
parse_result_t parse_import(tokenlist_entry_t *current) {
return parse_token(current, TOKEN_IDENTIFIER, NODE_IMPORT, is_import_token);
}
bool is_export_token(lexer_token_t *token) {
return strcmp(token->value, "export") == 0;
}
parse_result_t parse_export(tokenlist_entry_t *current) {
return parse_token(current, TOKEN_IDENTIFIER, NODE_EXPORT, is_export_token);
}

View File

@ -26,5 +26,7 @@ parse_result_t parse_label_reference(tokenlist_entry_t *current);
*/ */
parse_result_t parse_register(tokenlist_entry_t *current); parse_result_t parse_register(tokenlist_entry_t *current);
parse_result_t parse_section(tokenlist_entry_t *current); parse_result_t parse_section(tokenlist_entry_t *current);
parse_result_t parse_import(tokenlist_entry_t *current);
parse_result_t parse_export(tokenlist_entry_t *current);
#endif // INCLUDE_PARSER_PRIMITIVES_H_ #endif // INCLUDE_PARSER_PRIMITIVES_H_