diff --git a/build/scscript.js b/build/scscript.js index 349c3ed..36d3d43 100644 --- a/build/scscript.js +++ b/build/scscript.js @@ -1,7 +1,7 @@ (function(global) { "use strict"; -var sc = { VERSION: "0.0.24" }; +var sc = { VERSION: "0.0.25" }; // src/sc/sc.js (function(sc) { @@ -2547,20 +2547,30 @@ var sc = { VERSION: "0.0.24" }; // 4.6 Unary Expressions SCParser.prototype.parseUnaryExpression = function(node) { - var token, expr; + var token, expr, method; var marker; marker = Marker.create(this.lexer); - if (this.match("`")) { + switch (this.matchAny([ "`", "-" ])) { + case "`": token = this.lex(); - expr = this.parseUnaryExpression(); + expr = this.parseLeftHandSideExpression(); expr = Node.createUnaryExpression(token.value, expr); - } else { + break; + case "-": + token = this.lex(); + method = Node.createIdentifier("neg"); + method = marker.update().apply(method); + expr = this.parseLeftHandSideExpression(); + expr = Node.createCallExpression(expr, method, { list: [] }, "."); + break; + default: expr = this.parseLeftHandSideExpression(node); + break; } - return marker.update().apply(expr); + return marker.update().apply(expr, true); }; // 4.7 LeftHandSide Expressions diff --git a/package.json b/package.json index cdebc37..daaca4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scscript", - "version": "0.0.24", + "version": "0.0.25", "author": "Nao Yonamine ", "homepage": "http://mohayonao.github.io/SCScript/", "bugs": "https://github.com/mohayonao/SCScript/issues", diff --git a/src/sc/lang/compiler/parser.js b/src/sc/lang/compiler/parser.js index 304ca79..92f33a9 100644 --- a/src/sc/lang/compiler/parser.js +++ b/src/sc/lang/compiler/parser.js @@ -590,20 +590,30 @@ // 4.6 Unary Expressions SCParser.prototype.parseUnaryExpression = function(node) { - var token, expr; + var token, expr, method; var marker; marker = Marker.create(this.lexer); - if (this.match("`")) { + switch (this.matchAny([ "`", "-" ])) { + case "`": token = this.lex(); - expr = this.parseUnaryExpression(); + expr = this.parseLeftHandSideExpression(); expr = Node.createUnaryExpression(token.value, expr); - } else { + break; + case "-": + token = this.lex(); + method = Node.createIdentifier("neg"); + method = marker.update().apply(method); + expr = this.parseLeftHandSideExpression(); + expr = Node.createCallExpression(expr, method, { list: [] }, "."); + break; + default: expr = this.parseLeftHandSideExpression(node); + break; } - return marker.update().apply(expr); + return marker.update().apply(expr, true); }; // 4.7 LeftHandSide Expressions diff --git a/src/sc/lang/compiler/parser_test.js b/src/sc/lang/compiler/parser_test.js index 99d6c3a..0930110 100644 --- a/src/sc/lang/compiler/parser_test.js +++ b/src/sc/lang/compiler/parser_test.js @@ -211,7 +211,7 @@ error({ line: 1, column: 2, index: 1 }, Message.UnexpectedToken, "ILLEGAL"), ], "``": [ - error({ line: 1, column: 3, index: 2 }, Message.UnexpectedEOS), + error({ line: 1, column: 2, index: 1 }, Message.UnexpectedToken, "`"), ], "[1": [ error({ line: 1, column: 3, index: 2 }, Message.UnexpectedEOS), diff --git a/src/sc/lang/compiler/test-cases.js b/src/sc/lang/compiler/test-cases.js index 75b0fb2..52d0819 100644 --- a/src/sc/lang/compiler/test-cases.js +++ b/src/sc/lang/compiler/test-cases.js @@ -82,6 +82,53 @@ } } }, + "-a": { + compiled: [ + "SCScript(function($this, $SC) {", + " return $this.a().neg();", + "});", + ], + ast: { + type: Syntax.Program, + body: [ + { + type: Syntax.CallExpression, + stamp: ".", + callee: { + type: Syntax.Identifier, + name: "a", + range: [ 1, 2 ], + loc: { + start: { line: 1, column: 1 }, + end : { line: 1, column: 2 } + } + }, + method: { + type: Syntax.Identifier, + name: "neg", + range: [ 0, 1 ], + loc: { + start: { line: 1, column: 0 }, + end : { line: 1, column: 1 } + } + }, + args: { + list: [] + }, + range: [ 0, 2 ], + loc: { + start: { line: 1, column: 0 }, + end : { line: 1, column: 2 } + } + } + ], + range: [ 0, 2 ], + loc: { + start: { line: 1, column: 0 }, + end : { line: 1, column: 2 } + } + } + }, "nil": { compiled: [ "SCScript(function($this, $SC) {", @@ -3520,9 +3567,9 @@ type: Syntax.FunctionExpression, body: [], closed: true, - range: [ 5, 7 ], + range: [ 4, 7 ], loc: { - start: { line: 1, column: 5 }, + start: { line: 1, column: 4 }, end : { line: 1, column: 7 } } },