diff --git a/translated/issues-7.html b/translated/issues-7.html index 172cb8dc9b..065a556b62 100644 --- a/translated/issues-7.html +++ b/translated/issues-7.html @@ -1,84 +1,84 @@ -

Notational Conventions

+

符号约定

-

Syntactic and Lexical Grammars

+

语法与词法

-

Context-Free Grammars

-

A context-free grammar consists of a number of productions. Each production has an abstract symbol called a nonterminal as its left-hand side, and a sequence of zero or more nonterminal and terminal symbols as its right-hand side. For each grammar, the terminal symbols are drawn from a specified alphabet.

-

A chain production is a production that has exactly one nonterminal symbol on its right-hand side along with zero or more terminal symbols.

-

Starting from a sentence consisting of a single distinguished nonterminal, called the goal symbol, a given context-free grammar specifies a language, namely, the (perhaps infinite) set of possible sequences of terminal symbols that can result from repeatedly replacing any nonterminal in the sequence with a right-hand side of a production for which the nonterminal is the left-hand side.

+

上下文无关文法

+

上下文无关文法由多个产生式组成。每个产生式左侧有一个称为非终结符的抽象符号的左值,右侧有一个或多个非终结符和终结符号组成的序列的右值。任何文法,它的终结符都来自指定的字母集。

+

一个产生式链是一个只含有一个非终结符以及 0 个或多个终结符作为其右值的产生式。

+

句子中单一可区分的非终结符——目标符,给定一个语言上下文无关文法。换句话说,重复用产生式右值替换序列中任何左值为非终结符所组成的终结符序列集合(可能是无限个)。

-

The Lexical and RegExp Grammars

-

A lexical grammar for ECMAScript is given in clause . This grammar has as its terminal symbols Unicode code points that conform to the rules for |SourceCharacter| defined in . It defines a set of productions, starting from the goal symbol |InputElementDiv|, |InputElementTemplateTail|, or |InputElementRegExp|, or |InputElementRegExpOrTemplateTail|, that describe how sequences of such code points are translated into a sequence of input elements.

-

Input elements other than white space and comments form the terminal symbols for the syntactic grammar for ECMAScript and are called ECMAScript tokens. These tokens are the reserved words, identifiers, literals, and punctuators of the ECMAScript language. Moreover, line terminators, although not considered to be tokens, also become part of the stream of input elements and guide the process of automatic semicolon insertion (). Simple white space and single-line comments are discarded and do not appear in the stream of input elements for the syntactic grammar. A |MultiLineComment| (that is, a comment of the form `/*`…`*/` regardless of whether it spans more than one line) is likewise simply discarded if it contains no line terminator; but if a |MultiLineComment| contains one or more line terminators, then it is replaced by a single line terminator, which becomes part of the stream of input elements for the syntactic grammar.

-

A RegExp grammar for ECMAScript is given in . This grammar also has as its terminal symbols the code points as defined by |SourceCharacter|. It defines a set of productions, starting from the goal symbol |Pattern|, that describe how sequences of code points are translated into regular expression patterns.

-

Productions of the lexical and RegExp grammars are distinguished by having two colons “::” as separating punctuation. The lexical and RegExp grammars share some productions.

+

词法与正则文法

+

ECMAScript 词法文法 给出。词法文法拥有符合 定义的 |SourceCharacter| 规则的终结符 Unicode 码点。它定义了一套产生式,从目标符 |InputElementDiv|, |InputElementTemplateTail|,或 |InputElementRegExp|, |InputElementRegExpOrTemplateTail| 起始,描述如何将这样的字符序列翻译成一个输入元素序列。

+

空白和注释之外的输入元素构成 ECMAScript 语法文法的终结符,它们被称为 ECMAScript tokens。这些 tokens 是,ECMAScript 语言的保留字,标识符,字面量,标点符号。此外,行结束符虽然不被视为 tokens,但会成为输入元素流的一部分,用于引导处理自动插入分号()。单个空白和单行注释会的丢弃,不会出现在语法文法的输入元素的流中。如果一个 |MultiLineComment|(即形式为 `/*`…`*/` 的注释,不管是否跨越多行)不包含行结束符也会直接地丢弃,但如果一个 |MultiLineComment| 包含一个或多个结束符,那么,注释会被替换为一个行结束符,成为语法文法输入元素流的一部分。

+

给出了 ECMAScript 的正则文法。此文法的终结符字符也由 |SourceCharacter| 定义。它定义了一套产生式,从目标符 |Pattern| 起始,描述了如何将这样的字符序列翻译成一个正则表达式模式。

+

两个冒号 "::" 作为分隔符分割词法和正则的文法产生式。词法和正则的文法共享某些产生式。

-

The Numeric String Grammar

-

Another grammar is used for translating Strings into numeric values. This grammar is similar to the part of the lexical grammar having to do with numeric literals and has as its terminal symbols |SourceCharacter|. This grammar appears in .

-

Productions of the numeric string grammar are distinguished by having three colons “:::” as punctuation.

+

数字字符串文法

+

用于转换字符串为数字值的一种文法。此文法与数字字面量词法文法的一部分类似,并且有终结符 |SourceCharacter|。此文法出现在

+

三个冒号 ":::" 作为分隔符分割数字字符串文法的产生式。

-

The Syntactic Grammar

-

The syntactic grammar for ECMAScript is given in clauses 11, 12, 13, 14, and 15. This grammar has ECMAScript tokens defined by the lexical grammar as its terminal symbols (). It defines a set of productions, starting from two alternative goal symbols |Script| and |Module|, that describe how sequences of tokens form syntactically correct independent components of ECMAScript programs.

-

When a stream of code points is to be parsed as an ECMAScript |Script| or |Module|, it is first converted to a stream of input elements by repeated application of the lexical grammar; this stream of input elements is then parsed by a single application of the syntactic grammar. The input stream is syntactically in error if the tokens in the stream of input elements cannot be parsed as a single instance of the goal nonterminal (|Script| or |Module|), with no tokens left over.

-

When a parse is successful, it constructs a parse tree, a rooted tree structure in which each node is a Parse Node. Each Parse Node is an instance of a symbol in the grammar; it represents a span of the source text that can be derived from that symbol. The root node of the parse tree, representing the whole of the source text, is an instance of the parse's goal symbol. When a Parse Node is an instance of a nonterminal, it is also an instance of some production that has that nonterminal as its left-hand side. Moreover, it has zero or more children, one for each symbol on the production's right-hand side: each child is a Parse Node that is an instance of the corresponding symbol.

-

Productions of the syntactic grammar are distinguished by having just one colon “:” as punctuation.

-

The syntactic grammar as presented in clauses 12, 13, 14 and 15 is not a complete account of which token sequences are accepted as a correct ECMAScript |Script| or |Module|. Certain additional token sequences are also accepted, namely, those that would be described by the grammar if only semicolons were added to the sequence in certain places (such as before line terminator characters). Furthermore, certain token sequences that are described by the grammar are not considered acceptable if a line terminator character appears in certain “awkward” places.

-

In certain cases, in order to avoid ambiguities, the syntactic grammar uses generalized productions that permit token sequences that do not form a valid ECMAScript |Script| or |Module|. For example, this technique is used for object literals and object destructuring patterns. In such cases a more restrictive supplemental grammar is provided that further restricts the acceptable token sequences. Typically, an early error rule will then define an error condition if "_P_ cannot be reparsed as an _N_", where _P_ is a Parse Node (an instance of the generalized production) and _N_ is a nonterminal from the supplemental grammar. Here, the sequence of tokens originally matched by _P_ is parsed again using _N_ as the goal symbol. (If _N_ takes grammatical parameters, then they are set to the same values used when _P_ was originally parsed.) An error occurs if the sequence of tokens cannot be parsed as a single instance of _N_, with no tokens left over. Subsequently, algorithms access the result of the parse using a phrase of the form "the result of reparsing _P_ as an _N_". This will always be a Parse Node (an instance of _N_), since any parsing failure would have been detected by an early error rule.

+

语法文法

+

第 11,12,13,14,15 章给出了 ECMAScript 的语法文法。词法文法定义的 ECMAScript tokens 是此文法的终结符()。它定义了一系列的产生式,从两个可选的目标符号 |Script| 以及 |Module| 开始,描述了形成 ECMAScript 程序语法上正常的独立的组件的 token 是怎样的序列。

+

当一个码点流解析成一个 ECMAScript 的 |Script| 或者 |Module| 时,它首先被词法文法程序转换成一个输入元素流;然后使用一个单一语法文法程序解析这个输入元素流。存在语法错误 —— 输入元素流中的 token 不能被解析成一个单一的目标非终结符(|Script| 或者 |Module|)—— 的输入流,将不会留下任何 token。

+

当一个解析成功的时候,它会构造一颗解析树,一颗根树结构是它的每个节点都是一个 Parse Node。每个 Parse Node 都是文法中的一个符号的一个实例。它代表了从这样的符号中派生出来的源代码文本的一个跨度。解析树的根节点代表着整个的源代码文本,是解析的目标符的一个实例。当一个 Parse Node 是一个非终结符的实例的时候,它也是某些左值为非终结符的产生式的一个实例。此外,它有 0 个或多个孩子,产生式右值中的每个符号:每个孩子的 Parse Node 都是相应符号的一个实例。

+

只用一个冒号 “:” 作为分隔符分割语法词法的产生式。

+

语法文法在条款 12,13,14,15 中提出。但是对于哪些 token 序列是正确被 ECMAScript |Script| 或者 |Module| 接受的解释得并不完整。一些额外的 token 序列也能被接受,换句话说,那些序列将会被文法描述,只要分号被加入到序列中的某些地方(比如在行终结符之前)。此外,某些通过文法描述的 token 序列不会被接受,如果一个行终结符出现在某些 “awkward” 的地方。

+

在某些情况下,为了避免歧义,语法文法使用广义的产生式,允许 token 序列形成一个不合法的 ECMAScript |Script| 或者 |Module|。例如,此技术被用作对象字面量和对象解构模式中。在这种情况下,提供了更加限制性的补充文法,其进一步限制可接受的 token 序列。通常,如果 "_P_ 不能像一个 _N_ 被重解析",则一个早期错误规则将会定义一个错误条件,其中 _P_ 是 Parse Node(普通产生式的一个实例),_N_ 是补充文法的非终结符。这里,最初与 _P_ 匹配的 token 序列被再次用 _N_ 作为目标符号解析。(如果 _N_ 使用语法参数,则将它们设置为当 _P_ 最初解析时使用的相同值)。如果 token 序列不能被解析为 _N_ 的一个单一实例,则会产生错误,将不会留下任何 token。随后,算法访问"像一个 _N_ 重新解析 _P_ 的结果"的短语的解析结果。这将始终是一个解析节点(_N_ 的一个实例),因此任何解析失败都将被一个早期错误规则检测到。

-

Grammar Notation

-

Terminal symbols of the lexical, RegExp, and numeric string grammars are shown in `fixed width` font, both in the productions of the grammars and throughout this specification whenever the text directly refers to such a terminal symbol. These are to appear in a script exactly as written. All terminal symbol code points specified in this way are to be understood as the appropriate Unicode code points from the Basic Latin range, as opposed to any similar-looking code points from other Unicode ranges.

-

Nonterminal symbols are shown in italic type. The definition of a nonterminal (also called a “production”) is introduced by the name of the nonterminal being defined followed by one or more colons. (The number of colons indicates to which grammar the production belongs.) One or more alternative right-hand sides for the nonterminal then follow on succeeding lines. For example, the syntactic definition:

+

文法标记法

+

不管是在文法的产生式,还是在本规范中,词法文法,正则文法以及数字字符串文法的终结符都用等宽字体展示。这些将以的脚本形式出现。所有通过这种方式指定的终结符码点都被当作合适的基本拉丁语 Unicode 码点理解,而不是来自其他任何类似 Unicode 范围的码点。

+

非终结符以斜体显示。非终结符(也叫产生式)的定义由非终结符名称和其后定义的一个或多个冒号给出。(冒号的数量表示产生式所属的文法。)非终结符的一个或多个替代右值紧跟在下一行。例如,语法定义:

WhileStatement : `while` `(` Expression `)` Statement -

states that the nonterminal |WhileStatement| represents the token `while`, followed by a left parenthesis token, followed by an |Expression|, followed by a right parenthesis token, followed by a |Statement|. The occurrences of |Expression| and |Statement| are themselves nonterminals. As another example, the syntactic definition:

+

表示这个非终结符 |WhileStatement| 代表 `while` token,其后跟左括号 `token`,其后跟 |Expression|,其后跟右括号 `token`,其后跟 |Statement|。这里出现的 |Expression| 和 |Statement| 本身是非终结符。另一个例子,语法定义:

ArgumentList : AssignmentExpression ArgumentList `,` AssignmentExpression -

states that an |ArgumentList| may represent either a single |AssignmentExpression| or an |ArgumentList|, followed by a comma, followed by an |AssignmentExpression|. This definition of |ArgumentList| is recursive, that is, it is defined in terms of itself. The result is that an |ArgumentList| may contain any positive number of arguments, separated by commas, where each argument expression is an |AssignmentExpression|. Such recursive definitions of nonterminals are common.

-

The subscripted suffix “opt”, which may appear after a terminal or nonterminal, indicates an optional symbol. The alternative containing the optional symbol actually specifies two right-hand sides, one that omits the optional element and one that includes it. This means that:

+

表示这个 |ArgumentList| 可以代表一个 |AssignmentExpression|,或 |ArgumentList|,其后跟一个逗号,其后跟一个 |AssignmentExpression|。这个 |ArgumentList| 的定义是递归的,也就是说,它定义它自身。其结果是,一个 |ArgumentList| 可能包含用逗号隔开的任意正数个参数,每个参数表达式是一个 |AssignmentExpression|。这样,非终结符共用了递归的定义。

+

终结符或非终结符可能会出现后缀下标 “opt”,表示它是可选符号。包含可选符号实际指定了包含两个右值,一个是省略可选元素的,另一个是包含可选元素的。这意味着:

VariableDeclaration : BindingIdentifier Initializer? -

is a convenient abbreviation for:

+

是以下的一种简便的缩写:

VariableDeclaration : BindingIdentifier BindingIdentifier Initializer -

and that:

+

以及:

IterationStatement : `for` `(` LexicalDeclaration Expression? `;` Expression? `)` Statement -

is a convenient abbreviation for:

+

是以下的一种简便的缩写:

IterationStatement : `for` `(` LexicalDeclaration `;` Expression? `)` Statement `for` `(` LexicalDeclaration Expression `;` Expression? `)` Statement -

which in turn is an abbreviation for:

+

也是下面的一种缩写:

IterationStatement : `for` `(` LexicalDeclaration `;` `)` Statement @@ -86,89 +86,89 @@

Grammar Notation

`for` `(` LexicalDeclaration Expression `;` `)` Statement `for` `(` LexicalDeclaration Expression `;` Expression `)` Statement
-

so, in this example, the nonterminal |IterationStatement| actually has four alternative right-hand sides.

-

A production may be parameterized by a subscripted annotation of the form “[parameters]”, which may appear as a suffix to the nonterminal symbol defined by the production. “parameters” may be either a single name or a comma separated list of names. A parameterized production is shorthand for a set of productions defining all combinations of the parameter names, preceded by an underscore, appended to the parameterized nonterminal symbol. This means that:

+

所以在这个例子中,非终结符 |IterationStatement| 实际上有四个可供选择的右值。

+

产生式可以通过形如 “[parameters]” 这样的下标注释被参数化,会以后缀的形式出现在产生式定义的非终结符中。“parameters” 可以是单独的名称,也可以是一个逗号分隔的名称列表。被参数化的产生式是一系列定义参数名称以下划线开头,追加到参数化的非终结符后面的所有组合的产生式的缩写。这就意味着:

StatementList[Return] : - ReturnStatement + ReturnStatement ExpressionStatement -

is a convenient abbreviation for:

+

是下面的缩写:

StatementList : - ReturnStatement + ReturnStatement ExpressionStatement - + StatementList_Return : - ReturnStatement + ReturnStatement ExpressionStatement -

and that:

+

以及:

StatementList[Return, In] : - ReturnStatement + ReturnStatement ExpressionStatement -

is an abbreviation for:

+

是下面的缩写:

StatementList : - ReturnStatement + ReturnStatement ExpressionStatement StatementList_Return : - ReturnStatement + ReturnStatement ExpressionStatement StatementList_In : - ReturnStatement + ReturnStatement ExpressionStatement StatementList_Return_In : - ReturnStatement + ReturnStatement ExpressionStatement -

Multiple parameters produce a combinatory number of productions, not all of which are necessarily referenced in a complete grammar.

-

References to nonterminals on the right-hand side of a production can also be parameterized. For example:

+

多个参数产生数个产生式的组合,在一个完整语法中不必引用所有。

+

对生产式的非终结符右值的引用也可以被参数化,例如:

StatementList : - ReturnStatement + ReturnStatement ExpressionStatement[+In] -

is equivalent to saying:

+

是下面的缩写:

StatementList : - ReturnStatement + ReturnStatement ExpressionStatement_In -

and:

+

又如:

StatementList : - ReturnStatement + ReturnStatement ExpressionStatement[~In] -

is equivalent to:

+

是下面的缩写:

StatementList : ReturnStatement ExpressionStatement -

A nonterminal reference may have both a parameter list and an “opt” suffix. For example:

+

非终结符引用可能同时具有参数列表和一个 “opt” 后缀。例如:

VariableDeclaration : BindingIdentifier Initializer[+In]? -

is an abbreviation for:

+

是下面的缩写:

VariableDeclaration : BindingIdentifier BindingIdentifier Initializer_In -

Prefixing a parameter name with “?” on a right-hand side nonterminal reference makes that parameter value dependent upon the occurrence of the parameter name on the reference to the current production's left-hand side symbol. For example:

+

在右侧非终结符引用参数名称前置以 “?”,使该参数值取决于当前产生式的左侧符号引用的参数名称是否出现。例如:

VariableDeclaration[In] : BindingIdentifier Initializer[?In] -

is an abbreviation for:

+

是下面的缩写:

VariableDeclaration : BindingIdentifier Initializer @@ -176,13 +176,13 @@

Grammar Notation

VariableDeclaration_In : BindingIdentifier Initializer_In
-

If a right-hand side alternative is prefixed with “[+parameter]” that alternative is only available if the named parameter was used in referencing the production's nonterminal symbol. If a right-hand side alternative is prefixed with “[\~parameter]” that alternative is only available if the named parameter was not used in referencing the production's nonterminal symbol. This means that:

+

如果右值选择是以 “[+parameter]” 作为前缀,则表示选择只有命名参数用于引用产生式的非终结符时可用。如果右值选择是以 “[\~parameter]” 作为前缀,则表示选择只有命名参数不是用于引用产生式的非终结符时可用。这意味着:

StatementList[Return] : [+Return] ReturnStatement ExpressionStatement -

is an abbreviation for:

+

是下面的缩写:

StatementList : ExpressionStatement @@ -191,13 +191,13 @@

Grammar Notation

ReturnStatement ExpressionStatement
-

and that:

+

另外一个例子:

StatementList[Return] : [~Return] ReturnStatement ExpressionStatement -

is an abbreviation for:

+

是下面的缩写:

StatementList : ReturnStatement @@ -206,12 +206,12 @@

Grammar Notation

StatementList_Return : ExpressionStatement
-

When the words “one of” follow the colon(s) in a grammar definition, they signify that each of the terminal symbols on the following line or lines is an alternative definition. For example, the lexical grammar for ECMAScript contains the production:

+

在文法定义中当单词 “one of” 跟随一个或多个分号后的时候,表示随后的一行或多行的终结符是一个可选的定义。例如,ECMAScript的词法文法包含下列的产生式:

NonZeroDigit :: one of `1` `2` `3` `4` `5` `6` `7` `8` `9` -

which is merely a convenient abbreviation for:

+

它仅仅是下面的缩写:

NonZeroDigit :: `1` @@ -224,40 +224,40 @@

Grammar Notation

`8` `9`
-

If the phrase “[empty]” appears as the right-hand side of a production, it indicates that the production's right-hand side contains no terminals or nonterminals.

-

If the phrase “[lookahead ∉ _set_]” appears in the right-hand side of a production, it indicates that the production may not be used if the immediately following input token sequence is a member of the given _set_. The _set_ can be written as a comma separated list of one or two element terminal sequences enclosed in curly brackets. For convenience, the set can also be written as a nonterminal, in which case it represents the set of all terminals to which that nonterminal could expand. If the _set_ consists of a single terminal the phrase “[lookahead ≠ _terminal_]” may be used.

-

For example, given the definitions:

+

如果 “[empty]” 出现在一个产生式的右值,它暗示着这个产生式的右值不包含终结符或者非终结符。

+

如果 “[lookahead ∉ _set_]” 出现在一个产生式的右值,它暗示着如果随后立即的输入的token序列是给出的集合(_set_)的成员,那么这个产生式也许不会被使用。这个集合可以用一个逗号分割的由一到两个被花括号包裹的元素终结序列的列表表示。为了方便,这个集合也可以用非终结符表示,在这种情况下,它代表所有能由非终结符展开得到的终结符的集合。如果这个集合包含一个单独的终结符,那么短语 “[lookahead ≠ _terminal_]” 也许会被使用。

+

例如,给出定义:

DecimalDigit :: one of - `0` `1` `2` `3` `4` `5` `6` `7` `8` `9` + `0` `1` `2` `3` `4` `5` `6` `7` `8` `9` DecimalDigits :: DecimalDigit DecimalDigits DecimalDigit -

the definition:

+

则定义:

LookaheadExample :: `n` [lookahead <! {`1`, `3`, `5`, `7`, `9`}] DecimalDigits DecimalDigit [lookahead <! DecimalDigit] -

matches either the letter `n` followed by one or more decimal digits the first of which is even, or a decimal digit not followed by another decimal digit.

-

Similarly, if the phrase “[lookahead ∈ _set_]” appears in the right-hand side of a production, it indicates that the production may only be used if the immediately following input token sequence is a member of the given _set_. If the _set_ consists of a single terminal the phrase “[lookahead = _terminal_]” may be used.

-

If the phrase “[no |LineTerminator| here]” appears in the right-hand side of a production of the syntactic grammar, it indicates that the production is a restricted production: it may not be used if a |LineTerminator| occurs in the input stream at the indicated position. For example, the production:

+

能匹配字母 n 后跟随由偶数起始的一个或多个十进制数字,或一个十进制数字后面跟随一个非十进制数字。

+

类似的,如果产生式的右值出现 “[lookahead ∈ _set_]”,则表示产生式只有在随后立即的输入的token序列是给出的集合(_set_)的成员才能使用。如果集合只包含一个单一的终结符,则可以使用 “[lookahead == _terminal_]”。

+

如果产生式的右侧出现 “[no |LineTerminator| here]”,那么它表示此产生式是个受限的产生式:如果 |LineTerminator| 在输入流的指定位置出现,那么此产生式将不会被适用。例如,产生式:

ThrowStatement : `throw` [no LineTerminator here] Expression `;` -

indicates that the production may not be used if a |LineTerminator| occurs in the script between the `throw` token and the |Expression|.

-

Unless the presence of a |LineTerminator| is forbidden by a restricted production, any number of occurrences of |LineTerminator| may appear between any two consecutive tokens in the stream of input elements without affecting the syntactic acceptability of the script.

-

When an alternative in a production of the lexical grammar or the numeric string grammar appears to be a multi-code point token, it represents the sequence of code points that would make up such a token.

-

The right-hand side of a production may specify that certain expansions are not permitted by using the phrase “but not” and then indicating the expansions to be excluded. For example, the production:

+

如果一个 |LineTerminator| 出现在脚本的 `throw` token 和 |Expression| 之间的时候,暗示着这个产生式也许不会被使用。

+

除非通过一个受限的产生式禁止一个 |LineTerminator| 的出现,否则任意数量 |LineTerminator| 的出现也许会发生在输入元素流中任意两个连续的 token 之间,并且不影响脚本的语义可接受性。

+

当一个词法文法或者数字字符串文法的产生式中可选部分出现多码点的 token 时,意味着码点序列将会组成一个 token。

+

一个产生式的右值也许会通过 “but not” 指定某些不被允许的扩展,然后暗示这个扩展将是被排除在外的。例如,产生式:

Identifier :: IdentifierName but not ReservedWord -

means that the nonterminal |Identifier| may be replaced by any sequence of code points that could replace |IdentifierName| provided that the same sequence of code points could not replace |ReservedWord|.

-

Finally, a few nonterminal symbols are described by a descriptive phrase in sans-serif type in cases where it would be impractical to list all the alternatives:

+

意味着非终结符 |Identifier| 也许会被任意的码点序列替换,这些码点能够替换提供的 |IdentifierName|,但是相同序列的码点不能替换 |ReservedWord|。

+

最后,一些非终结符通过 sans-serif 字体书写的描述性的短语来描述, 在这样的案例中,列出所有的可选部分是不切实际的。

SourceCharacter :: > any Unicode code point