

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 指令碼格式
<a name="grammar-ecmascript-spec"></a>

Amazon Lex V2 支援下列 ECMAScript 功能來定義文法。

在文法中指定標籤時，Amazon Lex V2 支援下列 ECMAScript 功能。在文法中使用 ECMAScript 標籤`semantics/1.0`時， `tag-format` 必須傳送至 。如需詳細資訊，請參閱 [ECMA-262 ECMAScript 2021 語言規格。 ](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)

```
<grammar version="1.0"
xmlns="http://www.w3.org/2001/06/grammar"
xml:lang="en-US"
tag-format="semantics/1.0"
root="card_number">
```

**Topics**
+ [變數陳述式](ecma-variable.md)
+ [表達式](ecma-expression.md)
+ [如果陳述式](ecma-if.md)
+ [切換陳述式](ecma-switch.md)
+ [函數宣告](ecma-function.md)
+ [迭代陳述式](ecma-iteration.md)
+ [區塊陳述式](ecma-block.md)
+ [說明](ecma-comments.md)
+ [不支援的陳述式](ecma-unsupported.md)

本文件包含來自 ECMAScript 標準的資料 （可在 https：//[https://www.ecma-international.org/publications-and-standards/standards/ecma-262/ ](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)取得）。ECMAScript 語言規格文件可透過下列授權從 Ecma International 取得。

## 授權文字
<a name="ecma-license"></a>

© 2020 Ecma International

本文件可以複製、發佈和分發給其他人，且其某些衍生著作可以全部或部分準備、複製、發佈和分發，但前提是上述著作權聲明和此著作權授權和免責聲明包含在所有此類副本和衍生著作中。此著作權授權和免責聲明允許的唯一衍生著作為：

(i) 為提供評論或說明 （例如文件的註釋版本） 而納入本文件的全部或部分，

(ii) 運作方式包含本文件的全部或部分，目的是整合提供可存取性的功能，

(iii) 本文件翻譯成英文以外的語言，以及不同的格式和 

(iv) 透過在標準合規產品中實作 （例如，透過完全或部分複製和貼上） 功能，在標準合規產品中使用此規格。

不過，本文件本身的內容不得以任何方式修改，包括移除 Ecma International 的著作權聲明或參考，除非需要將其翻譯為英文以外的語言或翻譯為不同的格式。

Ecma International 文件的官方版本是 Ecma International 網站上的英文版本。如果翻譯版本與官方版本之間存在差異，應以官方版本為準。

上述授予的有限許可是永久的，不會由 Ecma International 或其繼承者或指派者撤銷。本文件和本文包含的資訊以「原狀」為基礎提供，ECMA 國際不提供任何明示或暗示的保證，包括但不限於使用本文資訊的任何保證不會侵犯任何所有權或對適銷性或特定用途適用性的任何暗示保證。」

# 變數陳述式
<a name="ecma-variable"></a>

變數陳述式會定義一或多個變數。

```
var x = 10;
var x = 10, var y = <expression>;
```

# 表達式
<a name="ecma-expression"></a>

您可以新增表達式字串以在 Amazon Lex V2 中執行函數。此資料表顯示可用於 SRGS 表達式的語法和範例。


| 表達式類型 | 語法 | 範例 | 支援？ | 
| --- | --- | --- | --- | 
| 規則表達式常值 | 包含有效 [regex 特殊字元](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions)的字串常值 | <pre>"^\d\.$"</pre> | 否 | 
| 函式 | function functionName(parameters) \$1 functionBody\$1 | <pre>var x = function calc() {<br />    return 10;<br />}</pre> | 否 | 
| 刪除 | delete expression | <pre>delete obj.property;</pre> | 否 | 
| Void | void expression | <pre>void (2 == '2');</pre> | 否 | 
| 的類型 | typeof expression | <pre>typeof 42;</pre> | 否 | 
| 成員索引 | expression [ expressions ] | <pre>var fruits = ["apple"];<br />fruits[0];</pre> | 是 | 
| 成員點 | expression . identifier | <pre>out.value</pre> | 是 | 
| 引數 | expression (arguments) | <pre>new Date('1994-10-11')</pre> | 是 | 
| 後增量 | expression\$1\$1 | <pre>var x=10; x++;</pre> | 是 | 
| 遞減後 | expression-- | <pre>var x=10; x--;</pre> | 是 | 
| 預先遞增 | \$1\$1expression | <pre>var x=10; ++x;</pre> | 是 | 
| 遞減前 | --expression | <pre>var x=10; --x;</pre> | 是 | 
| Unary 加 / Unary 減號 | \$1expression / -expression | <pre>+x / -x;</pre> | 是 | 
| 位元不是 | \$1 expression | <pre>const a = 5;<br />console.log( ~a );</pre> | 是 | 
| 邏輯而非 | \$1 expression | <pre>!(a > 0 || b > 0)</pre> | 是 | 
| 乘法 | expression ('\$1' \$1 '/' \$1 '%') expression | <pre>(x + y) * (a / b)</pre> | 是 | 
| 附加項目 | expression ('\$1' \$1 '-') expression | <pre>(a + b) - (a - (a + b))</pre> | 是 | 
| 位元轉移 | expression ('<<' \$1 '>>' \$1 '>>>') expression | <pre>(a >> b) >>> c</pre> | 是 | 
| 相對 | expression ('<' \$1 '>' \$1 '<=' \$1 '>=') expression | <pre>if (a > b) { ... }</pre> | 是 | 
| In (入) | expression in expression | <pre>fruits[0] in otherFruits;</pre> | 是 | 
| 等式 | expression ('==' \$1 '\$1=' \$1 '===' \$1 '\$1===') expression | <pre>if (a == b) { ... }</pre> | 是 | 
| 位元和 / xor / 或 | expression ('&' \$1 '^' \$1 '\$1') expression | <pre>a & b / a ^ b / a | b</pre> | 是 | 
| 邏輯和/或 | expression ('&&' \$1 '\$1\$1') expression | <pre>if (a && (b ||c)) { ...}</pre> | 是 | 
| Ternary  | expression ? expression : expression | <pre>a > b ? obj.prop : 0</pre> | 是 | 
| 指派 | expression = expression | <pre>out.value = "string";</pre> | 是 | 
| 指派運算子 | expression ('\$1=' \$1 '/=' \$1 '\$1=' \$1 '-=' \$1 '%=') expression  | <pre>a *= 10;</pre> | 是 | 
| 指派位元運算子 | expression ('<<=' \$1 '>>=' \$1 '>>>=' \$1 '&=' \$1 '^=' \$1 '\$1=') expression | <pre>a <<= 10;</pre> | 是 | 
| 識別符 | identifierSequence 其中 identifierSequence 是[有效字元](https://developer.mozilla.org/en-US/docs/Glossary/Identifier)的序列 | <pre>fruits=[10, 20, 30];</pre> | 是 | 
| Null 常值 | null | <pre>x = null;</pre> | 是 | 
| 布林值常值 | true \$1 false | <pre>x = true;</pre> | 是 | 
| 字串常值 | 'string' / "string" | <pre>a = 'hello',<br />b = "world";</pre> | 是 | 
| 十進位常值 | integer [.] digits [exponent] | <pre>111.11 e+12</pre> | 是 | 
| 十六進位常值 | 0 (x \$1 X)[0-9a-fA-F] | <pre>0x123ABC</pre> | 是 | 
| 八進位常值 | O [0-7] | <pre>"O51"</pre> | 是 | 
| 陣列常值 | [ expression, ... ] | <pre>v = [a, b, c];</pre> | 是 | 
| 物件常值 | \$1property: value, ...\$1 | <pre>out = {value: 1, flag: false};</pre> | 是 | 
| 親子化 | ( expressions ) | <pre>x + (x + y)</pre> | 是 | 

# 如果陳述式
<a name="ecma-if"></a>

如果陳述式要在 Amazon Lex V2 中執行函數，您可以新增 。此範例顯示可用於 SRGS 表達式的語法。

```
if (expressions) {
    statements;
} else {
    statements;
}
```

**注意：**在上述範例中， `expressions`和 `statements` 必須是本文件中支援的其中一個。

# 切換陳述式
<a name="ecma-switch"></a>

您可以新增切換陳述式以在 Amazon Lex V2 中執行函數。此範例顯示可用於 SRGS 表達式的語法。

```
switch (expression) {
    case (expression):
     statements
     .
     .
     .
   default:
      statements
}
```

**注意：**在上述範例中， `expressions`和 `statements` 必須是本文件中支援的其中一個。

# 函數宣告
<a name="ecma-function"></a>

您可以新增函數宣告以在 Amazon Lex V2 中執行函數。此範例顯示可用於 SRGS 表達式的語法。

```
function functionIdentifier([parameterList, ...]) {
     <function body>
}
```

# 迭代陳述式
<a name="ecma-iteration"></a>

反覆運算陳述式可以是下列任一項：

```
// Do..While statement
do {
   statements
} while (expressions)


// While Loop
while (expressions) {
   statements
}

// For Loop
for ([initialization]; [condition]; [final-expression])
   statement

// For..In
for (variable in object) {
  statement
}
```

# 區塊陳述式
<a name="ecma-block"></a>

您可以新增陳述式區塊以在 Amazon Lex V2 中執行函數。此範例顯示可用於 SRGS 表達式的語法。

```
{
   statements
}

// Example
{
    x = 10;
   if (x > 10) {
     console.log("greater than 10");
   }
}
```

**注意：**在上述範例中， 區塊中`statements`提供的 必須是本文件中其中一個支援的 。

# 說明
<a name="ecma-comments"></a>

您可以在 Amazon Lex V2 中新增註解。此範例顯示可用於 SRGS 表達式的語法。

```
// Single Line Comments
"// <comment>"

// Multineline comments
/**
<comment>
**/
```

# 不支援的陳述式
<a name="ecma-unsupported"></a>

Amazon Lex V2 不支援下列 ECMAScript 功能。

**Topics**
+ [空白陳述式](#ecma-unsupported-empty)
+ [繼續陳述式](#ecma-unsupported-continue)
+ [Break 陳述式](#ecma-unsupported-break)
+ [傳回陳述式](#ecma-unsupported-return)
+ [擲回陳述式](#ecma-unsupported-throw)
+ [嘗試陳述式](#ecma-unsupported-try)
+ [Debugger 陳述式](#ecma-unsupported-debugger)
+ [已標記的陳述式](#ecma-unsupported-labelled)
+ [類別宣告](#ecma-unsupported-class)

## 空白陳述式
<a name="ecma-unsupported-empty"></a>

空白陳述式用於不提供任何陳述式。以下是空白陳述式的語法：

```
;
```

## 繼續陳述式
<a name="ecma-unsupported-continue"></a>

支援沒有標籤的繼續陳述式[迭代陳述式](ecma-iteration.md)。不支援具有標籤的繼續陳述式。

```
// continue with label
// this allows the program to jump to a
// labelled statement (see labelled statement below)
continue <label>;
```

## Break 陳述式
<a name="ecma-unsupported-break"></a>

支援沒有標籤的中斷陳述式[迭代陳述式](ecma-iteration.md)。不支援具有標籤的中斷陳述式。

```
// break with label
// this allows the program to break out of a
// labelled statement (see labelled statement below)
break <label>;
```

## 傳回陳述式
<a name="ecma-unsupported-return"></a>

```
return expression;
```

## 擲回陳述式
<a name="ecma-unsupported-throw"></a>

擲回陳述式用於擲回使用者定義的例外狀況。

```
throw expression;
```

## 嘗試陳述式
<a name="ecma-unsupported-try"></a>

```
try {
  statements
}
catch (expression) {
  statements
}
finally {
  statements
}
```

## Debugger 陳述式
<a name="ecma-unsupported-debugger"></a>

除錯器陳述式用於叫用環境提供的除錯功能。

```
debugger;
```

## 已標記的陳述式
<a name="ecma-unsupported-labelled"></a>

標記的陳述式可與 `break`或 `continue`陳述式搭配使用。

```
label:
   statements


// Example
let str = '';

loop1:
for (let i = 0; i < 5; i++) {
  if (i === 1) {
    continue loop1;
  }
  str = str + i;
}

console.log(str);
```

## 類別宣告
<a name="ecma-unsupported-class"></a>

```
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}
```