2009-05-09 4 views
7

Мне нужно разбить файл JavaScript на отдельные инструкции. Например,Анализ кода JavaScript на код

a = 2; 
foo() 
function bar() { 
    b = 5; 
    print("spam"); 
} 

необходимо разделить на три части. (назначение, вызов функции и определение функции).

В основном мне необходимо измерить код, введя код между этими инструкциями для выполнения проверок. Разделение на ";" не будет работать, потому что вы также можете заканчивать инструкции новыми символами, и, возможно, я не хочу вводить код внутри функций и определений классов (я еще не знаю). Я прочитал курс о грамматике с flex/Bison, но в этом случае семантическое действие для этого правила будет «распечатать все потомки в дереве разбора и поместить мой код в конец», что невозможно сделать с помощью базового Bison. , Как мне это сделать? Мне также нужно разделить код, потому что мне нужно взаимодействовать с Python с помощью python-spidermonkey. Или ... есть ли там библиотека, которая спасает меня от переосмысления колеса? Это не должно быть в Python.

+0

Ну, я бы попробовал jQuery AOP – mozillanerd

+0

Я не вижу, чтобы это предложение было продолжено. Я использовал большие библиотеки javascript. Надеюсь, вы попробуете. Это простой в использовании. – mozillanerd

ответ

4

Почему бы не использовать парсер JavaScript? Есть много, включая Python API для ANTLR и оболочку Python вокруг SpiderMonkey.

+0

Я смотрел ANTLR, но казался очень сложным :-( Я уже планирую использовать python-spidermonkey, но сначала мне нужно разбить код правильно: execute ("function foo() {") дает ошибку. I просто подумал, что будет другой способ ... если я буду кормить объекты python в js-контексте, я могу разместить обратные вызовы в код python там, но это кажется довольно сложным, я довольно новичок в этом языке-интерфейсе (и i ' m new to js too) – BruceBerry

+0

Такие инструменты, как ANTLR, «очень сложны», потому что они имеют дело с действительно сложными проблемами. Многие люди пытаются каким-то образом взломать строку, чтобы манипулировать кодом, она почти всегда заканчивается неудачно, потому что хакерство строк не может надежно справляйтесь с осложнениями. –

0

Почему бы не использовать существующий JavaScript-интерпретатор, например Rhino (Java) или python-spidermonkey (не уверен, что он еще жив)? Он будет анализировать JS, а затем вы можете изучить полученное дерево разбора. Я не уверен, насколько легко будет воссоздать исходный код, но в основном это зависит от того, насколько читаемым должен быть код инструментария. Если никто никогда не смотрит на это, просто создайте действительно компактную форму.

pyjamas также может представлять интерес; это Python для транспилятора JavaScript.

[РЕДАКТИРОВАТЬ] Хотя это не решит вашу проблему с первого взгляда, вы можете использовать ее для другого подхода: вместо того, чтобы обрабатывать JavaScript, вместо этого напишите свой код на Python (что можно легко измерить, все инструменты уже там), а затем преобразовать результат в JavaScript.

Наконец, если вы хотите решить вашу проблему в Python, но не можете найти синтаксический анализатор: используйте Java-движок, чтобы добавлять комментарии к коду, который вы можете искать в Python для кодирования кода.

+0

вы второй, кто сказал, что я могу разобрать код с помощью python-spidermonkey ... я понял, что это неправильно? У него, похоже, нет функции parsing functio nalities. Код должен быть проанализирован где-то явно, но он выполняется глубоко внутри движка spidermonkey, интерфейс python не обеспечивает в нем крючков. Я вижу только «execute», «add_global», «rem_global» и «gc» для python-программистов. Я что-то упускаю? – BruceBerry

+0

См. Мое редактирование, чтобы объяснить мою мысль о поезде. –

+0

К сожалению, это часть проекта для анализа перенаправления на страницах. Я не могу написать код javascript :-) И вредоносные веб-сайты занимают много времени, чтобы запутать их код. – BruceBerry

2

JavaScript сложно разобрать; вам нужен полный парсер JavaScript. DMS Software Reengineering Toolkit можно разобрать полный JavaScript и построить соответствующий AST. АСТ-операторы могут затем использоваться для перехода по дереву, чтобы «разделить его». Однако еще проще применить преобразования источника к источнику, которые ищут шаблон одного синтаксиса (JavaScript), и заменить его другим. Вы можете использовать такие преобразования для вставки инструментария в код, а не для разделения кода, чтобы сделать трюки для выполнения вставок. После того, как преобразования завершены, DMS может восстановить действующий код JavaScript (в комплекте с комментариями orignal, если они не затронуты).