2015-09-13 1 views
2

Я использовал Esprima.Net (https://github.com/Diullei/Esprima.NET), чтобы получить AST (абстрактный синтаксический ключ) из кода JavaScript. Он возвращает List<Dynamic>, состоящий из множества дочерних и дочерних узлов. Интересно, как лучше всего пройти все эти узлы в C# для анализа. В основном я хочу получить имя функции, имя переменной &, что она находится под.Перемещение JavaScript AST (Esprima.Net) в Дерево в C#

Например, в следующем коде JavaScript:

var y = 45; 
function fTest(d) 
{ 
    var key: Argument.Callee; 
    var cars = 'Hello'; 
    for (i = 0; i < cars.length; i++) 
    { 
    text += cars[i]; 
    } 
} 

Я хочу, чтобы получить следующий результат в конце:

variable: 45 
function:parameter:'d' 
function:variable:argument.callee 
function:variable:'Hello' 
funtion:loop:variable:object 

Я имею трудность пересечь List<Dynamic>, данный Esprima.Net. Любые идеи для обработки или пересечения этого списка в дереве или любой структуре, чтобы я мог получить к ним доступ? Благодарю.

+0

Я сделал что-то с Esprima в прошлом, и я закончил его реализацию с помощью NodeJS. Поскольку Esprima сделан в JS (хорошо, есть этот .NET-порт ... но я имею в виду официальный), анализ JS от JS чувствует себя немного более простым. Возможно, вы также можете выполнить всю работу с помощью [Юрское] (https://jurassic.codeplex.com/), а затем прочитать результаты из .NET. –

+0

Оглядываясь, кажется, что юра не создает АСТ, если не сделано изменение его кода. В итоге я использовал Esprima JS и внешний Javascript, как указано ниже. – iLoeng

ответ

1

В итоге я не использовал Esprima.NET, но Esprima JS (http://esprima.org/). Я добавил Esprima JS на веб-страницу и создаю внешний файл javascript, который называется парсером Esprima для создания AST. Как только у меня был АСТ, я использовал estraverse (https://github.com/estools/estraverse), чтобы пройти AST, чтобы получить результаты.

Надеюсь, это поможет другим.

0

Вы можете использовать Jint, который является интерпретатором JavaScript в .NET, и имеет внутренний порт Esprima (ES5). Он возвращает тот же АСТ, что и Esprima.

Или вы можете использовать другие Esprima.NET, которые основаны на ES6 и распространяются отдельно от Jint.