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.