Разбор кода JavaScript в Java для получения имен переменных - PullRequest
4 голосов
/ 16 ноября 2011

У меня есть Java String, который содержит код JavaScript, и мне нужно извлечь все имена javascript var s.

Итак, для следующего javasctipt:

var x;
var a,b,c,d;
var y = "wow";
var z = y + 'x';

Мне нужно получить "x,a,b,c,d,y,z" в результате.

Мне не нужно получать их значения, только их имена.

Ответы [ 3 ]

4 голосов
/ 16 ноября 2011

Хорошо, вы можете попытаться получить привязки, которые создает выполнение сценария:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine se = mgr.getEngineByName("JavaScript");

try {
    se.eval("var x;var a,b,c,d;var y = \"wow\";var z = y+'x';");
    Bindings bindings = se.getBindings(ScriptContext.ENGINE_SCOPE);
    System.out.println(bindings.keySet());
}
catch (ScriptException e) {
    //e.printStackTrace();
}

это печатает [d, b, c, println, a, context, z, y, print, x]

, поскольку вы видите, что определены некоторые дополнительные привязки:*

и здесь мы отфильтровываем их

Set<String> keySet = bindings.keySet();
keySet.removeAll(Arrays.asList("context", "print", "println"));
System.out.println(keySet);

это печатает [d, b, c, a, z, y, x]

1 голос
/ 16 ноября 2011

Примерно так:

List<String> vars = new ArrayList<String>();

Pattern p = Pattern.compile("^\\s*var\\s+(.*?)\\s*;?$");

BifferedReader reader = .... // create the reader
String line = null;
while ((line = reader.readLine()) != null) {
    Matcher m = p.matcher(line);
    if (m.find()) {
        vars.addAll(Arrays.asList(m.group(1).split("\\s*,\\s*")));       
    }
}

Обратите внимание, что я написал этот код без IDE и никогда не компилировал и не запускал его.Так что, извините за возможные ошибки, но я думаю, что он достаточно читабелен и может быть хорошей отправной точкой для вас.

0 голосов
/ 16 ноября 2011

Я не уверен, будет ли это слишком запутанным, но я, вероятно, получу BNF для Javascript (см. SO: репозиторий грамматик BNF? ), а затем использую что-то вроде ANTLR , чтобы создать анализатор для Javascript, который затем можно использовать для извлечения всех переменных на основе исходного кода Javascript.См. Также SO: ANTLR Tutorials .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...