2012-08-09 3 views
0

자바 스크립트를 통해 구문 분석하고 특정 라이브러리의 함수에 대한 모든 변수 선언, 속성 및 호출을 찾고 싶습니다.자바 스크립트 파일을 통해 구문 분석에 접근하는 방법은 무엇입니까?

정규 표현식, 렉서 (lexer)는 이미 수행 한 작업을 사용합니다 (존재합니까?) ....?

사실 내가 원하는 것은 객체 네임 스페이스와 메소드가 정적 분석을 통해 수정되지 않는다는 것입니다.

+0

브라우저는 이미 꽤 잘한다. inspector/profiler를 사용하여 파싱 결과를 볼 수 있습니다. –

답변

1

당신은 정규 표현식으로 그것을 할 수없고 아마도 당신 자신의 구현을 ecma-standard 262 (총 과잉이다)으로 쓰고 싶지 않을 것입니다.
나는 Google의 V8 자바 스크립트 엔진을 더 정확하게 파고, PyV8. 당신이 그것을 사용할 수 있습니다 것이 좋습니다.

당신은 내가 (PIP 설치가 내 x64 시스템에 오류가 발생했습니다, 그래서 소스를 사용)를 설치하는 데 사용되는 코드는 문제가 있었다 경우

apt-get install subversion scons libboost-python-dev 
svn checkout http://v8.googlecode.com/svn/trunk/ v8 
svn checkout http://pyv8.googlecode.com/svn/trunk/ pyv8 
cd v8 
export PyV8=`pwd` 
cd ../pyv8 
sudo python setup.py build 
sudo python setup.py install 

나는 이러한 명령에 대한 오류를하지 않았다 기억으로 나를. (브라우저에서 당신을 호출해야

import PyV8 

class Global(PyV8.JSClass):  # define a compatible javascript class 
    def hello(self):    # define a method 
     print "Hello World" 

    def alert(self, message): # my own alert function 
     print type(message), ' ', message 

    @property 
    def GObject(self): return self 

    def __setattr__(self, key, value): 
     super(Global, self).__setattr__(key, value) 
     print key, '=', value 

G = Global() 
ctxt = PyV8.JSContext(G) 
ctxt.enter() 
ctxt.eval("var a=hello; GObject.b=1.0; a();") 
list_all_cmd = '''for (myKey in GObject){ 
alert(GObject[myKey]); 
}''' 
ctxt.eval(list_all_cmd) 
ctxt.leave() 

:
더 복잡한 헬로 WOLRD 예는 전역 객체의 일부 varibales 목록 : 질문 자체에

답변 (나는 그것을 copypasted하지만 일) 전역 객체 - 창)
이 코드가 출력 :

b = 1 
Hello World 
<class '__main__.Global'> <__main__.Global object at 0x7f202c9159d0> 
<class '_PyV8.JSFunction'> function() { [native code] } 
<type 'int'> 1 
<class '_PyV8.JSFunction'> function() { [native code] } 
<class '_PyV8.JSFunction'> function() { [native code] } 
<class '_PyV8.JSFunction'> function() { [native code] } 
<class '_PyV8.JSFunction'> function() { [native code] } 
<class '_PyV8.JSFunction'> function() { [native code] } 
<class '_PyV8.JSFunction'> function() { [native code] } 
<class '_PyV8.JSFunction'> function() { [native code] } 
<class '_PyV8.JSFunction'> function() { [native code] } 
+0

Windows 또는 Linux 용 pyV8을 사용하셨습니까? –

+0

@EduardFlorinescu, 물론 리눅스! =) – Sergey

+0

boost.python을 설치할 때 몇 가지 문제가 발생했습니다 –

0

Mozilla의 Rhino을 사용할 수 있습니다. Java로 작성된 Javascript 구현입니다. 1.7R3 릴리스에는 새로운 AST API가 있습니다. 당신이 자바 스크립트에서이 작업을 수행하려면 수업은 org.mozilla.javascript.ast

에서 사용할 수있는, JavaScript parser in JavaScript

는 희망이 도움이 토론을 참조하시기 바랍니다.

+0

나는 pynocos (python rhino 포트), pynarcissus, pyV8을 이미 내 aproach를 확인해 주셔서 고맙습니다. :) 또한 jslint 파서를 사용하여 sugestion을 주셔서 감사합니다. 파이썬 용 jslint 포트를 찾을 수도 있고 정규 표현식을 볼 수도 있습니다. . 나는 그것이'와 같은 코드 객체를 기반으로 만들어 졌음을 알 수 있습니다. 어떻게 그것을 통해 변수를 추적 할 수 있습니까? 나는 그것으로 효과적으로 일하는 법을 모른다. –