Javascript.RU

Лексические соглашения

Update: Более новый материал по этой теме находится по адресу http://es5.javascript.ru.
7. Лексические соглашения

Исходный текст программы на ECMAScript предварительно преобразуется в последовательность входных элементов четырёх типов: токены, переводы строк, комментарии и пробелы. Исходный текст анализируется слева направо, последовательно выбирая наиболее длинную последовательность символов в качестве следующего входного элемента.

В лексической грамматике определены два начальных символа. Символ ВходнойЭлементДеления используется в тех контекстах синтаксической грамматики, где разрешено использование оператора деления (/) или деления-с-присваиванием (/=). Символ ВходнойЭлементРегВыр используется в прочих контекстах синтаксической грамматики.

Заметим, что существуют такие контексты синтаксической грамматики, где разрешается использование как операции деления, так и ЛитералаРегулярногоВыражения; однако поскольку лексическая грамматика использует в таких случах начальный символ ВходнойЭлементДеления, открывающий слэш (/) в таком контексте не распознаётся как начало регулярного выражения. Чтобы обойти это ограничение, литерал регулярного выражения можно заключить в скобки.

Синтаксис

ВходнойЭлементДеления ::
Пробел
КонецСтроки
Комментарий
Токен
ЗнакДеления
ВходнойЭлементРегВыр ::
Пробел
КонецСтроки
Комментарий
Токен
ЛитералРегулярногоВыражения
7.1 Символы форматирования Юникода

Символы управления форматом Юникода (например, символы категории "Cf" в базе данных символов Юникода, такие как LEFT-TO-RIGHT MARK и RIGHT-TO-LEFT MARK) являются управляющими кодами, используемыми для управления форматом текстового фрагмента в отсутствии более высокоуровневых протоколов (таких как язык разметки), обычно применяемых для этой цели. Для облегчения редактирования и отображения текста полезно разрешать включение таких символов в исходный текст.

Символы управления форматом могут встречаться где угодно в тексте программы на ECMAScript. Эти символы удаляются из исходного текста перед применением лексической грамматики. Поскольку такие символы удаляются перед обработкой строковых литералов и литералов регулярных выражений, для включения символов форматирования следует использовать юникодную escape-последовательность (см. 7.6) .

7.2 Пробел

Пробелы используются для улучшения читаемости исходного текста и разделения токенов (неделимых лексических единиц). В остальном они не оказывают на исходный текст никакого влияния. Пробелы могут встречаться между любыми двумя токенами, а также внутри строк (где они считаются значащими символами и составляют часть значения строкового литерала), но не могут появляться внутри какого-либо другого токена.

Следующие символы считаются эквивалентными пробелу:

Код Юникода Наименование Формальное наименование
\u0009 Табуляция <TAB>
\u000B Вертикальная табуляция <VT>
\u000C Перевод страницы <FF>
\u0020 Пробел <SP>
\u00A0 Неразрывный пробел <NBSP>
Прочие в категории "Zs" Прочие "разделители пробела" в Юникоде <USP>

Синтаксис

Пробел ::
<TAB>
<VT>
<FF>
<SP>
<NBSP>
<USP>
7.3 Разделители строк

Как и пробелы, символы конца строки используются для улучшения читаемости исходного текста и разделения токенов (неделимых лексических единиц). Однако в отличие от пробелов, разделители строк имеют некоторое влияние на поведение синтаксической грамматики. В основном, разделители строк могут находиться между любыми двумя токенами, но есть ряд мест, где их появление запрещено синтаксической грамматикой. Разделитель строк не может находиться внутри какого-либо токена, даже строкового литерала. Разделители строк также влияют на процесс автоматической вставки точек с запятой (7.9).

Следующие символы считаются эквивалентными концу строки:

Код Юникода Наименование Формальное наименование
\u000A Перевод строки <LF>
\u000D Возврат каретки <CR>
\u2028 Разделитель строк <LS>
\u2029 Разделитель абзацев <PS>

Синтаксис

КонецСтроки ::
<LF>
<CR>
<LS>
<PS>
7.4 Комментарии

Описание

Комментарии бывают двух типов: однострочные и многострочные. Многострочные комментарии не могут быть вложенными.

Поскольку однострочный комментарий может содержать любой символ, кроме КонцаСтроки, и поскольку, согласно общему правилу, в качестве токена всегда берётся последовательность символов наибольшей возможной длины, однострочный комментарий всегда включает в себя все символы от знака // до конца строки. Однако, КонецСтроки не считается частью однострочного комментария, учитывается лексической грамматикой отдельно и становится частью потока входных символов для синтаксической грамматики. Это замечание является очень важным, поскольку подразумевает, что наличие или отсутствие однострочных комментариев не влияет на процесс автоматической вставки точек с запятой (7.9).

Комментарии ведут себя аналогично пробелам и обычно игнорируются. Исключение составляют те случаи, когда МногострочныйКомментарий содержит символ перевода строки. При этом с точки зрения синтаксической грамматики весь комментарий принимается за КонецСтроки.

Синтаксис

Комментарий ::
МногострочныйКомментарий
ОднострочныйКомментарий
МногострочныйКомментарий ::
/* СимволыМногострочногоКомментарияопц */
СимволыМногострочногоКомментария ::
МногострочныйСимвНеЗвёздочка СимволыМногострочногоКомментарияопц
* СимволыКомментарияПослеЗвёздочкиопц
СимволыКомментарияПослеЗвёздочки ::
МногострочныйСимвНеСлэшИлиЗвёздочка СимволыМногострочногоКомментарияопц
* СимволыКомментарияПослеЗвёздочкиопц
МногострочныйСимвНеЗвёздочка ::
ИсходныйСимвол но не звёздочка *
МногострочныйСимвНеСлэшИлиЗвёздочка ::
ИсходныйСимвол но не прямой слэш / или звёздочка *
ОднострочныйКомментарий ::
// СимволыОднострочногоКомментарияопц
СимволыОднострочногоКомментария ::
СимволОднострочногоКомментария СимволыОднострочногоКомментарияопц
СимволОднострочногоКомментария ::
ИсходныйСимвол но не КонецСтроки
7.5 Токены

Синтаксис

Токен ::
ЗарезервированноеСлово
Идентификатор
ЗнакПрепинания
ЧисловойЛитерал
СтроковойЛитерал
7.5.1 Зарезервированные слова

Описание

Зарезервированные слова не могут быть использованы в качестве идентификаторов.

Синтаксис

ЗарезервированноеСлово ::
КлючевоеСлово
ЗарезервированноеНаБудущееСлово
ЛитералNull
БулевскийЛитерал
7.5.2 Ключевые слова

Следующие токены являются ключевыми словами ECMAScript и не могут быть использованы в программах на ECMAScript.

Синтаксис

КлючевоеСлово :: одно из
break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof
7.5.3 Слова, зарезервированные для будущего использования

Следующие слова используются как ключевые слова в предложенных расширениях для языка и, таким образом, зарезервированы, чтобы обеспечить возможность включения этих расширений в язык в будущем.

Синтаксис

ЗарезервированноеНаБудущееСлово :: one of
abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public
7.6 Идентификаторы

Описание

Идентификаторы обрабатываются согласно грамматике, приведённой в разделе 5.16 стандарта Юникода версии 3.0, с небольшими изменениями. Эта грамматика основывается на нормативных и информативных категориях символов, определённых стандартом Юникода. Символы, принадлежащие к определённым категориям в версии 2.1 стандарта Юникода должны обрабатываться как принадлежащие к этим категориям всеми корректными реализациями ECMAScript. Однако корректные реализации ECMAScript также могут позволять использование в идентификаторах и других символов, основываясь на их категориальной принадлежности в более поздних версиях Юникода.

В данном стандарте имеется единственное отклонение от стандарта Юникода: знак доллара ($) и подчёркивание (_) разрешены к использованию в любом месте идентификатора. Знак доллара предназначается только для использования в автоматически генерируемом коде.

Юникодные escape-последовательности также разрешены к использованию в идентификаторах и трактуются как одиночные символы в составе идентификатора согласно СиЗ ЮникоднойEscapeПоследовательности (см. 7.8.4). Обратный слэш (\), предшествующий ЮникоднойEscapeПоследовательности, не трактуется как символ идентификатора. При помощи ЮникоднойEscapeПоследовательности нельзя вставлять в идентификаторы запрещённые символы. Другими словами, если заменить \ ЮникоднуюEscapeПоследовательность на соответствующее ей СиЗ, результат по-прежнему должен являться корректным идентификатором, состоящим из тех же символов, что и первоначальный Идентификатор.

Два идентификатора, канонически эквивалентные согласно стандарту Юникода, не являются одинаковыми, если они не представлены строго одинаковыми последовательностями кодовых точек (иными словами, корректные реализации ECMAScript должны проводить только побитовое сравнение идентификаторов). Подразумевается, что входной текст был преобразован к нормализованной форме C ещё до того, как был отправлен на вход компилятора.

Синтаксис

Идентификатор ::
ИмяИдентификатора но не ЗарезервированноеСлово
ИмяИдентификатора ::
НачалоИдентификатора
НачалоИдентификатора ЧастьИдентификатора
НачалоИдентификатора ::
БукваЮникода
$
_
\ ЮникоднаяEscapeПоследовательность
ЧастьИдентификатора ::
НачалоИдентификатора
КомбинирующийЗнакЮникода
ЦифраЮникода
СоединяющаяПунктуацияЮникода

\ ЮникоднаяEscapeПоследовательность
БукваЮникода
любой символ из следующих категорий Юникода: "Прописная буква (Lu)", "Строчная буква (Ll)", "Заглавная буква (Lt)", "Буква-модификатор (Lm)", "Другая бугва (Lo)", or "Буква-число (Nl)".
КомбинирующийЗнакЮникода
любой символ из следующих категорий Юникода: "Не-пробельный знак (Mn)" или "Комбинирующий пробельный знак (Mc)"
ЦифраЮникода
любой символ из категории Юникода "Десятичное число (Nd)"
СоединяющаяПунктуацияЮникода
любой символ из категории Юникода "Соединяющая пунктуация (Pc)"
ЮникоднаяEscapeПоследовательность
см 7.8.4.
ШестнадцатеричнаяЦифра :: одна из
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
7.7 Знаки препинания

Синтаксис

ЗнакПрепинания :: один из
{
}
(
)
[
]
.
;
,
<
>
<=
>=
==
!=
===
!==
+
-
*
%
++
--
<<
>>
>>>
&
|
^
!
~
&&
||
?
:
=
+=
-=
*=
%=
<<=
>>=
>>>=
&=
|=
^=
ЗнакДеления :: один из
/
/=
7.8 Литералы

Синтаксис

Литерал ::
ЛитералNull
БулевскийЛитерал
ЧисловойЛитерал
СтроковойЛитерал
7.8.1 Литералы Null

Синтаксис

ЛитералNull ::
null

Семантика

Значеним null-литерала null является единственное значение типа Null, а именно null.

7.8.2 Булевские литералы

Синтаксис

БулевскийЛитерал ::
true
false

Семантика

Значением булевского литерала true является значение типа Boolean, а именно true.

Значением булевского литерала false является значение типа Boolean, а именно false.

7.8.3 Числовые литералы

Синтаксис

ЧисловойЛитерал ::
ДесятичныйЛитерал
ШестнадцатеричныйЦелыйЛитерал
ДесятичныйЛитерал ::
ДесятичныйЦелыйЛитерал . ДесятичныеЦифрыопц ЭкспоненциальнаяЧастьопц
. ДесятичныеЦифры ЭкспоненциальнаяЧастьопц
ДесятичныйЦелыйЛитерал ЭкспоненциальнаяЧастьопц
ДесятичныйЦелыйЛитерал ::
0
НенулеваяЦифра ДесятичныеЦифрыопц
ДесятичныеЦифры ::
ДесятичнаяЦифра
ДесятичныеЦифры ДесятичнаяЦифра
ДесятичнаяЦифра :: одна из
0 1 2 3 4 5 6 7 8 9
НенулеваяЦифра :: одна из
1 2 3 4 5 6 7 8 9
ЭкспоненциальнаяЧасть ::
ПризнакЭкспоЗаписи ЗнаковоеЦелое
ПризнакЭкспоЗаписи :: один из
e E
ЗнаковоеЦелое ::
ДесятичныеЦифры
+ ДесятичныеЦифры
- ДесятичныеЦифры
ШестнадцатеричныйЦелыйЛитерал ::
ШестнадцатеричнаяЦифра0x ШестнадцатеричнаяЦифра
0X ШестнадцатеричнаяЦифра
ШестнадцатеричныйЦелыйЛитерал ШестнадцатеричнаяЦифра

Символ исходного текста, следующий непосредственно за ЧисловымЛитералом, не должен являться НачаломИдентификатора или ДесятичнойЦифрой.

ЗАМЕЧАНИЕ
К примеру, запись

3in

является недопустимой, а не обозначением двух входных элементов: 3 и in.

Семантика

Числовой литерал обозначает значение типа Число. Его значение определяется в два этапа: сначала из литерала получается его математическое значение (МЗ), затем это математическое значение округляется по принципам, описанным ниже.

  • МЗ ЧисловогоЛитерала :: ДесятичногоЛитерала равняется МЗ ДесятичногоЛитерала.
  • МЗ ЧисловогоЛитерала :: ШестнадцатеричногоЦелогоЛитерала равняется МЗ ШестнадцатеричногоЦелогоЛитерала.
  • МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала . равняется МЗ ДесятичногоЦелогоЛитерала.
  • МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала . ДесятичныхЦифр равняется МЗ ДесятичногоЦелогоЛитерала плюс (МЗ ДесятичныхЦифр, умноженное на 10 -n ), где n равно количеству символов в ДесятичныхЦифрах.
  • МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала . ЭкспоненциальнойЧасти равняется МЗ ДесятичногоЦелогоЛитерала, умноженному на 10 e , где e равняется МЗ ЭкспоненциальнойЧасти.
  • МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала . ДесятичныхЦифр ЭкспоненциальнойЧасти равняется (МЗ ДесятичногоЦелогоЛитерала плюс (МЗ ДесятичныхЦифр, умноженное на 10-n )) умноженному на 10e, где n равно числу символов в ДесятичныхЦифрах и e равно МЗ ЭкспоненциальнойЧасти.
  • МЗ ДесятичногоЛитерала ::. ДесятичныхЦифр равняется МЗ ДесятичныхЦифр, умноженному на 10-n, где nравно числу символов в ДесятичныхЦифрах.
  • МЗ ДесятичногоЛитерала :: . ДесятичныхЦифр ЭкспоненциальнойЧасти равняется МЗ of ДесятичныхЦифр, умноженному на 10e-n,где n равно числу символов в ДесятичныхЦифрах и e равно МЗ ЭкспоненциальнойЧасти.
  • МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала равняется МЗ ДесятичногоЦелогоЛитерала.
  • МЗ ДесятичногоЛитерала :: ДесятичногоЦелогоЛитерала ЭкспоненциальнойЧасти равняется МЗ ДесятичногоЦелогоЛитерала, умноженному на 10 e , где e равняется МЗ ЭкспоненциальнойЧасти.
  • МЗ ДесятичногоЦелогоЛитерала :: 0 равняется 0.
  • МЗ ДесятичногоЦелогоЛитерала :: НенулевойЦифры ДесятичныхЦифр равняется (МЗ НенулевойЦифры умножить на 10n ) плюс МЗ of ДесятичныхЦифр, где n равно числу символов в ДесятичныхЦифрах.
  • МЗ ДесятичныхЦифр :: ДесятичнойЦифры равняется МЗ ДесятичнойЦифры.
  • МЗ ДесятичныхЦифр :: ДесятичныхЦифр ДесятичнойЦифры равняется (МЗ ДесятичныхЦифр умножить на 10) плюс МЗ ДесятичнойЦифры.
  • МЗ ЭкспоненциальнойЧасти :: ПризнакаЭкспоненциальнойЗаписи ЗнаковогоЦелого равняется МЗ ЗнаковогоЦелого.
  • МЗ ЗнаковогоЦелого :: ДесятичныхЦифр равняется МЗ ДесятичныхЦифр.
  • МЗ ЗнаковогоЦелого :: + ДесятичныхЦифр равняется МЗ ДесятичныхЦифр.
  • МЗ ЗнаковогоЦелого :: - ДесятичныхЦифр равняется взятому с отрицательным знаком МЗ ДесятичныхЦифр.
  • МЗ ДесятичнойЦифры :: 0 или ШестнадцатеричнойЦифры :: 0 равняется 0.
  • МЗ ДесятичнойЦифры :: 1 или НенулевойЦифры :: 1 или ШестнадцатеричнойЦифры :: 1 равняется 1. МЗ ДесятичнойЦифры :: 2 или НенулевойЦифры :: 2 или ШестнадцатеричнойЦифры :: 2 равняется 2.
  • МЗ ДесятичнойЦифры :: 3 или НенулевойЦифры :: 3 или ШестнадцатеричнойЦифры :: 3 равняется 3.
  • МЗ ДесятичнойЦифры :: 4 или НенулевойЦифры :: 4 или ШестнадцатеричнойЦифры :: 4 равняется 4.
  • МЗ ДесятичнойЦифры :: 5 или НенулевойЦифры :: 5 или ШестнадцатеричнойЦифры :: 5 равняется 5. МЗ ДесятичнойЦифры :: 6 или НенулевойЦифры :: 6 или ШестнадцатеричнойЦифры :: 6 равняется 6.
  • МЗ ДесятичнойЦифры :: 7 или НенулевойЦифры :: 7 или ШестнадцатеричнойЦифры :: 7 равняется 7.
  • МЗ ДесятичнойЦифры :: 8 или НенулевойЦифры :: 8 или ШестнадцатеричнойЦифры :: 8 равняется 8.
  • МЗ ДесятичнойЦифры :: 9 или НенулевойЦифры :: 9 или ШестнадцатеричнойЦифры :: 9 равняется 9. МЗ ШестнадцатеричнойЦифры :: a или ШестнадцатеричнойЦифры :: A равняется 10.
  • МЗ ШестнадцатеричнойЦифры :: b или ШестнадцатеричнойЦифры :: B равняется 11.
  • МЗ ШестнадцатеричнойЦифры :: c или ШестнадцатеричнойЦифры :: C равняется 12.
  • МЗ ШестнадцатеричнойЦифры :: d или ШестнадцатеричнойЦифры :: D равняется 13.
  • МЗ ШестнадцатеричнойЦифры :: e или ШестнадцатеричнойЦифры :: E равняется 14.
  • МЗ ШестнадцатеричнойЦифры :: f или ШестнадцатеричнойЦифры :: F равняется 15.
  • МЗ ШестнадцатеричногоЦелогоЛитерала :: 0x ШестнадцатеричнойЦифры равняется МЗ of ШестнадцатеричнойЦифры.
  • МЗ ШестнадцатеричногоЦелогоЛитерала :: 0X ШестнадцатеричнойЦифры равняется МЗ of ШестнадцатеричнойЦифры.
  • МЗ ШестнадцатеричногоЦелогоЛитерала :: ШестнадцатеричногоЦелогоЛитерала ШестнадцатеричнойЦифры равняется (МЗ of ШестнадцатеричногоЦелогоЛитерала умножить на 16) плюс МЗ ШестнадцатеричнойЦифры.

Как только точное МЗ численного литерала было получено, оно затем округляется к значению типа Number. Если МЗ равно 0, то округлённое значение равняется +0. Иначе, округлённое значение должно равняться численному значению МЗ (согласно определению в разделе 8.5), за исключением тех случаев, когда литерал является ДесятичнымЛитералом и содержит более 20 значащих цифр. Тогда за численное значение принимается либо численное значение МЗ литерала, получаемое заменой каждой значащей цифры после двадцатой на цифру 0, либо численное значение МЗ литерала, получаемое заменой каждой значащей цифры после двадцатой на цифру 0 и затем увеличение литерала на единицу в позиции двадцатой значащей цифры. Цифра является значащей, если она не принадлежит ЭкспоненциальнойЧасти и

  • она не равна 0, или
  • слева от неё есть ненулевая цифра и справа от неё есть ненулевая цифра, не принадлежащая ЭкспоненциальнойЧасти.
7.8.4 Строковые литералы

Строковой литерал представляет собой ноль или больше символов, заключённых в одиночные или двойные кавычки. Каждый символ может быть представлен escape-последовательностью.

Синтаксис

СтроковойЛитерал ::
" СимволыДвойнойСтрокиопц "
'
СимволыОдинарнойСтрокиопц '
СимволыДвойнойСтроки ::
СимволДвойнойСтроки СимволыДвойнойСтрокиопц
СимволыОдинарнойСтроки ::
СимволОдинарнойСтроки СимволыОдинарнойСтрокиопц
СимволДвойнойСтроки ::
ИсходныйСимвол но не двойная-кавычка " или обратный-слэш \или КонецСтроки
\ EscapeПоследовательность
SingleStringCharacter ::
ИсходныйСимвол но не одиночная-кавычка ' или обратный-слэш \или КонецСтроки
\ EscapeПоследовательность
EscapeПоследовательность ::
СимвольнаяEscapeПоследовательность
0 [предпросмотр ∉ ДесятичнаяЦифра]
ШестнадцатеричнаяEscapeПоследовательность
ЮникоднаяEscapeПоследовательность
СимвольнаяEscapeПоследовательность ::
ОдиночныйEscapeСимвол
НеEscapeСимвол
ОдиночныйEscapeСимвол :: один из
' " \ b f n r t v
НеEscapeСимвол ::
ИсходныйСимвол но не EscapeСимвол или КонецСтроки
EscapeСимвол ::
ОдиночныйEscapeСимвол
ДесятичнаяЦифра
x
u
ШестнадцатеричнаяEscapeПоследовательность ::
x ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра
ЮникоднаяEscapeПоследовательность ::
u ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра ШестнадцатеричнаяЦифра

Определение нетерминала ШестнадцатеричнаяЦифра приведено в разделе 7.8.3. ИсходныйСимвол описан в разделах 2 и 6.

Строковой литерал обозначает значение типа String. Строковое значение (СтЗ) литерала описывается через символьные значения (СиЗ) различных частей строкового литерала. В ходе этого процесса некоторые символы строкового литерала считаются имеющими математическое значение (МЗ) согласно описанию ниже или в разделе 7.8.3.

  • СтЗ СтроковогоЛитерала :: "" равно пустой последовательности символов.
  • СтЗ СтроковогоЛитерала :: '' равно пустой последовательности символов.
  • СтЗ СтроковогоЛитерала :: " СимволовДвойнойСтроки " равно СтЗ СимволовДвойнойСтроки.
  • СтЗ СтроковогоЛитерала :: " СимволовОдинарнойСтроки " равно СтЗ СимволовОдинарнойСтроки.
  • СтЗ СимволовДвойнойСтроки :: СимволаДвойнойСтроки равно последовательности из одного символа, СиЗ СимволаДвойнойСтроки.
  • СтЗ СимволовДвойнойСтроки :: СимволаДвойнойСтроки СимволовДвойнойСтроки равно последовательности из СиЗ СимволаДвойнойСтроки, за которым следуют по порядку все символы СтЗ СимволовДвойнойСтроки.
  • СтЗ СимволовОдинарнойСтроки :: СимволаОдинарнойСтроки равно последовательности из одного символа, СиЗ СимволаОдинарнойСтроки.
  • СтЗ СимволовОдинарнойСтроки :: СимволаОдинарнойСтроки СимволовОдинарнойСтроки равно последовательности из СиЗ СимволаОдинарнойСтроки, за которым следуют по порядку все символы СтЗ СимволовОдинарнойСтроки.
  • СиЗ СимволаДвойнойСтроки :: ИсходногоСимвола но не двойной-кавычки " или обратного-слэша \ или КонцаСтроки равно самому ИсходномуСимволу.
  • СиЗ СимволаДвойнойСтроки :: \ EscapeПоследовательности равно СиЗ EscapeПоследовательности. СиЗ СимволаОдинарнойСтроки :: ИсходногоСимвола но не одинарной-кавычки ' или обратного-слэша \ или КонцаСтроки равно самому ИсходномуСимволу.
  • СиЗ СимволаОдинарнойСтроки :: \ EscapeПоследовательности равно СиЗ EscapeПоследовательности.
  • СиЗ EscapeПоследовательности :: СимвольнойEscapeПоследовательности равно СиЗ СимвольнойEscapeПоследовательности.
  • СиЗ EscapeПоследовательности :: 0 [предпросмотр ∉ ДесятичнойЦифре]равно символу <NUL> (код Юникода 0000).
  • СиЗ EscapeПоследовательности :: ШестнадцатеричнойEscapeПоследовательности равно СиЗ ШестнадцатеричнойEscapeПоследовательности.
  • СиЗ EscapeПоследовательности :: ЮникоднойEscapeПоследовательности равно СиЗ ЮникоднойEscapeПоследовательности.
  • СиЗ СимвольнойEscapeПоследовательности :: ОдиночногоEscapeСимвола равно символу, код которого определён ОдиночнымEscapeСимволом согласно следующей таблице:
Escape-прследовательность Код Юникода Наименование Символ
\b \u0008 удаление назад <BS>
\t \u0009 горизонтальная табуляция <HT>
\n \u000A перевод строки (новая строка) <LF>
\v \u000B вертикальная табуляция <VT>
\f \u000C перевод страницы <FF>
\r \u000D возврат каретки <CR>
\" \u0022 двойная кавычка "
\' \u0027 одинарная кавычка '
\\ \u005C обратный слэш \
  • СиЗ СимвольнаяEscapeПоследовательности :: НеEscapeСимвола равно СиЗ НеEscapeСимвола.
  • СиЗ НеEscapeСимвола :: ИсходногоСимвола но не EscapeСимвола или КонцаСтроки равно самому ИсходномуСимволу.
  • СиЗ ШестнадцатеричнойEscapeПоследовательности :: x ШестнадцатеричнойЦифры ШестнадцатеричнойЦифры равно символу, код которого равен (16 умножить на МЗ первой ШестнадцатеричнойЦифры) плюс МЗ второй ШестнадцатеричнойЦифры.
  • СиЗ ЮникоднойEscapeПоследовательности :: u ШестнадцатеричнойЦифры ШестнадцатеричнойЦифры ШестнадцатеричнойЦифры ШестнадцатеричнойЦифры равно символу, код которого равен (4096 (т.е. 163 ) умножить на МЗ первой ШестнадцатеричнойЦифры) плюс (256 (т.е. 162 ) умножить на МЗ второй ШестнадцатеричнойЦифры) плюс (16 умножить на МЗ третьей ШестнадцатеричнойЦифры) плюс МЗ четвёртой ШестнадцатеричнойЦифры.

ЗАМЕЧАНИЕ
Символ 'КонецСтроки' не может появиться в строковом литерале, даже если ему предшествует обратный слэш \. Правильным путём включения символа перевода строки в строковой литерал является использование escape-последовательности, такой как \n или \u000A.

7.8.5 Литералы регулярных выражений

Литерал регулярного выражения - это элемент, который в процессе обработки преобразовывается к объекту RegExp (раздел 15.10). Объект создаётся до того, как начинается выполнение содержащей его программы или функции. При выполнении программы литерал возвращает ссылку на этот объект; он не создаёт нового объекта. Два отдельных регулярных выражения в программе преобразутся в два объекта регулярных выражений, которые никогда не сравниваются как === (строго равные) друг другу, даже если содержимое литералов является идентичным. Объект типа RegExp также может быть создан во время выполнения при помощи выражения new RegExp (раздел 15.10.4) или путём вызова конструктора RegExp как функции (раздел 15.10.3).

Приведённые ниже правила описывают синтаксис литерала регулярного выражения и используются обработчиком входных элементов для нахождения конца литерала регулярного выражения. Строки символов, составляющие ТелоРегулярногоВыражения и ФлагиРегулярногоВыражения передаются в необработанном виде конструктору регулярных выражений, который обрабатывает их своей, более строгой грамматикой. Реализации могут расширять грамматику конструктора регулярных выражений, но они не должны расширять правила, определяющие ТелоРегулярногоВыражения и ФлагиРегулярногоВыражения, или какие-либо из правил, использованных в этих правилах.

Синтаксис

ЛитералРегулярногоВыражения ::
/ ТелоРегулярногоВыражения / ФлагиРегулярногоВыражения
ТелоРегулярногоВыражения ::
ПервыйСимволРегулярногоВыражения СимволыРегулярногоВыражения
СимволыРегулярногоВыражения ::
[пусто]
СимволыРегулярногоВыражения СимволРегулярногоВыражения
ПервыйСимволРегулярногоВыражения ::
НеОкончание но не * или \ или /
ПоследовательностьОбрСлэш
СимволРегулярногоВыражения ::
НеОкончание но не\ или /
ПоследовательностьОбрСлэш
ПоследовательностьОбрСлэш ::
\ НеОкончание
НеОкончание ::
ИсходныйСимвол но не КонецСтроки
ФлагиРегулярногоВыражения ::
[пусто]
ФлагиРегулярногоВыражения ЧастьИдентификатора

ЗАМЕЧАНИЕ
Литералы регулярных выражений не могут быть пустыми; вместо того чтобы представлять пустой литерал регулярного выражения, последовательность // начинает однострочный комментарий. Чтобы указать пустое регулярное выражение, следует использовать /(?:)/.

Семантика

Литерал регулярного выражения обозначает значение типа Object. Это значение определяется в два этапа: сначала символы, распознаваемые правилами грамматики в качестве нетерминалов ТелоРегулярногоВыражения и ФлагиРегулярногоВыражения собираются в необработанном виде в две строки, называетмые, соответственно, Шаблон и Флаги. Затем вызывается конструктор new RegExp с двумя параметрами Шаблон и Флаги, и результат становится значением ЛитералаРегулярногоВыражения. Если вызов new RegExp генерирует ошибку, реализация может по собственному усмотрению либо выдать сообщение об ошибке сразу при разборе исходного текста программы, либо отложить ошибку до того момента, когда к значению регулярного выражения обращается программа в ходе своего исполнения.

7.9 Автоматическая вставка точек с запятыми

Некоторые инструкции ECMAScript (пустая инструкция, объявление переменной, инструкция-выражение, инструкция do-while, инструкция continue, инструкция break, инструкция return, и инструкция throw) должны оканчиваться точками с запятыми. Эти точки с запятыми могут явно указываться в тексте. Однако в некоторых случаях, исходя из соображений удобства, такие точки с запятыми в исходном тексте могут быть опущены. Эти ситуации описываются высказыванием, гласящим, что точки с запятой автоматически вставляются в поток токенов исходного текста в этих ситуациях.

7.9.1 Правила автоматической вставки точек с запятыми
  • Когда в ходе последовательного разбора текста программы слева направо встречается токен (называемый токеном-нарушителем), который не позволяется никаким из правил грамматики, то точка с запятой автоматически вставляется перед токеном-нарушителем, если выполняется одно из следующих условий:

    1. Токен-нарушитель отделён от предыдущего токена как минимум одним КонцомСтроки.

    2. Токеном-нарушителем является закрывающая фигурная скобка }.

  • Когда в ходе последовательного разбора текста программы слева направо поток входных токенов заканчивается, и парсер не в состоянии распознать весь поток входящих токенов как единственный нетерминал Программа, то точка с запятой автоматически добавляется в конец потока.
  • Если в грамматике присутствует ограниченное правило, то первый токен для терминала или нетерминала, непосредственно следующего за обозначением [здесь нет КонцаСтроки] в описании ограниченного правила, называется ограниченным токеном. Когда в ходе последовательного разбора текста программы слева направо встречается токен, который разрешён ограниченным правилом грамматики, является в нём ограниченным токеном и который отделён от предыдущего токена в потоке как минимум одним КонцомСтроки, то перед этим токеном автоматически вставляется точка с запятой.

Однако существует одно общее ограничение на предшествующие правила: точка с запятой никогда не вставляется автоматически, если бы эту точку пришлось потом обработать бы как пустую инструкцию или если бы эта точка с запятой стала одной из точек с запятой в заголовке инструкции for (раздел 12.6.3).

ЗАМЕЧАНИЕ
Ниже перечислены все ограниченные правила в грамматике:

ПостфиксноеВыражение :
ЛевостороннееВыражение [здесь нет КонцаСтроки] ++
ЛевостороннееВыражение [здесь нет КонцаСтроки] --
ИнструкцияContinue :
continue [здесь нет КонцаСтроки] Идентификаторопц ;
ИнструкцияBreak :
break [здесь нет КонцаСтроки] Идентификаторопц ;
ИнструкцияReturn :
return [здесь нет КонцаСтроки] Выражениеопц ;
ИнструкцияThrow :
throw [здесь нет КонцаСтроки] Выражение ;

На практике эффект от этих ограниченных правил следующий:

  • Когда токен ++ или -- встречается там, где парсер обработал бы его как постфиксный оператор, и хотя бы один КонецСтроки встретился между предшествующим токеном и токеном ++ или --, то точка с запятой автоматически вставляется перед токеном ++ или --.
  • Когда встречаются токены continue, break, return или throw и КонецСтроки отделяет их от следующего токена, точка с запятой автоматически вставляется после токенов continue, break, return или throw.

Итоговые практические советы программистам на ECMAScript таковы:

  • Постфиксный оператор ++ или -- должен появляться на той же строке, что и его операнд.
  • Выражение в инструкциях return или throw должно начинаться на той же строке, что и токен return или throw.
  • Метка в инструкцииях break или continue должна находиться на той же строке, что и токен break или continue.
7.9.2 Примеры автоматической вставки точек с запятой

Исходный текст

{ 1 2 } 3

не является корректным предложением в грамматике ECMAScript, даже с учётом правил автоматической вставки точек с запятой. Напротив, исходный текст

{ 1
2 } 3

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

{ 1
;2 ;} 3;

который является корректным предложением ECMAScript.

Исходный текст

for (a; b
)

не является корректным предложением ECMAScript и не изменяется правилами автоматической вставки точек с запятой, так как точка с запятой подставилась бы в заголовок инструкции for. Автоматическая вставка точек с запятой никогда не вставляет одну или более точек с запятой в заголовок инструкции for.

Исходный текст

return
a + b

преобразуется правилами автоматической вставки точек с запятой в следующий:

return;
a + b;

ЗАМЕЧАНИЕ
Выражение a + b не используется в качестве значения, возвращаемого инструкцией return, так как "КонецСтроки" отделяет его от токена return.

Исходный текст

a = b
++c

преобразуется правилами автоматической вставки точек с запятой в следующий:

a = b;
++c;

ЗАМЕЧАНИЕ
Токен ++ не принимается за постфиксный оператор, применённый к переменной b, поскольку "КонецСтроки" разделяет b и ++.

Исходный текст

if (a > b)
else c = d

не является корректным предложением ECMAScript и не изменяется правилами автоматической вставки точек с запятой перед токеном else, несмотря на то, что ни одно из правил грамматики не применимо в данной точке, потому что автоматически вставленная точка с запятой была бы затем распознана как пустое выражение.

Исходный текст

a = b + c
(d + e).print()

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

a = b +c(d + e).print()

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


Автор: Гость (не зарегистрирован), дата: 29 октября, 2011 - 18:16
#permalink

Почему

return
a + b

разделяется точкой с запятой, разве a + b является токеном-нарушителем? Чем это отличается от случая:

a = b + c
(d + e).print()

?


Автор: Гость (не зарегистрирован), дата: 12 августа, 2013 - 15:46
#permalink

Кредитный портал Dengi-Vdolg.Com - это деньги взаймы за 5 минут


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
1 + 12 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum