Парсинг объектов Javascript - PullRequest
       3

Парсинг объектов Javascript

10 голосов
/ 11 ноября 2011

Я пытаюсь разобрать javascript (используя javascript) и столкнулся с проблемой с объектами.Как javascript определяет разницу между объектом или блоком?

Например,

{ x : 1, y : 2}

Token Stream:

[{][x][:][1][,][y][:][2][}]

Очевидно, что объект, однако

{ var x = 1; var y = 2}

Поток токенов:

[{][var][x][=][1][;][var][y][=][2][}]

Является совершенно допустимым анонимным блоком JavaScript.Как бы мне было эффективно идентифицировать каждый поток токенов как объект или блок?

Однако, более важно, чем то и другое, как определить разницу между потоком токенов, что может быть объектом илиblock как показано ниже:

{ a : null }

Token Stream:

[{][a][:][null][}]

Это может быть либо объект, параметр которого равен нулю, или это может быть блок, в котором первая инструкция в блоке (null) имеет метку (a)

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Вы не делаете.

Контекст синтаксиса влияет на его идентичность.Вы не можете просто вырвать вещи из контекста и определить, кто они.

В грамматике литерал объекта:

'{' (propertyNameAndValueList)? '}'

, тогда как блок:

'{' (statementList)? '}'

Но литералы существуют только там, где допустимы выражения, в то время как блоки существуютгде заявления допускаются.И это не одно и то же.

Итак, именно окружающий контекст различает две формы.

2 голосов
/ 28 мая 2015

Обычно выражения могут быть выражениями, но для этого в грамматике есть два исключения:

ExpressionStatement :
    [lookahead ∉ {{, function}] Expression ;

Шрифты здесь не совсем правильные, но они означают, что выражение может бытьоператор, только если первый токен не является ни '{', ни 'функцией'.

Это поясняется в этом примечании в разделе 12.4 спецификации ECMAScript 5.1:

ПРИМЕЧАНИЕ. ExpressionStatement не может начинаться с открывающей фигурной скобки, поскольку это может сделать его неоднозначным с блоком.Кроме того, ExpressionStatement не может начинаться с ключевого слова function, потому что это может сделать его неоднозначным с FunctionDeclaration.

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