Разобрать JavaScript в коде инструмента - PullRequest
7 голосов
/ 09 мая 2009

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 09 мая 2009

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

2 голосов
/ 27 августа 2009

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

0 голосов
/ 18 сентября 2011

Забудь мой парсер. https://bitbucket.org/mvantellingen/pyjsparser отличный и полный парсер. Я исправил несколько ошибок здесь: https://bitbucket.org/nullie/pyjsparser

0 голосов
/ 09 мая 2009

Почему бы не попробовать javascript beautifier?

Например http://jsbeautifier.org/

Или см. Улучшение кода JavaScript командной строки, работающее в Windows и Linux

0 голосов
/ 09 мая 2009

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

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

[EDIT] Хотя это не решает вашу проблему на первый взгляд, вы можете использовать ее для другого подхода: вместо инструментария JavaScript вместо этого пишите свой код на Python (который может быть легко инструментирован; все инструменты уже там), а затем преобразовать результат в JavaScript.

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

...