Разбор функций Javascript из исходного текста Javascript - PullRequest
0 голосов
/ 17 октября 2018

Я искал синтаксический анализатор Javascript на Java, который может захватывать и перечислять все функции Javascript, например,

function beforeSave('Test', request, response) {
    response.body = entity.foo;
    if (request.query.isExist('Test', 'foo', entity.foo)) {
        response.error();
    } else {
        response.success();
    }
}

function afterSave('Test', request, response) {
    response.body = 'done';
    response.success();
}

Существует ли библиотека синтаксического анализатора Javascript для Java, которая быиметь возможность перечислять все функции из заданного исходного текста, а также получать тела функций по мере необходимости.

1 Ответ

0 голосов
/ 17 октября 2018

Я работал над парсером HTML - и на самом деле он не выполняет синтаксический анализ JavaScript, это намного другая проблема, чем я работаю.Однако он прекрасно изолирует узлы JavaScript внутри HTML-страницы.

См. @: http://developer.torello.directory/JavaHTML/index.html

Вот мой код, чтобы ответить на ваш вопрос:

import Torello.HTML.*;
import Torello.Java.*;
import java.util.regex.*;
import java.util.*;
import java.io.*;

public class Functions
{
    private static final Pattern GET_FUNCTION_PATTERN = Pattern.compile("\\sfunction\\s+(\\w+)");

    public static void main(String[] argv) throws IOException
    {
        Vector<String>      results     = new Vector<String>();
        Vector<HTMLNode>    page        = HTMLPage.getPageTokens(new java.net.URL(argv[0]), false);
        int[]               scriptNodes = TagNodeFind.all(page, TC.OpeningTags, "script");

        System.out.println("page.size():\t" + page.size());
        System.out.println("scriptNodes.length:\t" + scriptNodes.length);

        for (int scriptNodePos : scriptNodes)
        {
            Vector<HTMLNode> script     = TagNodeGet.firstInclusive(page, scriptNodePos, -1, "script");
            for (HTMLNode n : script)
                if (n instanceof TextNode)
                {
                    // System.out.println("TextNode:\t" + n.str + "\n"); 
                    Matcher m           = GET_FUNCTION_PATTERN.matcher(n.str);
                    while (m.find()) results.add(m.group(1));
                }
        }
        for (String res : results) System.out.println(res);
    }
}

Вот некоторые результаты:

http://StackOverflow.com (нет реальных функций JavaScript, содержащих имена - много анонимных функций)

rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://www.stackoverflow.com/
page.size():    11078
scriptNodes.length:     12

http://news.yahoo.com Работает нормально, несколько именованных функций...

rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://news.yahoo.com
page.size():    2911
scriptNodes.length:     32
_perfMark
_perfMeasure
_pushAdPerfMetric
_fireAdPerfBeacon
_onloadEvtHandler
_darlaErrHandler
onDarlaIdle

http://wikipedia.org - аналогично StackOverflow - только анонимные функции.

rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://wikipedia.org
page.size():    3016
scriptNodes.length:     4

http://flickr.com - имеетнесколько ... Я не на 100% на своем "решении", но этот тип вещей является тем, что интересно в SO ... (хотя не обязательно для вас!)

rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://flickr.com
page.size():    472
scriptNodes.length:     9
flush
decrementRequestPending
createScriptNode
load

ПРИМЕЧАНИЕ: Если я настрою файл Pattern.com с: Pattern.compile("\\wfunction\\s+(\\w+)") на Pattern.compile("function\\s+(\\w+)"), я получу его от StackOverflow.com (интересные имена функций JavaScript):

rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://www.stackoverflow.com/
page.size():    11102
scriptNodes.length:     12
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...