unary-new: built parser and new => now works

This commit is contained in:
satyr
2010-09-27 02:11:47 +09:00
parent db531495b8
commit e188b9ff41
6 changed files with 127 additions and 130 deletions

View File

@@ -37,7 +37,7 @@
return new LiteralNode($1); return new LiteralNode($1);
}) })
], ],
Expression: [o("Value"), o("Code"), o("Operation"), o("Assign"), o("If"), o("Try"), o("While"), o("For"), o("Switch"), o("Extends"), o("Class"), o("Existence"), o("Comment")], Expression: [o("Value"), o("Invocation"), o("Code"), o("Operation"), o("Assign"), o("If"), o("Try"), o("While"), o("For"), o("Switch"), o("Extends"), o("Class"), o("Existence"), o("Comment")],
Block: [ Block: [
o("INDENT Body OUTDENT", function() { o("INDENT Body OUTDENT", function() {
return $2; return $2;

View File

@@ -1125,7 +1125,7 @@
code = this.body.expressions.length ? ("\n" + (this.body.compileWithDeclarations(o)) + "\n") : ''; code = this.body.expressions.length ? ("\n" + (this.body.compileWithDeclarations(o)) + "\n") : '';
func = ("function(" + (params.join(', ')) + ") {" + (code) + (code && this.tab) + "}"); func = ("function(" + (params.join(', ')) + ") {" + (code) + (code && this.tab) + "}");
if (this.bound) { if (this.bound) {
return ("" + (utility('bind')) + "(" + (func) + ", " + (this.context) + ")"); return ("(" + (utility('bind')) + "(" + (func) + ", " + (this.context) + "))");
} }
return top ? ("(" + (func) + ")") : func; return top ? ("(" + (func) + ")") : func;
}; };

File diff suppressed because one or more lines are too long

View File

@@ -88,6 +88,7 @@ grammar =
# them somewhat circular. # them somewhat circular.
Expression: [ Expression: [
o "Value" o "Value"
o "Invocation"
o "Code" o "Code"
o "Operation" o "Operation"
o "Assign" o "Assign"

View File

@@ -947,7 +947,7 @@ exports.CodeNode = class CodeNode extends BaseNode
(o.scope.parameter(param)) for param in params (o.scope.parameter(param)) for param in params
code = if @body.expressions.length then "\n#{ @body.compileWithDeclarations(o) }\n" else '' code = if @body.expressions.length then "\n#{ @body.compileWithDeclarations(o) }\n" else ''
func = "function(#{ params.join(', ') }) {#{code}#{ code and @tab }}" func = "function(#{ params.join(', ') }) {#{code}#{ code and @tab }}"
return "#{utility('bind')}(#{func}, #{@context})" if @bound return "(#{utility 'bind'}(#{func}, #{@context}))" if @bound
if top then "(#{func})" else func if top then "(#{func})" else func
topSensitive: -> topSensitive: ->

View File

@@ -257,4 +257,6 @@ new get() args...
ok new Date().constructor is Date ok new Date().constructor is Date
#717: `new` works against bare function #717: `new` works against bare function
new -> ok @ me = this
new -> ok this isnt me
new => ok this is me