コード例 #1
0
    def test18parseIfStatement(self):
        parser = Parser()

        parser.src = 'if (1) ; else var a=1;'

        root = parser.buildAST()

        self.assertEqual(len(root.statements),1)
        self.assertEqual(type(root.statements[0]), AST.IfStatement)
        self.assertEqual(root.statements[0].condition.value, '1')
        self.assertEqual(type(root.statements[0].thenStatement), AST.EmptyStatement)
        self.assertEqual(type(root.statements[0].elseStatement), AST.VariableStatement)

        parser.src = 'if (x==1) {}'

        root = parser.buildAST()

        self.assertEqual(len(root.statements),1)
        self.assertEqual(type(root.statements[0]), AST.IfStatement)
        self.assertEqual(type(root.statements[0].condition), AST.BinaryExpression)
        self.assertEqual(root.statements[0].condition.op, '==')
        self.assertEqual(type(root.statements[0].thenStatement), AST.Block)
        self.assertEqual(type(root.statements[0].elseStatement), AST.EmptyStatement)

        parser.src = 'if (x==1) if (y==2) {;} else {;;} else {;;;}'

        node = parser.buildAST().statements[0]

        self.assertEqual(type(node.thenStatement), AST.IfStatement)
        self.assertEqual(len(node.elseStatement.statements), 3)
        self.assertEqual(len(node.thenStatement.thenStatement.statements), 1)
        self.assertEqual(len(node.thenStatement.elseStatement.statements), 2)
コード例 #2
0
    def test06ParseBlockStatementInFunctionBody(self):
        parser = Parser()
        parser.src = 'function a(){ {} }'

        parser.buildAST()
        node = parser.ASTRoot.statements[0]
        self.assertEqual(type(node.statements[0]), AST.Block)
コード例 #3
0
    def test01EmptyProgram(self):
        parser = Parser()
        parser.src = ''
        parser.buildAST()

        self.assertIsNotNone(parser.ASTRoot, 'creation of tree root')
        self.assertEqual(type(parser.ASTRoot), AST.ProgramNode)
コード例 #4
0
    def test02EmptyFunctionDeclaration(self):
        parser = Parser()
        parser.src = 'function name1() {}'
        parser.buildAST()

        self.assertEqual(len(parser.ASTRoot.statements),1)
        self.assertEqual(type(parser.ASTRoot.statements[0]), AST.FunctionDeclaration)
        self.assertEqual(parser.ASTRoot.statements[0].name, 'name1')
        self.assertEqual(parser.ASTRoot.statements[0].parent, parser.ASTRoot)
コード例 #5
0
    def test03ArgumentsFunctionDeclaration(self):
        parser = Parser()
        parser.src = 'function asd(aa,a23) {}'
        parser.buildAST()

        node = parser.ASTRoot.statements[0]
        self.assertEqual(len(node.arguments),2)
        self.assertEqual(node.arguments[0],'aa')
        self.assertEqual(node.arguments[1],'a23')
コード例 #6
0
    def test17parseEmptyExpression(self):
        parser = Parser()

        parser.src = ';;'

        parser.buildAST()

        self.assertEqual(len(parser.ASTRoot.statements),2)
        self.assertEqual(type(parser.ASTRoot.statements[0]),AST.EmptyStatement)
        self.assertEqual(type(parser.ASTRoot.statements[1]),AST.EmptyStatement)
コード例 #7
0
    def test04FunctionDeclarationAsBodyOfFunctionDeclaration(self):
        parser = Parser()
        parser.src = 'function outer(asd) {\
        function tt() {}\
        }'

        parser.buildAST()

        node = parser.ASTRoot.statements[0]

        self.assertEqual(len(node.statements),1)
コード例 #8
0
    def test07ParseVariableStatement(self):
        parser = Parser()
        parser.src = 'var x;'
        parser.buildAST()
        node = parser.ASTRoot.statements[0]
        self.assertEqual(type(node), AST.VariableStatement)
        self.assertEqual(node.declarations[0].name,'x')

        parser.src = 'var x=1,b;'
        parser.buildAST()
        node = parser.ASTRoot.statements[0]
        self.assertEqual(type(node), AST.VariableStatement)
        self.assertEqual(node.declarations[0].initializer.value,'1')
        self.assertEqual(node.declarations[0].name,'x')
        self.assertEqual(node.declarations[1].name,'b')
        self.assertEqual(node.declarations[1].initializer,None)
コード例 #9
0
    def test26TryStatement(self):
        parser = Parser()
        parser.src = 'try { ; } catch (ff) {}'

        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.TryStatement)
        self.assertEqual(len(node.block.statements), 1)
        self.assertEqual(node.catchClause.id.name, 'ff')
        self.assertEqual(len(node.catchClause.block.statements), 0)

        parser.src = 'try { ; } finally {try {} catch (d) {} finally {}}'

        node = parser.buildAST().statements[0]

        self.assertEqual(node.catchClause, None)
        self.assertEqual(type(node.finClause.block.statements[0]), AST.TryStatement)
コード例 #10
0
    def test19IterationStatement(self):
        parser = Parser()
        parser.src = 'do do ; while (1===1); while (a!=1+2);'

        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.DoWhileStatement)
        self.assertEqual(type(node.statement), AST.DoWhileStatement)
        self.assertEqual(type(node.condition), AST.BinaryExpression)
        self.assertEqual(node.condition.op, '!=')
        self.assertEqual(node.statement.condition.op, '===')
        self.assertEqual(type(node.statement.statement), AST.EmptyStatement)

        parser.src = 'while (0) {}'

        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.WhileStatement)
        self.assertEqual(type(node.statement), AST.Block)
        self.assertEqual(node.condition.value, '0')

        parser.src = 'for (a=1;a<12;a()) {}'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.ForStatement)
        self.assertEqual(type(node.statement), AST.Block)
        self.assertEqual(type(node.init), AST.AssignmentExpression)
        self.assertEqual(node.init.left.name, 'a')
        self.assertEqual(type(node.condition), AST.BinaryExpression)
        self.assertEqual(node.condition.op, '<')

        self.assertEqual(type(node.next), AST.Call)
        self.assertEqual(node.next.expr.name, 'a')

        parser.src = 'for (var b=1,c=2;a<12;a()) {}'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node.init), AST.Block)
        self.assertEqual(len(node.init.statements), 2)
        self.assertEqual(type(node.init.statements[0]), AST.VariableDeclaration)

        parser.src = 'for (var b=1;a<12;a()) {}'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node.init), AST.VariableDeclaration)
        self.assertEqual(node.init.name, 'b')

        parser.src = 'for (var f in asdd) {}'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.ForInStatement)
        self.assertEqual(node.each.name, 'f')
        self.assertEqual(node.enumerable.name, 'asdd')

        parser.src = 'for (x in dsdd) {}'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.ForInStatement)
        self.assertEqual(node.each.name, 'x')
        self.assertEqual(node.enumerable.name, 'dsdd')
コード例 #11
0
    def test27LabelledStatement(self):
        parser = Parser()
        parser.src = 'dd: {}'

        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.LabelledStatement)
        self.assertEqual(node.label.name, 'dd')
        self.assertEqual(type(node.statement), AST.Block)
コード例 #12
0
    def test23WithStatement(self):
        parser = Parser()
        parser.src = 'with (dd) {}'

        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.WithStatement)
        self.assertEqual(node.expr.name,'dd')
        self.assertEqual(type(node.statement),AST.Block)
コード例 #13
0
    def test05ParseProgramAsBlockStatements(self):
        parser = Parser()
        parser.src = '{}'

        parser.buildAST()

        self.assertEqual(len(parser.ASTRoot.statements),1)
        node = parser.ASTRoot.statements[0]
        self.assertEqual(type(node), AST.Block)
        parser.src = '{}{}'

        parser.buildAST()

        self.assertEqual(len(parser.ASTRoot.statements),2)
        node = parser.ASTRoot.statements[0]
        self.assertEqual(type(node), AST.Block)
        node = parser.ASTRoot.statements[1]
        self.assertEqual(type(node), AST.Block)
コード例 #14
0
    def test28ExpressionStatement(self):
        parser = Parser()
        parser.src = '123;a+1;x/=4\nrrr'

        statements = parser.buildAST().statements

        self.assertEqual(type(statements[0]), AST.ExpressionStatement)
        self.assertEqual(statements[0].expr.value, '123')
        self.assertEqual(statements[1].expr.op, '+')
        self.assertEqual(statements[2].expr.op, '/=')
        self.assertEqual(statements[3].expr.name, 'rrr')
コード例 #15
0
    def test21BreakStatement(self):
        parser = Parser()
        parser.src = 'break;'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.BreakStatement)

        #ASI testing
        parser.src = 'break\nbreak'
        statements = parser.buildAST().statements

        self.assertEqual(len(statements), 2)
        self.assertEqual(type(statements[0]), AST.BreakStatement)
        self.assertEqual(type(statements[1]), AST.BreakStatement)

        parser.src = 'break asd\nbreak ddd;'
        statements = parser.buildAST().statements

        self.assertEqual(len(statements),2)
        self.assertEqual(statements[0].label.name,'asd')
        self.assertEqual(statements[1].label.name,'ddd')
コード例 #16
0
    def test22ReturnStatement(self):
        parser = Parser()
        parser.src = 'return;'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.ReturnStatement)

        #ASI testing
        parser.src = 'return\nreturn'
        statements = parser.buildAST().statements

        self.assertEqual(len(statements), 2)
        self.assertEqual(type(statements[0]), AST.ReturnStatement)
        self.assertEqual(type(statements[1]), AST.ReturnStatement)

        parser.src = 'return 22+1\nreturn asd=3;'
        statements = parser.buildAST().statements

        self.assertEqual(len(statements),2)
        self.assertEqual(statements[0].result.op,'+')
        self.assertEqual(statements[1].result.left.name,'asd')
コード例 #17
0
    def test20ContinueStatement(self):
        parser = Parser()
        parser.src = 'continue;'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.ContinueStatement)

        #ASI testing
        parser.src = 'continue\ncontinue'
        statements = parser.buildAST().statements

        self.assertEqual(len(statements), 2)
        self.assertEqual(type(statements[0]), AST.ContinueStatement)
        self.assertEqual(type(statements[1]), AST.ContinueStatement)

        #ASI testing
        parser.src = 'continue asd\ncontinue ddd;'
        statements = parser.buildAST().statements

        self.assertEqual(len(statements),2)
        self.assertEqual(statements[0].label.name,'asd')
        self.assertEqual(statements[1].label.name,'ddd') 
コード例 #18
0
    def test25ThrowStatement(self):
        parser = Parser()
        parser.src = 'throw 123;'
        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.ThrowStatement)

        #ASI testing
        parser.src = 'throw 33\n throw 23'
        statements = parser.buildAST().statements

        self.assertEqual(len(statements), 2)
        self.assertEqual(type(statements[0]), AST.ThrowStatement)
        self.assertEqual(statements[0].exception.value, '33')
        self.assertEqual(type(statements[1]), AST.ThrowStatement)
        self.assertEqual(statements[1].exception.value, '23')

        parser.src = '{throw 22+1} throw asd=3;'
        statements = parser.buildAST().statements

        self.assertEqual(len(statements),2)
        self.assertEqual(statements[0].statements[0].exception.op,'+')
        self.assertEqual(statements[1].exception.left.name,'asd')
コード例 #19
0
    def test24SwitchStatement(self):
        parser = Parser()
        parser.src = 'switch (a) {\
        case "aa": {};\n\
                    ;\n\
        default: ;\
        }'

        node = parser.buildAST().statements[0]

        self.assertEqual(type(node), AST.SwitchStatement)
        self.assertEqual(node.expr.name, 'a')
        self.assertEqual(len(node.cases), 2)
        self.assertEqual(node.cases[0].label.value, 'aa')
        self.assertEqual(len(node.cases[0].statements), 3)
        self.assertEqual(type(node.cases[0].statements[0]), AST.Block)
        self.assertEqual(type(node.cases[0].statements[1]), AST.EmptyStatement)

        self.assertEqual(node.cases[1].label, None)
        self.assertEqual(len(node.cases[1].statements), 1)
        self.assertEqual(type(node.cases[1].statements[0]), AST.EmptyStatement)
コード例 #20
0
from JSParser import Parser
import codecs
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

__author__ = 'Robur'


# file = open('jssrc/script.js')
file = codecs.open('jssrc/script.js', 'r')

js = file.read()
file.close()

parser = Parser()
parser.src = js

tree = parser.buildAST()