54 lines
1.8 KiB
C
54 lines
1.8 KiB
C
#include "parser.h"
|
|
#include "ast.h"
|
|
#include "lexer.h"
|
|
#include "parser_combinators.h"
|
|
#include "parser_primitives.h"
|
|
#include "parser_util.h"
|
|
#include "tokenlist.h"
|
|
|
|
parse_result_t parse_number(tokenlist_entry_t *current) {
|
|
parser_t parsers[] = {parse_octal, parse_decimal, parse_hexadecimal,
|
|
parse_binary, nullptr};
|
|
return parse_any(current, parsers);
|
|
}
|
|
|
|
parse_result_t parse_operand(tokenlist_entry_t *current) {
|
|
// FIXME: not the correct set of parsers
|
|
parser_t parsers[] = {parse_register, parse_number, nullptr};
|
|
return parse_any(current, parsers);
|
|
}
|
|
|
|
parse_result_t parse_operands(tokenlist_entry_t *current) {
|
|
return parse_list(current, NODE_OPERANDS, true, TOKEN_COMMA, parse_operand);
|
|
}
|
|
|
|
parse_result_t parse_label(tokenlist_entry_t *current) {
|
|
parser_t parsers[] = {parse_identifier, parse_colon, nullptr};
|
|
return parse_consecutive(current, NODE_LABEL, parsers);
|
|
}
|
|
|
|
parse_result_t parse_section_directive(tokenlist_entry_t *current) {
|
|
parser_t parsers[] = {parse_section, parse_identifier, nullptr};
|
|
return parse_consecutive(current, NODE_SECTION_DIRECTIVE, parsers);
|
|
}
|
|
|
|
parse_result_t parse_directive(tokenlist_entry_t *current) {
|
|
parser_t parsers[] = {parse_dot, parse_section_directive, nullptr};
|
|
return parse_consecutive(current, NODE_DIRECTIVE, parsers);
|
|
}
|
|
|
|
parse_result_t parse_instruction(tokenlist_entry_t *current) {
|
|
parser_t parsers[] = {parse_identifier, parse_operands, nullptr};
|
|
return parse_consecutive(current, NODE_INSTRUCTION, parsers);
|
|
}
|
|
|
|
parse_result_t parse_statement(tokenlist_entry_t *current) {
|
|
parser_t parsers[] = {parse_label, parse_directive, parse_instruction,
|
|
nullptr};
|
|
return parse_any(current, parsers);
|
|
}
|
|
|
|
parse_result_t parse(tokenlist_entry_t *current) {
|
|
return parse_many(current, NODE_PROGRAM, true, parse_statement);
|
|
}
|