1255 lines
25 KiB
Plaintext
1255 lines
25 KiB
Plaintext
|
============================================
|
||
|
Assignments
|
||
|
============================================
|
||
|
|
||
|
a = 0;
|
||
|
var b = 0;
|
||
|
const c = 0;
|
||
|
let d = 0;
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(variable_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(lexical_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(lexical_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number))))
|
||
|
|
||
|
============================================
|
||
|
'undefined' is a variable
|
||
|
============================================
|
||
|
|
||
|
undefined = 42;
|
||
|
var undefined = 42;
|
||
|
const undefined = 42;
|
||
|
let undefined = 42;
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(expression_statement
|
||
|
(assignment_expression
|
||
|
(undefined)
|
||
|
(number)))
|
||
|
(variable_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(lexical_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(lexical_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number))))
|
||
|
|
||
|
============================================
|
||
|
Imports
|
||
|
============================================
|
||
|
|
||
|
import defaultMember from "module-name";
|
||
|
import * as name from "module-name";
|
||
|
import { member } from "module-name";
|
||
|
import { member1 , member2 } from "module-name";
|
||
|
import { member1 , member2 as alias2 } from "module-name";
|
||
|
import { "string name" as alias } from "module-name";
|
||
|
import defaultMember, { member1, member2 as alias2 } from "module-name";
|
||
|
import defaultMember, * as name from "module-name";
|
||
|
import "module-name";
|
||
|
import { member1 , member2 as alias2, } from "module-name";
|
||
|
import("a");
|
||
|
import("a").then((m) => {});
|
||
|
import.meta.url;
|
||
|
|
||
|
----
|
||
|
|
||
|
(program
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(identifier))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(namespace_import
|
||
|
(identifier)))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(named_imports
|
||
|
(import_specifier
|
||
|
(identifier))))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(named_imports
|
||
|
(import_specifier
|
||
|
(identifier))
|
||
|
(import_specifier
|
||
|
(identifier))))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(named_imports
|
||
|
(import_specifier
|
||
|
(identifier))
|
||
|
(import_specifier
|
||
|
(identifier)
|
||
|
(identifier))))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(named_imports
|
||
|
(import_specifier
|
||
|
(string
|
||
|
(string_fragment))
|
||
|
(identifier))))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(identifier)
|
||
|
(named_imports
|
||
|
(import_specifier
|
||
|
(identifier))
|
||
|
(import_specifier
|
||
|
(identifier)
|
||
|
(identifier))))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(identifier)
|
||
|
(namespace_import
|
||
|
(identifier)))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(import_statement
|
||
|
(import_clause
|
||
|
(named_imports
|
||
|
(import_specifier
|
||
|
(identifier))
|
||
|
(import_specifier
|
||
|
(identifier)
|
||
|
(identifier))))
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(import)
|
||
|
(arguments
|
||
|
(string
|
||
|
(string_fragment)))))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(member_expression
|
||
|
(call_expression
|
||
|
(import)
|
||
|
(arguments
|
||
|
(string
|
||
|
(string_fragment))))
|
||
|
(property_identifier))
|
||
|
(arguments
|
||
|
(arrow_function
|
||
|
(formal_parameters
|
||
|
(identifier))
|
||
|
(statement_block)))))
|
||
|
(expression_statement
|
||
|
(member_expression
|
||
|
(member_expression
|
||
|
(import)
|
||
|
(property_identifier))
|
||
|
(property_identifier))))
|
||
|
|
||
|
============================================
|
||
|
Exports
|
||
|
============================================
|
||
|
|
||
|
export { name1, name2, name3, nameN };
|
||
|
export { variable1 as name1, variable2 as name2, nameN };
|
||
|
export { variable1 as "string name" };
|
||
|
export let name1, name2, nameN;
|
||
|
export let name1 = value1, name2 = value2, name3, nameN;
|
||
|
|
||
|
export default expression;
|
||
|
export default { field1: 42, field2: [] }
|
||
|
export default function () { }
|
||
|
export default function name1() { }
|
||
|
export { name1 as default };
|
||
|
|
||
|
export * from 'foo';
|
||
|
export * as someIdentifier from "someModule";
|
||
|
export * as "string name" from "someModule";
|
||
|
export { name1, name2, nameN } from 'foo';
|
||
|
export { import1 as name1, import2 as name2, nameN } from 'foo';
|
||
|
export { import1 as "string name" } from 'foo';
|
||
|
export { "string import" as "string export" } from 'foo';
|
||
|
|
||
|
----
|
||
|
|
||
|
(program
|
||
|
(export_statement
|
||
|
(export_clause
|
||
|
(export_specifier
|
||
|
name: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier))))
|
||
|
(export_statement
|
||
|
(export_clause
|
||
|
(export_specifier
|
||
|
name: (identifier)
|
||
|
alias: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier)
|
||
|
alias: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier))))
|
||
|
(export_statement
|
||
|
(export_clause
|
||
|
(export_specifier
|
||
|
name: (identifier)
|
||
|
alias: (string
|
||
|
(string_fragment)))))
|
||
|
(export_statement
|
||
|
declaration: (lexical_declaration
|
||
|
(variable_declarator
|
||
|
name: (identifier))
|
||
|
(variable_declarator
|
||
|
name: (identifier))
|
||
|
(variable_declarator
|
||
|
name: (identifier))))
|
||
|
(export_statement
|
||
|
declaration: (lexical_declaration
|
||
|
(variable_declarator
|
||
|
name: (identifier)
|
||
|
value: (identifier))
|
||
|
(variable_declarator
|
||
|
name: (identifier)
|
||
|
value: (identifier))
|
||
|
(variable_declarator
|
||
|
name: (identifier))
|
||
|
(variable_declarator
|
||
|
name: (identifier))))
|
||
|
(export_statement
|
||
|
value: (identifier))
|
||
|
(export_statement
|
||
|
value: (object
|
||
|
(pair
|
||
|
key: (property_identifier)
|
||
|
value: (number))
|
||
|
(pair
|
||
|
key: (property_identifier)
|
||
|
value: (array))))
|
||
|
(export_statement
|
||
|
value: (function
|
||
|
parameters: (formal_parameters)
|
||
|
body: (statement_block)))
|
||
|
(export_statement
|
||
|
declaration: (function_declaration
|
||
|
name: (identifier)
|
||
|
parameters: (formal_parameters)
|
||
|
body: (statement_block)))
|
||
|
(export_statement
|
||
|
(export_clause
|
||
|
(export_specifier
|
||
|
name: (identifier)
|
||
|
alias: (identifier))))
|
||
|
(export_statement
|
||
|
source: (string
|
||
|
(string_fragment)))
|
||
|
(export_statement
|
||
|
(namespace_export
|
||
|
(identifier))
|
||
|
source: (string
|
||
|
(string_fragment)))
|
||
|
(export_statement
|
||
|
(namespace_export
|
||
|
(string
|
||
|
(string_fragment)))
|
||
|
source: (string
|
||
|
(string_fragment)))
|
||
|
(export_statement
|
||
|
(export_clause
|
||
|
(export_specifier
|
||
|
name: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier)))
|
||
|
source: (string
|
||
|
(string_fragment)))
|
||
|
(export_statement
|
||
|
(export_clause
|
||
|
(export_specifier
|
||
|
name: (identifier)
|
||
|
alias: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier)
|
||
|
alias: (identifier))
|
||
|
(export_specifier
|
||
|
name: (identifier)))
|
||
|
source: (string
|
||
|
(string_fragment)))
|
||
|
(export_statement
|
||
|
(export_clause
|
||
|
(export_specifier
|
||
|
name: (identifier)
|
||
|
alias: (string
|
||
|
(string_fragment))))
|
||
|
source: (string
|
||
|
(string_fragment)))
|
||
|
(export_statement
|
||
|
(export_clause
|
||
|
(export_specifier
|
||
|
name: (string
|
||
|
(string_fragment))
|
||
|
alias: (string
|
||
|
(string_fragment))))
|
||
|
source: (string
|
||
|
(string_fragment))))
|
||
|
|
||
|
============================================
|
||
|
Decorators before exports
|
||
|
============================================
|
||
|
|
||
|
@injectable()
|
||
|
export class Foo {
|
||
|
}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(export_statement
|
||
|
decorator: (decorator
|
||
|
(call_expression
|
||
|
function: (identifier)
|
||
|
arguments: (arguments)))
|
||
|
declaration: (class_declaration
|
||
|
name: (identifier)
|
||
|
body: (class_body))))
|
||
|
|
||
|
============================================
|
||
|
If statements
|
||
|
============================================
|
||
|
|
||
|
if (x)
|
||
|
log(y);
|
||
|
|
||
|
if (a.b) {
|
||
|
log(c);
|
||
|
d;
|
||
|
}
|
||
|
|
||
|
----
|
||
|
|
||
|
(program
|
||
|
(if_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier))
|
||
|
consequence: (expression_statement
|
||
|
(call_expression
|
||
|
function: (identifier)
|
||
|
arguments: (arguments
|
||
|
(identifier)))))
|
||
|
(if_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(member_expression
|
||
|
object: (identifier)
|
||
|
property: (property_identifier)))
|
||
|
consequence: (statement_block
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
function: (identifier)
|
||
|
arguments: (arguments
|
||
|
(identifier))))
|
||
|
(expression_statement
|
||
|
(identifier)))))
|
||
|
|
||
|
============================================
|
||
|
If-else statements
|
||
|
============================================
|
||
|
|
||
|
if (x)
|
||
|
y;
|
||
|
else if (a)
|
||
|
b;
|
||
|
|
||
|
if (a) {
|
||
|
c;
|
||
|
d;
|
||
|
} else {
|
||
|
e;
|
||
|
}
|
||
|
|
||
|
----
|
||
|
|
||
|
(program
|
||
|
(if_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier))
|
||
|
consequence: (expression_statement
|
||
|
(identifier))
|
||
|
alternative: (else_clause
|
||
|
(if_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier))
|
||
|
consequence: (expression_statement
|
||
|
(identifier)))))
|
||
|
(if_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier))
|
||
|
consequence: (statement_block
|
||
|
(expression_statement
|
||
|
(identifier))
|
||
|
(expression_statement
|
||
|
(identifier)))
|
||
|
alternative: (else_clause
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(identifier))))))
|
||
|
|
||
|
============================================
|
||
|
For statements
|
||
|
============================================
|
||
|
|
||
|
for (var a, b; c; d)
|
||
|
e;
|
||
|
|
||
|
for (i = 0, init(); i < 10; i++)
|
||
|
log(y);
|
||
|
|
||
|
for (;;) {
|
||
|
z;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
for (var i = 0
|
||
|
; i < l
|
||
|
; i++) {
|
||
|
}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(for_statement
|
||
|
initializer: (variable_declaration
|
||
|
(variable_declarator
|
||
|
name: (identifier))
|
||
|
(variable_declarator
|
||
|
name: (identifier)))
|
||
|
condition: (expression_statement
|
||
|
(identifier))
|
||
|
increment: (identifier)
|
||
|
body: (expression_statement
|
||
|
(identifier)))
|
||
|
(for_statement
|
||
|
initializer: (expression_statement
|
||
|
(sequence_expression
|
||
|
left: (assignment_expression
|
||
|
left: (identifier)
|
||
|
right: (number))
|
||
|
right: (call_expression
|
||
|
function: (identifier)
|
||
|
arguments: (arguments))))
|
||
|
condition: (expression_statement
|
||
|
(binary_expression
|
||
|
left: (identifier)
|
||
|
right: (number)))
|
||
|
increment: (update_expression
|
||
|
argument: (identifier))
|
||
|
body: (expression_statement
|
||
|
(call_expression
|
||
|
function: (identifier)
|
||
|
arguments: (arguments
|
||
|
(identifier)))))
|
||
|
(for_statement
|
||
|
initializer: (empty_statement)
|
||
|
condition: (empty_statement)
|
||
|
body: (statement_block
|
||
|
(expression_statement
|
||
|
(identifier))
|
||
|
(continue_statement)))
|
||
|
(for_statement
|
||
|
initializer: (variable_declaration
|
||
|
(variable_declarator
|
||
|
name: (identifier)
|
||
|
value: (number)))
|
||
|
condition: (expression_statement
|
||
|
(binary_expression
|
||
|
left: (identifier)
|
||
|
right: (identifier)))
|
||
|
increment: (update_expression
|
||
|
argument: (identifier))
|
||
|
body: (statement_block)))
|
||
|
|
||
|
============================================
|
||
|
For-in statements
|
||
|
============================================
|
||
|
|
||
|
for (item in items)
|
||
|
item();
|
||
|
|
||
|
for (var item in items || {})
|
||
|
item();
|
||
|
|
||
|
for (const {thing} in things)
|
||
|
thing();
|
||
|
|
||
|
for (x in a, b, c)
|
||
|
foo();
|
||
|
|
||
|
for (x[i] in a) {}
|
||
|
|
||
|
for (x.y in a) {}
|
||
|
|
||
|
for ([a, b] in c) {}
|
||
|
|
||
|
for ((a) in b) {}
|
||
|
|
||
|
for (var foo = bar in baz) {}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(for_in_statement
|
||
|
(identifier)
|
||
|
(identifier)
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments))))
|
||
|
(for_in_statement
|
||
|
(identifier)
|
||
|
(binary_expression
|
||
|
(identifier)
|
||
|
(object))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments))))
|
||
|
(for_in_statement
|
||
|
(object_pattern
|
||
|
(shorthand_property_identifier_pattern))
|
||
|
(identifier)
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments))))
|
||
|
(for_in_statement
|
||
|
(identifier)
|
||
|
(sequence_expression
|
||
|
(identifier)
|
||
|
(sequence_expression
|
||
|
(identifier)
|
||
|
(identifier)))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments))))
|
||
|
(for_in_statement
|
||
|
(subscript_expression
|
||
|
(identifier)
|
||
|
(identifier))
|
||
|
(identifier)
|
||
|
(statement_block))
|
||
|
(for_in_statement
|
||
|
(member_expression
|
||
|
(identifier)
|
||
|
(property_identifier))
|
||
|
(identifier)
|
||
|
(statement_block))
|
||
|
(for_in_statement
|
||
|
(array_pattern
|
||
|
(identifier)
|
||
|
(identifier))
|
||
|
(identifier)
|
||
|
(statement_block))
|
||
|
(for_in_statement
|
||
|
(parenthesized_expression
|
||
|
(identifier))
|
||
|
(identifier)
|
||
|
(statement_block))
|
||
|
(for_in_statement
|
||
|
(identifier)
|
||
|
(identifier)
|
||
|
(identifier)
|
||
|
(statement_block)))
|
||
|
|
||
|
==========================================
|
||
|
For loops beginning with an in-expression
|
||
|
==========================================
|
||
|
|
||
|
for (key in something && i = 0; i < n; i++) {
|
||
|
doSomething();
|
||
|
}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(for_statement
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(binary_expression
|
||
|
(identifier)
|
||
|
(identifier))
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(number))))
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(identifier)
|
||
|
(identifier)))
|
||
|
(update_expression
|
||
|
(identifier))
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments))))))
|
||
|
|
||
|
============================================
|
||
|
For-of statements
|
||
|
============================================
|
||
|
|
||
|
for (a of b)
|
||
|
process(a);
|
||
|
|
||
|
for (let {a, b} of items || [])
|
||
|
process(a, b);
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(for_in_statement
|
||
|
(identifier)
|
||
|
(identifier)
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments
|
||
|
(identifier)))))
|
||
|
(for_in_statement
|
||
|
(object_pattern
|
||
|
(shorthand_property_identifier_pattern)
|
||
|
(shorthand_property_identifier_pattern))
|
||
|
(binary_expression
|
||
|
(identifier)
|
||
|
(array))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments
|
||
|
(identifier)
|
||
|
(identifier))))))
|
||
|
|
||
|
============================================
|
||
|
For-await-of statements
|
||
|
============================================
|
||
|
|
||
|
for await (const chunk of stream) {
|
||
|
str += chunk;
|
||
|
}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(for_in_statement
|
||
|
(identifier)
|
||
|
(identifier)
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(augmented_assignment_expression
|
||
|
(identifier)
|
||
|
(identifier))))))
|
||
|
|
||
|
============================================
|
||
|
While statements
|
||
|
============================================
|
||
|
|
||
|
while (a)
|
||
|
b();
|
||
|
|
||
|
while (a) {
|
||
|
|
||
|
}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(while_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier))
|
||
|
body: (expression_statement
|
||
|
(call_expression
|
||
|
function: (identifier)
|
||
|
arguments: (arguments))))
|
||
|
(while_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier))
|
||
|
body: (statement_block)))
|
||
|
|
||
|
============================================
|
||
|
Do statements
|
||
|
============================================
|
||
|
|
||
|
do {
|
||
|
a;
|
||
|
} while (b)
|
||
|
|
||
|
do a; while (b)
|
||
|
|
||
|
do {} while (b)
|
||
|
|
||
|
do do; while (a) while (a)
|
||
|
|
||
|
for (a in b) { do ; while (a) break; }
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(do_statement
|
||
|
body: (statement_block
|
||
|
(expression_statement
|
||
|
(identifier)))
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier)))
|
||
|
(do_statement
|
||
|
body: (expression_statement
|
||
|
(identifier))
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier)))
|
||
|
(do_statement
|
||
|
body: (statement_block)
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier)))
|
||
|
(do_statement
|
||
|
body: (do_statement
|
||
|
body: (empty_statement)
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier)))
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier)))
|
||
|
(for_in_statement
|
||
|
left: (identifier)
|
||
|
right: (identifier)
|
||
|
body: (statement_block
|
||
|
(do_statement
|
||
|
body: (empty_statement)
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier)))
|
||
|
(break_statement))))
|
||
|
|
||
|
============================================
|
||
|
Return statements
|
||
|
============================================
|
||
|
|
||
|
return;
|
||
|
return 5;
|
||
|
return 1,2;
|
||
|
return async;
|
||
|
return a;
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(return_statement)
|
||
|
(return_statement
|
||
|
(number))
|
||
|
(return_statement
|
||
|
(sequence_expression
|
||
|
(number)
|
||
|
(number)))
|
||
|
(return_statement
|
||
|
(identifier))
|
||
|
(return_statement
|
||
|
(identifier)))
|
||
|
|
||
|
============================================
|
||
|
Variable declarations
|
||
|
============================================
|
||
|
|
||
|
var x = 1;
|
||
|
var x, y = {}, z;
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(variable_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(variable_declaration
|
||
|
(variable_declarator
|
||
|
(identifier))
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(object))
|
||
|
(variable_declarator
|
||
|
(identifier))))
|
||
|
|
||
|
============================================
|
||
|
Comments
|
||
|
============================================
|
||
|
|
||
|
{
|
||
|
|
||
|
// This is a property
|
||
|
aProperty: 1,
|
||
|
|
||
|
/*
|
||
|
* This is a method
|
||
|
*/
|
||
|
aMethod: function() {}
|
||
|
};
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(expression_statement
|
||
|
(object
|
||
|
(comment)
|
||
|
(pair
|
||
|
(property_identifier)
|
||
|
(number))
|
||
|
(comment)
|
||
|
(pair
|
||
|
(property_identifier)
|
||
|
(function
|
||
|
(formal_parameters)
|
||
|
(statement_block))))))
|
||
|
|
||
|
==========================================
|
||
|
Comments between statements
|
||
|
==========================================
|
||
|
|
||
|
// this is the beginning of the script.
|
||
|
// here we go.
|
||
|
var thing = {
|
||
|
|
||
|
// this is a property.
|
||
|
// its value is a function.
|
||
|
key: function(x /* this is a parameter */) {
|
||
|
// this is one statement
|
||
|
one();
|
||
|
// this is another statement
|
||
|
two();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(comment)
|
||
|
(comment)
|
||
|
(variable_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(object
|
||
|
(comment)
|
||
|
(comment)
|
||
|
(pair
|
||
|
(property_identifier)
|
||
|
(function
|
||
|
(formal_parameters
|
||
|
(identifier)
|
||
|
(comment))
|
||
|
(statement_block
|
||
|
(comment)
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments)))
|
||
|
(comment)
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments))))))))))
|
||
|
|
||
|
============================================
|
||
|
Comments with asterisks
|
||
|
============================================
|
||
|
|
||
|
/* a */
|
||
|
const a = 1;
|
||
|
|
||
|
/* b **/
|
||
|
const b = 1;
|
||
|
|
||
|
/* c ***/
|
||
|
const c = 1;
|
||
|
|
||
|
/* d
|
||
|
|
||
|
***/
|
||
|
const d = 1;
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(comment)
|
||
|
(lexical_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(comment)
|
||
|
(lexical_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(comment)
|
||
|
(lexical_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(comment)
|
||
|
(lexical_declaration
|
||
|
(variable_declarator
|
||
|
(identifier)
|
||
|
(number))))
|
||
|
|
||
|
==========================================
|
||
|
Comments within expressions
|
||
|
==========================================
|
||
|
|
||
|
y // comment
|
||
|
* z;
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(identifier)
|
||
|
(comment)
|
||
|
(identifier))))
|
||
|
|
||
|
==========================================
|
||
|
HTML Comments
|
||
|
==========================================
|
||
|
|
||
|
<!-- we can put whatever we like here. this affects one line only.
|
||
|
y * z;
|
||
|
<!-- and here as well. these do not have to have matching close comments.
|
||
|
|
||
|
x + 1; --> for some reason you can put text after a close comment.
|
||
|
|
||
|
--> note that the x + 1 above should be rejected according to the spec.
|
||
|
--> it should instead be rejected as invalid.
|
||
|
--> you are supposed to only have whitespace or comments before
|
||
|
--> an HTML close comment.
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(comment)
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(identifier)
|
||
|
(identifier)))
|
||
|
(comment)
|
||
|
(expression_statement
|
||
|
(binary_expression
|
||
|
(identifier)
|
||
|
(number)))
|
||
|
(comment)
|
||
|
(comment)
|
||
|
(comment)
|
||
|
(comment)
|
||
|
(comment))
|
||
|
|
||
|
============================================
|
||
|
Switch statements
|
||
|
============================================
|
||
|
|
||
|
switch (x) {
|
||
|
case 1:
|
||
|
case 2:
|
||
|
something();
|
||
|
break;
|
||
|
case "three":
|
||
|
somethingElse();
|
||
|
break;
|
||
|
default:
|
||
|
return 4;
|
||
|
}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(switch_statement
|
||
|
(parenthesized_expression
|
||
|
(identifier))
|
||
|
(switch_body
|
||
|
(switch_case
|
||
|
(number))
|
||
|
(switch_case
|
||
|
(number)
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments)))
|
||
|
(break_statement))
|
||
|
(switch_case
|
||
|
(string
|
||
|
(string_fragment))
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(identifier)
|
||
|
(arguments)))
|
||
|
(break_statement))
|
||
|
(switch_default
|
||
|
(return_statement
|
||
|
(number))))))
|
||
|
|
||
|
============================================
|
||
|
Throw statements
|
||
|
============================================
|
||
|
|
||
|
throw new Error("uh oh");
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(throw_statement
|
||
|
(new_expression
|
||
|
(identifier)
|
||
|
(arguments
|
||
|
(string
|
||
|
(string_fragment))))))
|
||
|
|
||
|
============================================
|
||
|
Throw statements with sequence expressions
|
||
|
============================================
|
||
|
|
||
|
throw f = 1, f;
|
||
|
throw g = 2, g
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(throw_statement
|
||
|
(sequence_expression
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(number))
|
||
|
(identifier)))
|
||
|
(throw_statement
|
||
|
(sequence_expression
|
||
|
(assignment_expression
|
||
|
(identifier)
|
||
|
(number))
|
||
|
(identifier))))
|
||
|
|
||
|
============================================
|
||
|
Try catch finally statements
|
||
|
============================================
|
||
|
|
||
|
try { a; } catch (b) { c; }
|
||
|
try { d; } finally { e; }
|
||
|
try { f; } catch { g; } finally { h; }
|
||
|
try { throw [a, b] } catch ([c, d]) { }
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(try_statement
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(identifier)))
|
||
|
(catch_clause
|
||
|
(identifier)
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(identifier)))))
|
||
|
(try_statement
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(identifier)))
|
||
|
(finally_clause
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(identifier)))))
|
||
|
(try_statement
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(identifier)))
|
||
|
(catch_clause
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(identifier))))
|
||
|
(finally_clause
|
||
|
(statement_block
|
||
|
(expression_statement
|
||
|
(identifier)))))
|
||
|
(try_statement
|
||
|
(statement_block
|
||
|
(throw_statement
|
||
|
(array
|
||
|
(identifier)
|
||
|
(identifier))))
|
||
|
(catch_clause
|
||
|
(array_pattern
|
||
|
(identifier)
|
||
|
(identifier))
|
||
|
(statement_block))))
|
||
|
|
||
|
============================================
|
||
|
Empty statements
|
||
|
============================================
|
||
|
|
||
|
if (true) { ; };;;
|
||
|
if (true) {} else {}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(if_statement
|
||
|
(parenthesized_expression
|
||
|
(true))
|
||
|
(statement_block
|
||
|
(empty_statement)))
|
||
|
(empty_statement)
|
||
|
(empty_statement)
|
||
|
(empty_statement)
|
||
|
(if_statement
|
||
|
(parenthesized_expression
|
||
|
(true))
|
||
|
(statement_block)
|
||
|
(else_clause
|
||
|
(statement_block))))
|
||
|
|
||
|
============================================
|
||
|
Labeled statements
|
||
|
============================================
|
||
|
|
||
|
theLoop:
|
||
|
for (;;) {
|
||
|
if (a) {
|
||
|
break theLoop;
|
||
|
} else {
|
||
|
continue theLoop;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
label
|
||
|
: {
|
||
|
break label;
|
||
|
}
|
||
|
|
||
|
async:
|
||
|
while (true) {
|
||
|
continue async;
|
||
|
}
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(labeled_statement
|
||
|
label: (statement_identifier)
|
||
|
body: (for_statement
|
||
|
initializer: (empty_statement)
|
||
|
condition: (empty_statement)
|
||
|
body: (statement_block
|
||
|
(if_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(identifier))
|
||
|
consequence: (statement_block
|
||
|
(break_statement
|
||
|
label: (statement_identifier)))
|
||
|
alternative: (else_clause
|
||
|
(statement_block
|
||
|
(continue_statement
|
||
|
label: (statement_identifier))))))))
|
||
|
(labeled_statement
|
||
|
label: (statement_identifier)
|
||
|
body: (statement_block
|
||
|
(break_statement
|
||
|
label: (statement_identifier))))
|
||
|
(labeled_statement
|
||
|
label: (statement_identifier)
|
||
|
body: (while_statement
|
||
|
condition: (parenthesized_expression
|
||
|
(true))
|
||
|
body: (statement_block
|
||
|
(continue_statement
|
||
|
label: (statement_identifier))))))
|
||
|
|
||
|
============================================
|
||
|
Debugger statements
|
||
|
============================================
|
||
|
|
||
|
debugger;
|
||
|
debugger
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(debugger_statement)
|
||
|
(debugger_statement))
|
||
|
|
||
|
============================================
|
||
|
With statements
|
||
|
============================================
|
||
|
|
||
|
with (x) { i; }
|
||
|
|
||
|
with (x) { }
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(with_statement
|
||
|
object: (parenthesized_expression
|
||
|
(identifier))
|
||
|
body: (statement_block
|
||
|
(expression_statement
|
||
|
(identifier))))
|
||
|
(with_statement
|
||
|
object: (parenthesized_expression
|
||
|
(identifier))
|
||
|
body: (statement_block)))
|
||
|
|
||
|
==========================================
|
||
|
Hash bang lines
|
||
|
==========================================
|
||
|
|
||
|
#!/usr/bin/env node
|
||
|
|
||
|
console.log("HI")
|
||
|
|
||
|
---
|
||
|
|
||
|
(program
|
||
|
(hash_bang_line)
|
||
|
(expression_statement
|
||
|
(call_expression
|
||
|
(member_expression
|
||
|
(identifier)
|
||
|
(property_identifier))
|
||
|
(arguments
|
||
|
(string
|
||
|
(string_fragment))))))
|