Javascript Object Parsing

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

Например

{ x : 1, y : 2}

токен:

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

Является явно объектом, однако

{ var x = 1; var y = 2}

токен:

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

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

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

{ a : null }

токен:

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

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

Ответ 1

Нет.

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

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

'{' (propertyNameAndValueList)? '}'

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

'{' (statementList)? '}'

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

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

Ответ 2

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

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

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

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

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