Example #1
0
void Parser::parse_seg(ptr<Token> token) {
    SegmentToken *seg = static_cast<SegmentToken*>(token.get());
    Language *lang = Language::get(seg->name()->text());

    if (!lang) {
        log_error(token->loc(), "unknown language name '%p'.", seg->name()->text());
    }

    bool first = true;
    while (1) {
        token = cur(); 
        eat();
        if (token->is_eol()) {
            break;
        }

        ptr<Token> name = token;

        if (first) {
            if (!token->is_iden()) {
                log_expect(token->loc(), "identifier or eol");
            }
            first = false;
        }
        else {
            if (*token != ',') {
                log_expect(token->loc(), "',' or eol");
            }
            token = cur();
            eat();
            if (!token->is_iden()) {
                log_expect(token->loc(), "identifier or eol");
            }
        }
        token = cur();
        eat();
        if (*token != '=') {
            log_expect(token->loc(), "'='");
        }
        ptr<Token> value = cur();
        eat();
        if (!token_is_constant(value)) {
            log_expect(token->loc(), "constant");
        }
        lang->option(name->text(), value);
    }
    parse_raw(_input.is_root() ? &lang->head() : nullptr);
}