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); }