Node* analyze_line(String* str) { Node* node; st_token_buf = NULL; lexer_init(str); parser_init(); node = parse_acceptable(); switch ( parser_state() ) { case PS_ACCEPT: if ( node == NULL ) { fprintf(stderr, "parse error\n"); } break; case PS_ERROR: parser_print_error(); if ( node != NULL ) { delete_tree(node); node = NULL; } break; } if ( st_token_buf != NULL) { delete_token(st_token_buf); st_token_buf = NULL; } return node; }
parser_state unparsed_child::unparsed_child_parser(const char * name, size_t len, void * data) { if(!name) return parser_state(0, 0, 0); unparsed_child * self = static_cast<unparsed_child*>(data); auto & children = self->holder_->children_; size_t idx = children.size(); children.push_back(unparsed_child(*self->holder_, name, len)); if(self->tail_) children[self->tail_].next_ = idx; else self->child_ = idx; self->tail_ = idx; return parser_state(&unparsed_child_parser, &unparsed_parse_value, &children[idx]); }
parser_state add(const char * name, size_t len) { size_t idx = children_.size(); children_.push_back(unparsed_child(*this, name, len)); if(tail_ != idx) children_[tail_].next(idx); tail_ = idx; return parser_state(&unparsed_child::unparsed_child_parser, &unparsed_child::unparsed_parse_value, &children_[idx]); }