From 5a54699f18e3ac52fe18d854f6d57be6795ed8e5 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 10 Apr 2015 16:48:43 +0200 Subject: Replace hand-written parser by one generated by solar itself :D --- src/parser.cpp | 302 --------------------------------------------------------- 1 file changed, 302 deletions(-) delete mode 100644 src/parser.cpp (limited to 'src/parser.cpp') diff --git a/src/parser.cpp b/src/parser.cpp deleted file mode 100644 index ce408eb..0000000 --- a/src/parser.cpp +++ /dev/null @@ -1,302 +0,0 @@ -/* - Copyright (c) 2015, Matthias Schiffer - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - - -#include "parser.hpp" - -#include - - -namespace solar { - -enum parser_state { - STATE_INIT, - STATE_RULE_BAR, - STATE_RULE_EQUAL, - STATE_RULE, - STATE_RULE_VAR_PRE, - STATE_RULE_VAR, - STATE_RULE_VAR_POST, - STATE_TYPE, - STATE_TYPE_NONTERM, - STATE_TYPE_TERM, - STATE_TYPE_TERM_BLOCK, - STATE_HEADER, - STATE_SOURCE, - STATE_EXTRA_ARG, - STATE_EXTRA_ARG_NAME, -}; - -struct parser { - parser_state state; -}; - -parser_t * parser_alloc(void) { - parser_t *parser = (parser_t *)std::malloc(sizeof(parser_t)); - parser->state = STATE_INIT; - - return parser; -} - -int parser_push(parser_t *parser, int token, const parser_value_t *value, parser_state_t *state) { - switch (parser->state) { - case STATE_INIT: - switch (token) { - case TOK_SYMBOL_LC: - parser->state = STATE_RULE_BAR; - state->new_rule(*value->str); - delete value->str; - return 1; - - case TOK_TYPE: - parser->state = STATE_TYPE; - return 1; - - case TOK_SOURCE: - parser->state = STATE_SOURCE; - return 1; - - case TOK_HEADER: - parser->state = STATE_HEADER; - return 1; - - case TOK_EXTRA_ARG: - parser->state = STATE_EXTRA_ARG; - return 1; - - case 0: - return 0; - } - - break; - - case STATE_RULE_BAR: - if (token == '|') { - parser->state = STATE_RULE_EQUAL; - return 1; - } - - break; - - case STATE_RULE_EQUAL: - if (token == '=') { - parser->state = STATE_RULE; - return 1; - } - - break; - - case STATE_RULE: - switch (token) { - case TOK_SYMBOL_LC: - state->add_rule_nonterminal(*value->str); - delete value->str; - return 1; - - case TOK_SYMBOL_UC: - state->add_rule_terminal(*value->str); - delete value->str; - return 1; - - case TOK_CHAR: - state->add_rule_terminal(value->number); - return 1; - - case TOK_BLOCK: - state->add_rule(*value->str); - delete value->str; - parser->state = STATE_INIT; - return 1; - - case '(': - parser->state = STATE_RULE_VAR_PRE; - return 1; - - case ';': - state->add_rule(); - parser->state = STATE_INIT; - return 1; - } - - break; - - case STATE_RULE_VAR_PRE: - switch (token) { - case TOK_SYMBOL: - case TOK_SYMBOL_UC: - case TOK_SYMBOL_LC: - state->add_rule_var(*value->str); - delete value->str; - parser->state = STATE_RULE_VAR; - return 1; - } - - break; - - case STATE_RULE_VAR: - if (token == ')') { - parser->state = STATE_RULE; - return 1; - } - - break; - - case STATE_RULE_VAR_POST: - switch (token) { - case TOK_SYMBOL_LC: - state->add_rule_nonterminal(*value->str); - delete value->str; - return 1; - - case TOK_SYMBOL_UC: - state->add_rule_terminal(*value->str); - delete value->str; - return 1; - - case TOK_CHAR: - state->add_rule_terminal(value->number); - return 1; - - case TOK_BLOCK: - state->add_rule(*value->str); - delete value->str; - parser->state = STATE_INIT; - return 1; - - case ';': - state->add_rule(); - parser->state = STATE_INIT; - return 1; - } - - break; - - case STATE_TYPE: - switch (token) { - case TOK_SYMBOL_LC: - state->add_type_nonterminal(*value->str); - delete value->str; - parser->state = STATE_TYPE_NONTERM; - return 1; - - case TOK_SYMBOL_UC: - state->add_type_terminal(*value->str); - delete value->str; - parser->state = STATE_TYPE_TERM; - return 1; - } - - break; - - case STATE_TYPE_NONTERM: - if (token == TOK_BLOCK) { - state->set_type_nonterminal(*value->str); - delete value->str; - parser->state = STATE_INIT; - return 1; - } - - break; - - case STATE_TYPE_TERM: - if (token == TOK_BLOCK) { - state->set_type_terminal(*value->str); - delete value->str; - parser->state = STATE_TYPE_TERM_BLOCK; - return 1; - } - - break; - - case STATE_TYPE_TERM_BLOCK: - switch (token) { - case TOK_SYMBOL: - case TOK_SYMBOL_UC: - case TOK_SYMBOL_LC: - state->set_type_terminal_name(*value->str); - delete value->str; - parser->state = STATE_INIT; - return 1; - } - break; - - case STATE_HEADER: - if (token == TOK_BLOCK) { - state->set_header_block(*value->str); - delete value->str; - parser->state = STATE_INIT; - return 1; - } - - break; - - case STATE_SOURCE: - if (token == TOK_BLOCK) { - state->set_source_block(*value->str); - delete value->str; - parser->state = STATE_INIT; - return 1; - } - - break; - - case STATE_EXTRA_ARG: - if (token == TOK_BLOCK) { - state->add_extra_arg(*value->str); - delete value->str; - parser->state = STATE_EXTRA_ARG_NAME; - return 1; - } - break; - - case STATE_EXTRA_ARG_NAME: - switch (token) { - case TOK_SYMBOL: - case TOK_SYMBOL_UC: - case TOK_SYMBOL_LC: - state->set_extra_arg_name(*value->str); - delete value->str; - parser->state = STATE_INIT; - return 1; - } - } - - switch (token) { - case TOK_SYMBOL: - case TOK_SYMBOL_UC: - case TOK_SYMBOL_LC: - case TOK_CHAR: - case TOK_BLOCK: - delete value->str;; - } - - return -1; -} - -void parser_free(parser_t *parser) { - std::free(parser); -} - -} -- cgit v1.2.3