namespace loader {
+Parser::Parser(const char *file, ParsedSource &product)
+: file(file)
+, in(file)
+, tok(in)
+, product(product) {
+ if (!in) {
+ throw Error(file, 0, "unable to read file");
+ }
+}
+
void Parser::Parse() {
while (tok.HasMore()) {
ParseStatement();
Tokenizer::Token t(GetToken());
tok.Putback(t);
if (BeginOfPropertyList(t)) {
- PropertyList *propertyList(ParsePropertyList());
- Definition *dfn(new Definition(typeName, identifier));
- dfn->SetValue(propertyList);
- return dfn;
+ auto_ptr<PropertyList> propertyList(ParsePropertyList());
+ auto_ptr<Definition> dfn(new Definition(typeName, identifier));
+ dfn->SetValue(propertyList.release());
+ product.AddDefinition(dfn.get());
+ return dfn.release();
} else if (BeginningOfLiteral(t)) {
- Literal *literal(ParseLiteral());
- Definition *dfn(new Definition(typeName, identifier));
- dfn->SetValue(literal);
- return dfn;
+ auto_ptr<Literal> literal(ParseLiteral());
+ auto_ptr<Definition> dfn(new Definition(typeName, identifier));
+ dfn->SetValue(literal.release());
+ product.AddDefinition(dfn.get());
+ return dfn.release();
} else {
return new Declaration(typeName, identifier);
}