[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