| # Copyright 2017 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # Elementary building blocks: |
| |
| # Empty |
| " " |
| |
| # Tokens |
| "(" |
| ")" |
| "[" |
| "]" |
| "{" |
| "}" |
| ":" |
| ";" |
| "." |
| "..." |
| "?" |
| "++" |
| "--" |
| "=>" |
| "!" |
| "=" |
| "|=" |
| "^=" |
| "&=" |
| "<<=" |
| ">>=" |
| ">>>=" |
| "+=" |
| "-=" |
| "*=" |
| "/=" |
| "%=" |
| "**=" |
| "," |
| "||" |
| "&&" |
| "|" |
| "^" |
| "&" |
| "<<" |
| ">>" |
| ">>>" |
| "+" |
| "-" |
| "*" |
| "/" |
| "%" |
| "**" |
| "==" |
| "!=" |
| "===" |
| "!==" |
| "<" |
| ">" |
| "<=" |
| ">=" |
| "!" |
| "~" |
| |
| # Keywords, contextual keywords, literals, reserved words. |
| "__proto__" |
| "anonymous" |
| "arguments" |
| "as" |
| "async" |
| "await" |
| "break" |
| "case" |
| "catch" |
| "class" |
| "const" |
| "constructor" |
| "continue" |
| "debugger" |
| "default" |
| "delete" |
| "do" |
| "else" |
| "enum" |
| "eval" |
| "export" |
| "extends" |
| "false" |
| "finally" |
| "for" |
| "from" |
| "function" |
| "get" |
| "if" |
| "import" |
| "in" |
| "instanceof" |
| "let" |
| "name" |
| "new" |
| "null" |
| "of" |
| "prototype" |
| "return" |
| "sent" |
| "set" |
| "static" |
| "super" |
| "switch" |
| "target" |
| "this" |
| "throw" |
| "true" |
| "try" |
| "typeof" |
| "undefined" |
| "var" |
| "void" |
| "while" |
| "with" |
| |
| # TODO(marja): Add names of known classes. |
| |
| # Separators |
| "\n" |
| "; " |
| $0 "\n" |
| $0 "; " |
| |
| $0 "," $1 |
| "(" $0 ")" |
| |
| # Identifiers |
| "foo" |
| "bar" |
| "a" |
| "b" |
| "c" |
| |
| # Other literals |
| "0" |
| "0.0" |
| |
| # TODO(marja): Add strings and numbers! And quotes. |
| |
| # Other meaningful words from the spec |
| "new.target" |
| |
| # More complicated building blocks |
| |
| # Block, object, or binding pattern |
| "{" $0 "}" |
| "{" $0 ": " $1 "}" |
| |
| # Array or array binding pattern |
| "[" $0 "]" |
| |
| # Rest element or rest parameter |
| "..." |
| "..." $0 |
| |
| # Variable declarations |
| "let" $0 "=" $1 ";" |
| "const " $0 "=" $1 ";" |
| "var" $0 "=" $1 ";" |
| |
| # Return statements |
| "return" $0 |
| "return" $0 ";" |
| |
| # If statements |
| "if (" $0 ")" $1 |
| "if (" $0 ") {" $1 "}" |
| "if (" $0 ") {" $1 "} else {" $2 "}" |
| "if (" $0 ")" $1 "else" $2 |
| |
| # Iteration statements |
| "do" $0 "while (" $1 ");" |
| "for (" $0 ")" $1 |
| "for (" $0 ") {" $1 " }" |
| "for (" $0 "in" $1 ")" $2 |
| "for (" $0 "in" $1 ") {" $2 "}" |
| "for (" $0 "of" $1 ")" $2 |
| "for (" $0 "of" $1 ") {" $2 "}" |
| "for (" $0 ";" $1 ";" $2 ")" $3 |
| "for (" $0 ";" $1 ";" $2 ") {" $3 "}" |
| "for await (" $0 ")" $1 |
| "for await (" $0 ") {" $1 " }" |
| "for await (" $0 "in" $1 ")" $2 |
| "for await (" $0 "in" $1 ") {" $2 "}" |
| "for await (" $0 "of" $1 ")" $2 |
| "for await (" $0 "of" $1 ") {" $2 "}" |
| "for await (" $0 ";" $1 ";" $2 ")" $3 |
| "for await (" $0 ";" $1 ";" $2 ") {" $3 "}" |
| "while (" $0 ")" $1 |
| "while (" $0 ") {" $1 "}" |
| "continue" |
| "continue;" |
| "continue" $0 |
| "break" |
| "break;" |
| "break" $0 |
| |
| # With statements |
| "with (" $0 ")" $1 |
| "with (" $0 ") {" $1 "}" |
| |
| # Switch statements |
| "switch (" $0 ")" $1 |
| "switch (" $0 ") {" $1 "}" |
| "case" $0 ": " $1 |
| "case" $0 ": {" $1 "}" |
| "default :" $0 |
| |
| # Try-catch statements |
| "try" $0 "catch (" $1 ")" $2 |
| "try {" $0 "} catch (" $1 ") {" $2 "}" |
| "try" $0 "finally (" $1 ")" $2 |
| "try {" $0 "} finally (" $1 ") {" $2 "}" |
| "try" $0 "catch (" $1 ")" $2 "finally" $3 |
| "try {" $0 "} catch (" $1 ") {" $2 "} finally {" $3 "}" |
| |
| # Functions and arrow functions |
| "function" $0 "(" $1 ") {" $2 "}" |
| "function" "(" $0 ") {" $1 "}" |
| $0 "=>" $1 |
| $0 "=> {" $1 "}" |
| "(" $0 ") => {" $1 "}" |
| "(" $0 ") =>" $1 |
| |
| # Strict functions and arrow functions |
| "function" $0 "(" $1 ") { 'use strict';" $2 "}" |
| "function" "(" $0 ") { 'use strict';" $1 "}" |
| $0 "=> { 'use strict';" $1 "}" |
| "(" $0 ") => { 'use strict'; " $1 "}" |
| |
| # Methods |
| $0 "(" $1 ") {" $1 "}" |
| "get" $0 "(" $1 ") {" $1 "}" |
| "set" $0 "(" $1 ") {" $1 "}" |
| "static" $0 "(" $1 ") {" $1 "}" |
| "static get" $0 "(" $1 ") {" $1 "}" |
| "static set" $0 "(" $1 ") {" $1 "}" |
| |
| # Generators |
| "*" $0 "(" $1 ") {" $2 "}" |
| "function *" $0 "(" $1 ") {" $2 "}" |
| "function * (" $1 ") {" $2 "}" |
| "yield" $0 |
| "yield *" $0 |
| |
| # Strict generators |
| "function *" $0 "(" $1 ") {'use strict'; " $2 "}" |
| "function * (" $1 ") { 'use strict'; " $2 "}" |
| |
| # Classes |
| "class" $0 "{" $1 "}" |
| "class" $0 "extends" $1 "{" $2 "}" |
| |
| # Async functions, async methods, async arrow functions |
| "async function" $0 "(" $1 ") {" $2 "}" |
| "async function" "(" $0 ") {" $1 "}" |
| "async" $0 "(" $1 ") {" $2 "}" |
| "async" $0 "=>" $1 |
| "async" $0 "=> {" $1 "}" |
| "async(" $0 ") => {" $1 "}" |
| "async(" $0 ") =>" $1 |
| "await" $0 |
| |
| # Strict async functions. |
| "async function" $0 "(" $1 ") { 'use strict'; " $2 "}" |
| "async function" "(" $0 ") { 'use strict'; " $1 "}" |
| "async" $0 "(" $1 ") { 'use strict'; " $2 "}" |
| "async" $0 "=> { 'use strict'; " $1 "}" |
| "async(" $0 ") => { 'use strict';" $1 "}" |
| |
| # Call expressions |
| $0 "[" $1 "]" |
| $0 "(" $1 ")" |
| |
| # Template literals |
| "`foo`" |
| $0 "`foo`" |
| # TODO(marja): add more |
| |
| # Strict directive |
| "'use strict';" |
| |
| # Regexps |
| "/foo/" |
| # TODO(marja): add more |
| |
| # Conditional expression |
| $0 "?" $1 ":" $2 |
| $0 "?" $1 ":" $2 ";" |
| |
| # Assignment expressions |
| $0 "=" $1 |
| $0 "=" $1 ";" |
| |
| # Import / export (for modules) |
| "import" $0 ";" |
| "export" $0 ";" |
| |
| # Misc. |
| "eval('');" |
| |