Göran Krampe 13 years ago
parent
commit
8707fcfd4d
5 changed files with 199 additions and 23 deletions
  1. 22 0
      js/Kernel.deploy.js
  2. 32 0
      js/Kernel.js
  3. 130 22
      js/parser.js
  4. 7 1
      js/parser.pegjs
  5. 8 0
      st/Kernel.st

+ 22 - 0
js/Kernel.deploy.js

@@ -2044,6 +2044,28 @@ return self;}
 }),
 smalltalk.Number);
 
+smalltalk.addMethod(
+'_sqrt',
+smalltalk.method({
+selector: 'sqrt',
+fn: function (){
+var self=this;
+return Math.sqrt(self);
+return self;}
+}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+'_squared',
+smalltalk.method({
+selector: 'squared',
+fn: function (){
+var self=this;
+return self * self;
+return self;}
+}),
+smalltalk.Number);
+
 
 smalltalk.addMethod(
 '_pi',

+ 32 - 0
js/Kernel.js

@@ -2910,6 +2910,38 @@ referencedClasses: []
 }),
 smalltalk.Number);
 
+smalltalk.addMethod(
+unescape('_sqrt'),
+smalltalk.method({
+selector: unescape('sqrt'),
+category: 'arithmetic',
+fn: function (){
+var self=this;
+return Math.sqrt(self);
+return self;},
+args: [],
+source: unescape('sqrt%0A%09%3Creturn%20Math.sqrt%28self%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Number);
+
+smalltalk.addMethod(
+unescape('_squared'),
+smalltalk.method({
+selector: unescape('squared'),
+category: 'arithmetic',
+fn: function (){
+var self=this;
+return self * self;
+return self;},
+args: [],
+source: unescape('squared%0A%09%5Eself%20*%20self'),
+messageSends: [unescape("*")],
+referencedClasses: []
+}),
+smalltalk.Number);
+
 
 smalltalk.addMethod(
 unescape('_pi'),

+ 130 - 22
js/parser.js

@@ -42,6 +42,7 @@ smalltalk.parser = (function(){
         "method": parse_method,
         "number": parse_number,
         "operand": parse_operand,
+        "pseudoVariable": parse_pseudoVariable,
         "reference": parse_reference,
         "ret": parse_ret,
         "separator": parse_separator,
@@ -1258,8 +1259,8 @@ smalltalk.parser = (function(){
         return result0;
       }
       
-      function parse_literal() {
-        var cacheKey = 'literal@' + pos;
+      function parse_pseudoVariable() {
+        var cacheKey = 'pseudoVariable@' + pos;
         var cachedResult = cache[cacheKey];
         if (cachedResult) {
           pos = cachedResult.nextPos;
@@ -1267,35 +1268,142 @@ smalltalk.parser = (function(){
         }
         
         
-        var result7 = parse_number();
-        if (result7 !== null) {
-          var result0 = result7;
+        var savedPos0 = pos;
+        var savedPos3 = pos;
+        if (input.substr(pos, 4) === "true") {
+          var result10 = "true";
+          pos += 4;
         } else {
-          var result6 = parse_literalArray();
+          var result10 = null;
+          if (reportMatchFailures) {
+            matchFailed("\"true\"");
+          }
+        }
+        var result11 = result10 !== null
+          ? (function() {return true})()
+          : null;
+        if (result11 !== null) {
+          var result9 = result11;
+        } else {
+          var result9 = null;
+          pos = savedPos3;
+        }
+        if (result9 !== null) {
+          var result1 = result9;
+        } else {
+          var savedPos2 = pos;
+          if (input.substr(pos, 5) === "false") {
+            var result7 = "false";
+            pos += 5;
+          } else {
+            var result7 = null;
+            if (reportMatchFailures) {
+              matchFailed("\"false\"");
+            }
+          }
+          var result8 = result7 !== null
+            ? (function() {return false})()
+            : null;
+          if (result8 !== null) {
+            var result6 = result8;
+          } else {
+            var result6 = null;
+            pos = savedPos2;
+          }
           if (result6 !== null) {
-            var result0 = result6;
+            var result1 = result6;
           } else {
-            var result5 = parse_dynamicDictionary();
+            var savedPos1 = pos;
+            if (input.substr(pos, 3) === "nil") {
+              var result4 = "nil";
+              pos += 3;
+            } else {
+              var result4 = null;
+              if (reportMatchFailures) {
+                matchFailed("\"nil\"");
+              }
+            }
+            var result5 = result4 !== null
+              ? (function() {return nil})()
+              : null;
             if (result5 !== null) {
-              var result0 = result5;
+              var result3 = result5;
+            } else {
+              var result3 = null;
+              pos = savedPos1;
+            }
+            if (result3 !== null) {
+              var result1 = result3;
             } else {
-              var result4 = parse_dynamicArray();
-              if (result4 !== null) {
-                var result0 = result4;
+              var result1 = null;;
+            };
+          };
+        }
+        var result2 = result1 !== null
+          ? (function(val) {
+          					return smalltalk.ValueNode._new()
+          						._value_(val)
+          				})(result1)
+          : null;
+        if (result2 !== null) {
+          var result0 = result2;
+        } else {
+          var result0 = null;
+          pos = savedPos0;
+        }
+        
+        
+        
+        cache[cacheKey] = {
+          nextPos: pos,
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_literal() {
+        var cacheKey = 'literal@' + pos;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = cachedResult.nextPos;
+          return cachedResult.result;
+        }
+        
+        
+        var result8 = parse_pseudoVariable();
+        if (result8 !== null) {
+          var result0 = result8;
+        } else {
+          var result7 = parse_number();
+          if (result7 !== null) {
+            var result0 = result7;
+          } else {
+            var result6 = parse_literalArray();
+            if (result6 !== null) {
+              var result0 = result6;
+            } else {
+              var result5 = parse_dynamicDictionary();
+              if (result5 !== null) {
+                var result0 = result5;
               } else {
-                var result3 = parse_string();
-                if (result3 !== null) {
-                  var result0 = result3;
+                var result4 = parse_dynamicArray();
+                if (result4 !== null) {
+                  var result0 = result4;
                 } else {
-                  var result2 = parse_symbol();
-                  if (result2 !== null) {
-                    var result0 = result2;
+                  var result3 = parse_string();
+                  if (result3 !== null) {
+                    var result0 = result3;
                   } else {
-                    var result1 = parse_block();
-                    if (result1 !== null) {
-                      var result0 = result1;
+                    var result2 = parse_symbol();
+                    if (result2 !== null) {
+                      var result0 = result2;
                     } else {
-                      var result0 = null;;
+                      var result1 = parse_block();
+                      if (result1 !== null) {
+                        var result0 = result1;
+                      } else {
+                        var result0 = null;;
+                      };
                     };
                   };
                 };

+ 7 - 1
js/parser.pegjs

@@ -33,7 +33,13 @@ dynamicDictionary = "#{" ws expressions: expressions? ws "}" {
 	       	  return smalltalk.DynamicDictionaryNode._new()
 		        ._nodes_(expressions)
 		  }
-literal        = number / literalArray / dynamicDictionary / dynamicArray / string / symbol / block
+pseudoVariable = val:('true' {return true} 
+				/ 'false' {return false}
+				/ 'nil' {return nil} {
+					return smalltalk.ValueNode._new()
+						._value_(val)
+				}
+literal        = pseudoVariable / number / literalArray / dynamicDictionary / dynamicArray / string / symbol / block
 
 
 variable       = identifier:identifier {

+ 8 - 0
st/Kernel.st

@@ -842,6 +842,14 @@ negated
 
 \\ aNumber
 	<return self % aNumber>
+!
+
+sqrt
+	<return Math.sqrt(self)>
+!
+
+squared
+	^self * self
 ! !
 
 !Number methodsFor: 'comparing'!