diff -r e9d804821c48 -r dc7d3b7a918c src/Parser.cpp --- a/src/Parser.cpp Wed Aug 01 22:32:59 2012 -0700 +++ b/src/Parser.cpp Sat Aug 04 17:51:43 2012 -0700 @@ -892,6 +892,11 @@ return NULL; break; + case TOK_STRUCT: + if ((statement = struct_()) == NULL) + return NULL; + break; + case TOK_IF: return if_(); @@ -914,6 +919,68 @@ } Statement * +Parser::struct_() +{ + expect(TOK_STRUCT); + + Local name(zone_, expectName()); + if (!name) + return NULL; + + SourcePosition pos = scanner_.begin(); + + if (BoundName *other = scope_->localLookup(name)) { + redeclarationError(other); + return NULL; + } + + NamedType *type; + if ((type = scope_->declareType(name, scanner_.begin())) == NULL) + return NULL; + + if (!expect(TOK_LBRACE)) + return NULL; + + FieldList *fields = new (pool_) FieldList(); + + while (!peek(TOK_RBRACE)) { + if (matchName(name.ref(), TOK_LABEL) && !name) + return NULL; + + BoundName *type = NULL; + if (name) { + if ((type = bindType(name)) == NULL) + return NULL; + } + + name = expectName(); + if (!name) + return NULL; + + SourcePosition pos = scanner_.begin(); + + ExpressionList *postDimensions = NULL; + if (peek(TOK_LBRACKET)) { + if ((postDimensions = dimensions()) == NULL) + return NULL; + } + + if (!matchSemicolon()) + return NULL; + + StructureStatement::Field *field = + new (pool_) StructureStatement::Field(pos, type, name, postDimensions); + if (!field || !fields->append(field)) + return NULL; + } + + if (!expect(TOK_RBRACE)) + return NULL; + + return new (pool_) StructureStatement(pos, type, fields); +} + +Statement * Parser::enum_() { expect(TOK_ENUM); @@ -1202,6 +1269,13 @@ return NULL; break; + case TOK_STRUCT: + if ((statement = struct_()) == NULL) + return NULL; + if (!matchSemicolon()) + return NULL; + break; + default: cc_.reportError(scanner_.begin(), Message_ExpectedGlobal); return NULL; @@ -1417,6 +1491,10 @@ node->expression()->accept(this); unindent(); } + void visit(StructureStatement *node) { + prefix(); + fprintf(fp_, "[ StructureStatement\n"); + } }; void