Bladeren bron

Parser now forbids mixing JS statements and Smalltalk code.

Nicolas Petton 12 jaren geleden
bovenliggende
commit
0bd11592e5
2 gewijzigde bestanden met toevoegingen van 29 en 5 verwijderingen
  1. 23 3
      js/parser.js
  2. 6 2
      js/parser.pegjs

+ 23 - 3
js/parser.js

@@ -73,6 +73,7 @@ smalltalk.parser = (function(){
         "subexpression": parse_subexpression,
         "statements": parse_statements,
         "sequence": parse_sequence,
+        "stSequence": parse_stSequence,
         "block": parse_block,
         "operand": parse_operand,
         "unaryMessage": parse_unaryMessage,
@@ -2041,9 +2042,6 @@ smalltalk.parser = (function(){
             result0 = parse_keywordSend();
             if (result0 === null) {
               result0 = parse_binarySend();
-              if (result0 === null) {
-                result0 = parse_jsStatement();
-              }
             }
           }
         }
@@ -2863,6 +2861,28 @@ smalltalk.parser = (function(){
           return cachedResult.result;
         }
         
+        var result0;
+        
+        result0 = parse_jsStatement();
+        if (result0 === null) {
+          result0 = parse_stSequence();
+        }
+        
+        cache[cacheKey] = {
+          nextPos: clone(pos),
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_stSequence() {
+        var cacheKey = "stSequence@" + pos.offset;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = clone(cachedResult.nextPos);
+          return cachedResult.result;
+        }
+        
         var result0, result1, result2, result3;
         var pos0, pos1;
         

+ 6 - 2
js/parser.pegjs

@@ -78,7 +78,7 @@ keywordPattern = pairs:(ws key:keyword ws arg:identifier {return {key:key, arg:
 binaryPattern  = ws selector:binarySelector ws arg:identifier {return [selector, [arg]]}
 unaryPattern   = ws selector:unarySelector {return [selector, []]}
 
-expression     = assignment / cascade / keywordSend / binarySend / jsStatement
+expression     = assignment / cascade / keywordSend / binarySend
 
 expressionList = ws "." ws expression:expression {return expression}
 expressions    = first:expression others:expressionList* {
@@ -116,12 +116,16 @@ statements     = ret:ret [.]* {return [ret]}
                        return expressions || []
                    }
 
-sequence       = temps:temps? ws statements:statements? ws {
+sequence       = jsSequence / stSequence
+
+stSequence     = temps:temps? ws statements:statements? ws {
                      return smalltalk.SequenceNode._new()
                             ._temps_(temps || [])
                             ._nodes_(statements || [])
                  }
 
+jsSequence     = jsStatement
+
 block          = '[' ws params:blockParamList? ws sequence:sequence? ws ']' {
                      return smalltalk.BlockNode._new()
                             ._parameters_(params || [])