[pypy-svn] r42653 - in pypy/dist/pypy/lang/js: . test

santagada at codespeak.net santagada at codespeak.net
Fri May 4 00:37:11 CEST 2007


Author: santagada
Date: Fri May  4 00:37:10 2007
New Revision: 42653

Modified:
   pypy/dist/pypy/lang/js/jsgrammar.txt
   pypy/dist/pypy/lang/js/newparser.py
   pypy/dist/pypy/lang/js/test/test_new_parser.py
Log:
lots of new statement tests and a function declaration tests

Modified: pypy/dist/pypy/lang/js/jsgrammar.txt
==============================================================================
--- pypy/dist/pypy/lang/js/jsgrammar.txt	(original)
+++ pypy/dist/pypy/lang/js/jsgrammar.txt	Fri May  4 00:37:10 2007
@@ -5,31 +5,31 @@
 program : sourceelements EOF
         ;
 
-sourceelements  : sourceelement sourceelements
+sourceelements  : sourceelement >sourceelements<
                 | sourceelement
                 ;
 
-sourceelement   : functiondeclaration
-                | statement
+sourceelement   : <functiondeclaration>
+                | <statement>
                 ;
 
-statement   : <block>
+statement   : <block> [";"]?
             | <variablestatement> [";"]
             | <emptystatement>
             | <expressionstatement> [";"]
-            | <ifstatement> [";"]?
-            | <iterationstatement> [";"]
+            | <ifstatement>
+            | <iterationstatement>
             | <continuestatement> [";"]
             | <breakstatement> [";"]
             | <returnstatement> [";"]
             | <withstatement> [";"]
-            | <labelledstatement> [";"]
+            | <labelledstatement>
             | <switchstatement> 
             | <throwstatement> [";"]
             | <trystatement> [";"]
             ;
 
-block   : "{" statementlist? "}"
+block   : ["{"] statementlist? ["}"]
         ;
 
 statementlist   : statement >statementlist<
@@ -49,7 +49,7 @@
 initialiser : ["="] assignmentexpression
             ;
 
-emptystatement  : ";"
+emptystatement  : [";"]
                 ;
 
 expressionstatement : expression
@@ -59,7 +59,8 @@
             | ["if"] ["("] expression [")"] statement
             ;
 
-iterationstatement  : "do" statement ["while"] ["("] expression [")"]
+iterationstatement  
+    : "do" statement ["while"] ["("] expression [")"]
     | "while" ["("] expression [")"] statement 
     | "for" ["("]expressionnoin? [";"] expression? [";"] expression? [")"] statement 
     | "for" ["("] ["var"] variabledeclarationlistnoin [";"] expression? [";"] expression? [")"] statement 
@@ -172,8 +173,8 @@
 elision : ","+
         ;
 
-objectliteral   : "{" "}" 
-                | "{" propertynameandvaluelist "}"
+objectliteral   : ["{"] ["}"] 
+                | ["{"] propertynameandvaluelist ["}"]
                 ;
 
 propertynameandvaluelist    : hpropertynameandvaluelist* propertyname ":" assignmentexpression
@@ -187,17 +188,17 @@
                 | <numericliteral>
                 ; 
 
-functiondeclaration : "function" identifier "(" formalparameterlist? ")" "{" functionbody "}"
+functiondeclaration : ["function"] identifier ["("] formalparameterlist? [")"] ["{"] functionbody ["}"]
                     ;
 
-functionexpression  : "function" identifier? "(" formalparameterlist? ")" "{" functionbody "}"
+functionexpression  : ["function"] identifier? ["("] formalparameterlist? [")"] ["{"] functionbody ["}"]
                     ;
 
 formalparameterlist : identifier [","] >formalparameterlist<
                     | identifier
                     ;
 
-functionbody    : sourceelements
+functionbody    : <sourceelements>
                 ;
 
 begmemberexpression : <primaryexpression>
@@ -220,11 +221,11 @@
                 | memberexpression arguments
                 ;
 
-arguments   : "(" ")" 
-            | "(" argumentlist ")"
+arguments   : ["("] [")"] 
+            | "(" <argumentlist> ")"
             ;
  
-argumentlist    : assignmentexpression "," >argumentlist<
+argumentlist    : assignmentexpression [","] >argumentlist<
                 | assignmentexpression;
 
 lefthandsideexpression  : <callexpression>

Modified: pypy/dist/pypy/lang/js/newparser.py
==============================================================================
--- pypy/dist/pypy/lang/js/newparser.py	(original)
+++ pypy/dist/pypy/lang/js/newparser.py	Fri May  4 00:37:10 2007
@@ -15,7 +15,7 @@
     newrules = [Rule("hacked_first_symbol", [[start, "EOF"]])] + rules
     return newrules
 
-parse = make_parse_function(regexs, setstartrule(rules, start="statement"), eof=True)
+parse = make_parse_function(regexs, rules, eof=True)
 #parse = make_parse_function(regexs, rules)
 
 print rules[2].nonterminal

Modified: pypy/dist/pypy/lang/js/test/test_new_parser.py
==============================================================================
--- pypy/dist/pypy/lang/js/test/test_new_parser.py	(original)
+++ pypy/dist/pypy/lang/js/test/test_new_parser.py	Fri May  4 00:37:10 2007
@@ -191,17 +191,48 @@
         assert r['variablestatement'] == 1
     
     def test_empty(self):
+        self.parse(";")
         for i in range(1,10):
             r = self.parse_count('{%s}'%(';'*i))
             assert r['emptystatement'] == i
     
     def test_if(self):
-        r = self.parse_count("if(x)return;;")
+        r = self.parse_count("if(x)return;")
         assert r['ifstatement'] == 1
         assert r.get('emptystatement', 0) == 0
         r = self.parse_count("if(x)if(i)return;")
         assert r['ifstatement'] == 2
         r = self.parse_count("if(x)return;else return;")
         assert r['ifstatement'] == 1
+
+    def test_iteration(self):
+        self.parse('for(;;);')
+        self.parse('for(x;;);')
+        self.parse('for(;x>0;);')
+        self.parse('for(;;x++);')
+        self.parse('for(var x = 1;;);')
+        self.parse('for(x in z);')
+        self.parse('for(var x in z);')
+        self.parse('while(1);')
+        self.parse('do ; while(1)')
+    
+    def test_continue_return_break(self):
+        self.parse('return;')
+        self.parse('return x+y;')
+        self.parse('break;')
+        self.parse('continue;')
+        self.parse('break label;')
+        self.parse('continue label;')
+    
+    def test_labeled(self):
+        self.parse('label: x+y;')
+
+class TestFunctionDeclaration(BaseGrammarTest):
+    def setup_class(cls):
+        cls.parse = parse_func('functiondeclaration')
+    
+    def test_simpledecl(self):
+        self.parse('function x () {;}')
+        self.parse('function z (a,b,c,d,e) {;}')
     
         



More information about the Pypy-commit mailing list