Предположим, что в какой-то момент процесса синтаксического анализа я уже прошел следующий вывод грамматики:
Script -> ScriptBody -> StatementList -> ExpressionStatement -> Expression
Вот и беда. Согласно спецификации, Expression
в ExpressionStatement
может закончиться только как AssignmentExpression
или их последовательность. Однако такие утверждения, как
a;
12;
"some text";
определенно являются выражениями (насколько я понимаю), в то же время не являясь ни одним из возможных подтипов AssignmentExpression
. Они не приводят к синтаксической ошибке в моих браузерах.
Это особенность конкретной реализации или механизма, что эти операторы возвращают значение, или мне что-то не хватает в спецификации? Может, это вовсе не AssignmentExpressions
и я их принимаю за что-то другое?
Когда вы посмотрите на определение AssignmentExpression
, вы увидите, что оно разрешается, например, в AssignmentExpression
-> ConditionalExpression
-> LogicalORExpression
-> LogicalANDExpression
-> BitwiseORExpression
-> BitwiseXORExpression
-> BitwiseANDExpression
-> EqualityExpression
-> RelationalExpression
-> ShiftExpression
-> AdditiveExpression
-> MultiplicativeExpression
-> ExponentiationExpression
-> UnaryExpression
-> UpdateExpression
-> LeftHandSideExpression
-> NewExpression
-> MemberExpression
-> PrimaryExpression
-> Literal
-> StringLiteral
.
Итак, "some text"
- действительный AssignmentExpression
. То же самое и с другими литералами и ссылками на переменные.
Пункт 13.5 в разделе синтаксиса: ecma-international.org/ecma-262/#sec-expression-statement ссылается на 12.16, оператор запятой: ecma-international.org/ecma-262/#sec-comma-operator