diff -r f43e399ab622 -r 633176823669 jitcraft/Parser.cpp --- a/jitcraft/Parser.cpp Tue Jun 26 00:58:55 2012 -0700 +++ b/jitcraft/Parser.cpp Wed Jun 27 02:21:56 2012 -0700 @@ -68,6 +68,25 @@ return proxy; } +bool +Parser::matchName(Name **name, TokenKind kind) +{ + assert(kind == TOK_NAME || kind == TOK_LABEL); + *name = NULL; + if (!match(kind)) + return false; + *name = strings_.add(scanner_.literal()); + return true; +} + +Name * +Parser::expectName() +{ + if (!expect(TOK_NAME)) + return NULL; + return strings_.add(scanner_.literal()); +} + Expression * Parser::primitive() { @@ -79,11 +98,18 @@ return bind(name); } + case TOK_FLOAT_LITERAL: + { + scanner_.scan(); + double value = Scanner::ParseDouble(scanner_.literal()); + return new (pool_) FloatLiteral(value); + } + case TOK_INTEGER_LITERAL: { scanner_.scan(); int value = atoi(scanner_.literal()); - return new (pool_) IntegerLiteralExpression(value); + return new (pool_) IntegerLiteral(value); } default: @@ -326,11 +352,13 @@ if (!expect(TOK_NEW)) return NULL; - // Get the name. - if (!expect(TOK_NAME)) + Name *tag; + if (matchName(&tag, TOK_LABEL) && !tag) return NULL; - - Name *name = strings_.add(scanner_.literal()); + + Name *name = expectName(); + if (!name) + return NULL; ExpressionList *postDimensions = NULL; if (scanner_.peek() == TOK_LBRACKET) { @@ -359,7 +387,7 @@ } Variable *var = scope_->declareVariable(name); - VariableDeclaration *decl = new (pool_) VariableDeclaration(var, postDimensions, expr); + VariableDeclaration *decl = new (pool_) VariableDeclaration(var, tag, postDimensions, expr); return decl; } @@ -549,10 +577,7 @@ if (scanner_.peek() == TOK_RBRACE) break; - if (!expect(TOK_NAME)) - return NULL; - - Name *name = strings_.add(scanner_.literal()); + Name *name = expectName(); if (!name) return NULL; @@ -582,9 +607,7 @@ Statement * Parser::function() { - expect(TOK_NAME); - - Name *name = strings_.add(scanner_.literal()); + Name *name = expectName(); if (!name) return NULL; @@ -607,10 +630,7 @@ return NULL; if (!match(TOK_RPAREN)) { while (true) { - if (!expect(TOK_NAME)) - return NULL; - - Name *name = strings_.add(scanner_.literal()); + Name *name = expectName(); if (!name) return NULL; @@ -783,9 +803,13 @@ node->initialization()->accept(this); unindent(); } - void visit(IntegerLiteralExpression *node) { + void visit(IntegerLiteral *node) { prefix(); - fprintf(fp_, "[ LiteralExpression (%d)\n", node->value()); + fprintf(fp_, "[ IntegerLiteral (%d)\n", node->value()); + } + void visit(FloatLiteral *node) { + prefix(); + fprintf(fp_, "[ FloatLiteral (%f)\n", node->value()); } void visit(IfStatement *node) { prefix();