コード例 #1
0
ファイル: analyzer.c プロジェクト: notozeki/mysh
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;
}
コード例 #2
0
ファイル: node.cpp プロジェクト: go4and/lib
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]);
    
}
コード例 #3
0
ファイル: node.cpp プロジェクト: go4and/lib
 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]);
 }