Add .import and .export directive to the grammar and parser
This commit is contained in:
parent
dc210e409c
commit
d3d69b82d5
@ -3,10 +3,14 @@
|
||||
|
||||
<label> ::= <identifier> <colon>
|
||||
|
||||
<directive> ::= <dot> <section_directive> <newline>
|
||||
<directive> ::= <dot> (<section_directive> | <export_directive> | <import_directive> ) <newline>
|
||||
|
||||
<section_directive> ::= "section" <identifier>
|
||||
|
||||
<export_directive> ::= "export" <identifier>
|
||||
|
||||
<import_directive> ::= "import" <identifier>
|
||||
|
||||
<instruction> ::= <identifier> <operands> <newline>
|
||||
|
||||
<operands> ::= <operand> ( <comma> <operand> )*
|
||||
|
@ -123,6 +123,10 @@ const char *ast_node_id_to_cstr(node_id_t id) {
|
||||
return "NODE_PLUS_OR_MINUS";
|
||||
case 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:
|
||||
return "NODE_REGISTER";
|
||||
case NODE_SECTION:
|
||||
@ -159,6 +163,10 @@ const char *ast_node_id_to_cstr(node_id_t id) {
|
||||
return "NODE_DOT";
|
||||
case NODE_NEWLINE:
|
||||
return "NODE_NEWLINE";
|
||||
case NODE_IMPORT:
|
||||
return "NODE_IMPORT";
|
||||
case NODE_EXPORT:
|
||||
return "NODE_EXPORT";
|
||||
}
|
||||
assert(!"Unreachable, weird node id" && id);
|
||||
__builtin_unreachable();
|
||||
|
@ -29,10 +29,14 @@ typedef enum node_id {
|
||||
NODE_REGISTER_OFFSET,
|
||||
NODE_PLUS_OR_MINUS,
|
||||
NODE_SECTION_DIRECTIVE,
|
||||
NODE_IMPORT_DIRECTIVE,
|
||||
NODE_EXPORT_DIRECTIVE,
|
||||
|
||||
// Validated primitives
|
||||
NODE_REGISTER,
|
||||
NODE_SECTION,
|
||||
NODE_IMPORT,
|
||||
NODE_EXPORT,
|
||||
|
||||
// Primitive nodes
|
||||
NODE_IDENTIFIER,
|
||||
|
@ -119,8 +119,24 @@ parse_result_t parse_section_directive(tokenlist_entry_t *current) {
|
||||
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) {
|
||||
parser_t parsers[] = {parse_dot, parse_section_directive, parse_newline,
|
||||
parser_t parsers[] = {parse_dot, parse_directive_options, parse_newline,
|
||||
nullptr};
|
||||
return parse_consecutive(current, NODE_DIRECTIVE, parsers);
|
||||
}
|
||||
|
@ -105,3 +105,19 @@ parse_result_t parse_section(tokenlist_entry_t *current) {
|
||||
return parse_token(current, TOKEN_IDENTIFIER, NODE_SECTION,
|
||||
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);
|
||||
}
|
||||
|
@ -27,5 +27,7 @@ parse_result_t parse_label_reference(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_import(tokenlist_entry_t *current);
|
||||
parse_result_t parse_export(tokenlist_entry_t *current);
|
||||
|
||||
#endif // INCLUDE_PARSER_PRIMITIVES_H_
|
||||
|
Loading…
x
Reference in New Issue
Block a user