Merge commit '78c4e9b6b2f08e1be23b541ffced47b15e2972ad'

pull/261/head
Wilfred Hughes 2022-04-17 16:57:45 +07:00
commit f03e7f063f
13 changed files with 46765 additions and 31937 deletions

@ -6,8 +6,8 @@ Added support for Kotlin and TOML.
Fixed an issue with YAML and `|` block strings. Fixed an issue with YAML and `|` block strings.
Updated to the latest upstream C++, C#, Elixir, Go, Haskell and Java Updated to the latest upstream C++, C#, Elixir, Go, Haskell, Java and
parsers. Python parsers.
### Diffing ### Diffing

@ -38,6 +38,8 @@ module.exports = grammar({
[$.tuple, $.tuple_pattern], [$.tuple, $.tuple_pattern],
[$.list, $.list_pattern], [$.list, $.list_pattern],
[$.with_item, $._collection_elements], [$.with_item, $._collection_elements],
[$.named_expression, $.as_pattern],
[$.match_statement, $.primary_expression],
], ],
supertypes: $ => [ supertypes: $ => [
@ -188,11 +190,16 @@ module.exports = grammar({
), ),
named_expression: $ => seq( named_expression: $ => seq(
field('name', $.identifier), field('name', $._named_expresssion_lhs),
':=', ':=',
field('value', $.expression) field('value', $.expression)
), ),
_named_expresssion_lhs: $ => choice(
$.identifier,
alias('match', $.identifier), // ambiguity with match statement: only ":" at end of line decides if "match" keyword
),
return_statement: $ => seq( return_statement: $ => seq(
'return', 'return',
optional($._expressions) optional($._expressions)
@ -228,7 +235,8 @@ module.exports = grammar({
$.with_statement, $.with_statement,
$.function_definition, $.function_definition,
$.class_definition, $.class_definition,
$.decorated_definition $.decorated_definition,
$.match_statement,
), ),
if_statement: $ => seq( if_statement: $ => seq(
@ -253,6 +261,27 @@ module.exports = grammar({
field('body', $._suite) field('body', $._suite)
), ),
match_statement: $ => seq(
'match',
commaSep1(field('subject', $.expression)),
optional(','),
':',
repeat(field('alternative', $.case_clause))),
case_clause: $ => seq(
'case',
commaSep1(
field(
'pattern',
alias(choice($.expression, $.list_splat_pattern), $.case_pattern),
)
),
optional(','),
optional(field('guard', $.if_clause)),
':',
field('consequence', $._suite)
),
for_statement: $ => seq( for_statement: $ => seq(
optional('async'), optional('async'),
'for', 'for',
@ -320,10 +349,6 @@ module.exports = grammar({
with_item: $ => prec.dynamic(-1, seq( with_item: $ => prec.dynamic(-1, seq(
field('value', $.expression), field('value', $.expression),
optional(seq(
'as',
field('alias', $.pattern)
))
)), )),
function_definition: $ => seq( function_definition: $ => seq(
@ -472,12 +497,14 @@ module.exports = grammar({
$.typed_default_parameter, $.typed_default_parameter,
$.list_splat_pattern, $.list_splat_pattern,
$.tuple_pattern, $.tuple_pattern,
alias('*', $.list_splat_pattern), $.keyword_separator,
$.positional_separator,
$.dictionary_splat_pattern $.dictionary_splat_pattern
), ),
pattern: $ => choice( pattern: $ => choice(
$.identifier, $.identifier,
alias('match', $.identifier), // ambiguity with match statement: only ":" at end of line decides if "match" keyword
$.keyword_identifier, $.keyword_identifier,
$.subscript, $.subscript,
$.attribute, $.attribute,
@ -522,6 +549,14 @@ module.exports = grammar({
choice($.identifier, $.keyword_identifier, $.subscript, $.attribute) choice($.identifier, $.keyword_identifier, $.subscript, $.attribute)
), ),
// Extended patterns (patterns allowed in match statement are far more flexible than simple patterns though still a subset of "expression")
as_pattern: $ => prec.left(seq(
$.expression,
'as',
field('alias', alias($.expression, $.as_pattern_target))
)),
// Expressions // Expressions
_expression_within_for_in_clause: $ => choice( _expression_within_for_in_clause: $ => choice(
@ -537,12 +572,14 @@ module.exports = grammar({
$.lambda, $.lambda,
$.primary_expression, $.primary_expression,
$.conditional_expression, $.conditional_expression,
$.named_expression $.named_expression,
$.as_pattern
), ),
primary_expression: $ => choice( primary_expression: $ => choice(
$.binary_operator, $.binary_operator,
$.identifier, $.identifier,
alias("match", $.identifier),
$.keyword_identifier, $.keyword_identifier,
$.string, $.string,
$.concatenated_string, $.concatenated_string,
@ -669,7 +706,7 @@ module.exports = grammar({
_left_hand_side: $ => choice( _left_hand_side: $ => choice(
$.pattern, $.pattern,
$.pattern_list $.pattern_list,
), ),
pattern_list: $ => seq( pattern_list: $ => seq(
@ -749,7 +786,7 @@ module.exports = grammar({
type: $ => $.expression, type: $ => $.expression,
keyword_argument: $ => seq( keyword_argument: $ => seq(
field('name', choice($.identifier, $.keyword_identifier)), field('name', choice($.identifier, $.keyword_identifier, alias("match", $.identifier))),
'=', '=',
field('value', $.expression) field('value', $.expression)
), ),
@ -872,6 +909,7 @@ module.exports = grammar({
interpolation: $ => seq( interpolation: $ => seq(
'{', '{',
$.expression, $.expression,
optional('='),
optional($.type_conversion), optional($.type_conversion),
optional($.format_specifier), optional($.format_specifier),
'}' '}'
@ -966,13 +1004,16 @@ module.exports = grammar({
)), )),
comment: $ => token(seq('#', /.*/)), comment: $ => token(seq('#', /.*/)),
positional_separator: $ => '/',
keyword_separator: $ => '*',
} }
}) })
function commaSep1 (rule) { function commaSep1(rule) {
return sep1(rule, ',') return sep1(rule, ',')
} }
function sep1 (rule, separator) { function sep1(rule, separator) {
return seq(rule, repeat(seq(separator, rule))) return seq(rule, repeat(seq(separator, rule)))
} }

@ -10,10 +10,10 @@
"author": "Max Brunsfeld", "author": "Max Brunsfeld",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"nan": "^2.14.0" "nan": "^2.15.0"
}, },
"devDependencies": { "devDependencies": {
"tree-sitter-cli": "^0.19.3" "tree-sitter-cli": "^0.20.1"
}, },
"scripts": { "scripts": {
"build": "tree-sitter generate && node-gyp build", "build": "tree-sitter generate && node-gyp build",

@ -121,4 +121,6 @@
"while" "while"
"with" "with"
"yield" "yield"
"match"
"case"
] @keyword ] @keyword

@ -604,7 +604,7 @@
"name": "name", "name": "name",
"content": { "content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "identifier" "name": "_named_expresssion_lhs"
} }
}, },
{ {
@ -621,6 +621,24 @@
} }
] ]
}, },
"_named_expresssion_lhs": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "match"
},
"named": true,
"value": "identifier"
}
]
},
"return_statement": { "return_statement": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
@ -772,6 +790,10 @@
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "decorated_definition" "name": "decorated_definition"
},
{
"type": "SYMBOL",
"name": "match_statement"
} }
] ]
}, },
@ -881,6 +903,185 @@
} }
] ]
}, },
"match_statement": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "match"
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "subject",
"content": {
"type": "SYMBOL",
"name": "expression"
}
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "subject",
"content": {
"type": "SYMBOL",
"name": "expression"
}
}
]
}
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ":"
},
{
"type": "REPEAT",
"content": {
"type": "FIELD",
"name": "alternative",
"content": {
"type": "SYMBOL",
"name": "case_clause"
}
}
}
]
},
"case_clause": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "case"
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "pattern",
"content": {
"type": "ALIAS",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "list_splat_pattern"
}
]
},
"named": true,
"value": "case_pattern"
}
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "pattern",
"content": {
"type": "ALIAS",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "list_splat_pattern"
}
]
},
"named": true,
"value": "case_pattern"
}
}
]
}
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "guard",
"content": {
"type": "SYMBOL",
"name": "if_clause"
}
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ":"
},
{
"type": "FIELD",
"name": "consequence",
"content": {
"type": "SYMBOL",
"name": "_suite"
}
}
]
},
"for_statement": { "for_statement": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
@ -1260,31 +1461,6 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "expression" "name": "expression"
} }
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "as"
},
{
"type": "FIELD",
"name": "alias",
"content": {
"type": "SYMBOL",
"name": "pattern"
}
}
]
},
{
"type": "BLANK"
}
]
} }
] ]
} }
@ -2025,13 +2201,12 @@
"name": "tuple_pattern" "name": "tuple_pattern"
}, },
{ {
"type": "ALIAS", "type": "SYMBOL",
"content": { "name": "keyword_separator"
"type": "STRING",
"value": "*"
}, },
"named": true, {
"value": "list_splat_pattern" "type": "SYMBOL",
"name": "positional_separator"
}, },
{ {
"type": "SYMBOL", "type": "SYMBOL",
@ -2046,6 +2221,15 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "identifier" "name": "identifier"
}, },
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "match"
},
"named": true,
"value": "identifier"
},
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "keyword_identifier" "name": "keyword_identifier"
@ -2248,6 +2432,36 @@
} }
] ]
}, },
"as_pattern": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "STRING",
"value": "as"
},
{
"type": "FIELD",
"name": "alias",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "expression"
},
"named": true,
"value": "as_pattern_target"
}
}
]
}
},
"_expression_within_for_in_clause": { "_expression_within_for_in_clause": {
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
@ -2300,6 +2514,10 @@
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "named_expression" "name": "named_expression"
},
{
"type": "SYMBOL",
"name": "as_pattern"
} }
] ]
}, },
@ -2314,6 +2532,15 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "identifier" "name": "identifier"
}, },
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "match"
},
"named": true,
"value": "identifier"
},
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "keyword_identifier" "name": "keyword_identifier"
@ -3712,6 +3939,15 @@
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "keyword_identifier" "name": "keyword_identifier"
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "match"
},
"named": true,
"value": "identifier"
} }
] ]
} }
@ -4327,6 +4563,18 @@
"type": "SYMBOL", "type": "SYMBOL",
"name": "expression" "name": "expression"
}, },
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "="
},
{
"type": "BLANK"
}
]
},
{ {
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
@ -4882,6 +5130,14 @@
} }
] ]
} }
},
"positional_separator": {
"type": "STRING",
"value": "/"
},
"keyword_separator": {
"type": "STRING",
"value": "*"
} }
}, },
"extras": [ "extras": [
@ -4914,6 +5170,14 @@
[ [
"with_item", "with_item",
"_collection_elements" "_collection_elements"
],
[
"named_expression",
"as_pattern"
],
[
"match_statement",
"primary_expression"
] ]
], ],
"precedences": [], "precedences": [],

@ -23,6 +23,10 @@
"type": "if_statement", "type": "if_statement",
"named": true "named": true
}, },
{
"type": "match_statement",
"named": true
},
{ {
"type": "try_statement", "type": "try_statement",
"named": true "named": true
@ -107,6 +111,10 @@
"type": "expression", "type": "expression",
"named": true, "named": true,
"subtypes": [ "subtypes": [
{
"type": "as_pattern",
"named": true
},
{ {
"type": "await", "type": "await",
"named": true "named": true
@ -157,10 +165,18 @@
"type": "identifier", "type": "identifier",
"named": true "named": true
}, },
{
"type": "keyword_separator",
"named": true
},
{ {
"type": "list_splat_pattern", "type": "list_splat_pattern",
"named": true "named": true
}, },
{
"type": "positional_separator",
"named": true
},
{ {
"type": "tuple_pattern", "type": "tuple_pattern",
"named": true "named": true
@ -360,6 +376,32 @@
] ]
} }
}, },
{
"type": "as_pattern",
"named": true,
"fields": {
"alias": {
"multiple": false,
"required": true,
"types": [
{
"type": "as_pattern_target",
"named": true
}
]
}
},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{ {
"type": "assert_statement", "type": "assert_statement",
"named": true, "named": true,
@ -754,6 +796,65 @@
} }
} }
}, },
{
"type": "case_clause",
"named": true,
"fields": {
"consequence": {
"multiple": false,
"required": true,
"types": [
{
"type": "block",
"named": true
}
]
},
"guard": {
"multiple": false,
"required": false,
"types": [
{
"type": "if_clause",
"named": true
}
]
},
"pattern": {
"multiple": true,
"required": true,
"types": [
{
"type": "case_pattern",
"named": true
}
]
}
}
},
{
"type": "case_pattern",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "attribute",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "subscript",
"named": true
}
]
}
},
{ {
"type": "chevron", "type": "chevron",
"named": true, "named": true,
@ -1640,6 +1741,11 @@
} }
} }
}, },
{
"type": "keyword_separator",
"named": true,
"fields": {}
},
{ {
"type": "lambda", "type": "lambda",
"named": true, "named": true,
@ -1774,7 +1880,7 @@
"fields": {}, "fields": {},
"children": { "children": {
"multiple": false, "multiple": false,
"required": false, "required": true,
"types": [ "types": [
{ {
"type": "attribute", "type": "attribute",
@ -1791,6 +1897,32 @@
] ]
} }
}, },
{
"type": "match_statement",
"named": true,
"fields": {
"alternative": {
"multiple": true,
"required": false,
"types": [
{
"type": "case_clause",
"named": true
}
]
},
"subject": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
}
]
}
}
},
{ {
"type": "module", "type": "module",
"named": true, "named": true,
@ -1974,6 +2106,11 @@
] ]
} }
}, },
{
"type": "positional_separator",
"named": true,
"fields": {}
},
{ {
"type": "print_statement", "type": "print_statement",
"named": true, "named": true,
@ -2444,16 +2581,6 @@
"type": "with_item", "type": "with_item",
"named": true, "named": true,
"fields": { "fields": {
"alias": {
"multiple": false,
"required": false,
"types": [
{
"type": "pattern",
"named": true
}
]
},
"value": { "value": {
"multiple": false, "multiple": false,
"required": true, "required": true,
@ -2711,6 +2838,10 @@
"type": "break", "type": "break",
"named": false "named": false
}, },
{
"type": "case",
"named": false
},
{ {
"type": "class", "type": "class",
"named": false "named": false
@ -2807,6 +2938,10 @@
"type": "lambda", "type": "lambda",
"named": false "named": false
}, },
{
"type": "match",
"named": false
},
{ {
"type": "none", "type": "none",
"named": true "named": true

File diff suppressed because it is too large Load Diff

@ -1,122 +1,158 @@
===================================== ================================================================================
Identifiers with Greek letters Identifiers with Greek letters
===================================== ================================================================================
ψ1 = β_γ + Ψ_5 ψ1 = β_γ + Ψ_5
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (assignment (expression_statement
(assignment
left: (identifier) left: (identifier)
right: (binary_operator right: (binary_operator
left: (identifier) left: (identifier)
right: (identifier))))) right: (identifier)))))
===================================== ================================================================================
Subscript expressions Subscript expressions
===================================== ================================================================================
a[1] a[1]
b[2, 3] b[2, 3]
c[4, 5,] c[4, 5,]
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (subscript (identifier) (integer))) (expression_statement
(expression_statement (subscript (identifier) (integer) (integer))) (subscript
(expression_statement (subscript (identifier) (integer) (integer)))) (identifier)
(integer)))
(expression_statement
(subscript
(identifier)
(integer)
(integer)))
(expression_statement
(subscript
(identifier)
(integer)
(integer))))
===================================== ================================================================================
Subscript slice expressions Subscript slice expressions
===================================== ================================================================================
a[:] a[:]
b[5:] b[5:]
b[5:6, ...] b[5:6, ...]
c[::] c[::]
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (subscript (expression_statement
(subscript
(identifier) (identifier)
(slice))) (slice)))
(expression_statement (subscript (expression_statement
(subscript
(identifier) (identifier)
(slice (integer)))) (slice
(expression_statement (subscript (integer))))
(expression_statement
(subscript
(identifier) (identifier)
(slice (integer) (integer)) (slice
(integer)
(integer))
(ellipsis))) (ellipsis)))
(expression_statement (subscript (expression_statement
(subscript
(identifier) (identifier)
(slice)))) (slice))))
===================================== ================================================================================
Attribute references Attribute references
===================================== ================================================================================
a.b.c a.b.c
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(attribute (attribute
(attribute (identifier) (identifier)) (attribute
(identifier)
(identifier))
(identifier)))) (identifier))))
===================================== ================================================================================
Await expressions Await expressions
===================================== ================================================================================
await i(j, 5) await i(j, 5)
return await i(j, 5) return await i(j, 5)
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(await (call (await
(call
(identifier)
(argument_list
(identifier) (identifier)
(argument_list (identifier) (integer))))) (integer)))))
(return_statement (return_statement
(await (call (await
(call
(identifier) (identifier)
(argument_list (identifier) (integer)))))) (argument_list
(identifier)
(integer))))))
===================================== ================================================================================
Call expressions Call expressions
===================================== ================================================================================
__a__() __a__()
b(1) b(1)
c(e, f=g) c(e, f=g)
i(j, 5,) i(j, 5,)
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (call (expression_statement
(call
(identifier) (identifier)
(argument_list))) (argument_list)))
(expression_statement (call (expression_statement
(call
(identifier) (identifier)
(argument_list (integer)))) (argument_list
(expression_statement (call (integer))))
(expression_statement
(call
(identifier) (identifier)
(argument_list (argument_list
(identifier) (identifier)
(keyword_argument (identifier) (identifier))))) (keyword_argument
(expression_statement (call (identifier)
(identifier)))))
(expression_statement
(call
(identifier) (identifier)
(argument_list (identifier) (integer))))) (argument_list
(identifier)
(integer)))))
===================================== ================================================================================
Print used as an identifier Print used as an identifier
===================================== ================================================================================
print() print()
print(a) print(a)
@ -126,7 +162,7 @@ print(d, *e)
print(*f, **g,) print(*f, **g,)
a(print) a(print)
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -136,13 +172,16 @@ a(print)
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
(argument_list (identifier)))) (argument_list
(identifier))))
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
(argument_list (argument_list
(identifier) (identifier)
(keyword_argument (identifier) (identifier))))) (keyword_argument
(identifier)
(identifier)))))
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
@ -154,21 +193,25 @@ a(print)
(identifier) (identifier)
(argument_list (argument_list
(identifier) (identifier)
(list_splat (identifier))))) (list_splat
(identifier)))))
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
(argument_list (argument_list
(list_splat (identifier)) (list_splat
(dictionary_splat (identifier))))) (identifier))
(dictionary_splat
(identifier)))))
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
(argument_list (identifier))))) (argument_list
(identifier)))))
===================================== ================================================================================
Print used as a parameter Print used as a parameter
===================================== ================================================================================
def a(print): def a(print):
b b
@ -181,39 +224,56 @@ def a(**print):
def print(): def print():
a a
--- --------------------------------------------------------------------------------
(module (module
(function_definition (function_definition
(identifier) (identifier)
(parameters (identifier)) (parameters
(block (expression_statement (identifier)))) (identifier))
(block
(expression_statement
(identifier))))
(function_definition (function_definition
(identifier) (identifier)
(parameters (default_parameter (identifier) (identifier))) (parameters
(block (expression_statement (identifier)))) (default_parameter
(identifier)
(identifier)))
(block
(expression_statement
(identifier))))
(function_definition (function_definition
(identifier) (identifier)
(parameters (list_splat_pattern (identifier))) (parameters
(block (expression_statement (identifier)))) (list_splat_pattern
(identifier)))
(block
(expression_statement
(identifier))))
(function_definition (function_definition
(identifier) (identifier)
(parameters (dictionary_splat_pattern (identifier))) (parameters
(block (expression_statement (identifier)))) (dictionary_splat_pattern
(identifier)))
(block
(expression_statement
(identifier))))
(function_definition (function_definition
(identifier) (identifier)
(parameters) (parameters)
(block (expression_statement (identifier))))) (block
(expression_statement
(identifier)))))
===================================== ================================================================================
Exec used as an identifier Exec used as an identifier
===================================== ================================================================================
exec("print \"'%s' has %i characters\" % (public_function(), len(public_function()))", {"__builtins__" : None}, safe_dict) exec("print \"'%s' has %i characters\" % (public_function(), len(public_function()))", {"__builtins__" : None}, safe_dict)
exec("""exec _code_ in _globs_, _locs_""") exec("""exec _code_ in _globs_, _locs_""")
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -223,67 +283,90 @@ exec("""exec _code_ in _globs_, _locs_""")
(string (string
(escape_sequence) (escape_sequence)
(escape_sequence)) (escape_sequence))
(dictionary (pair (string) (none))) (dictionary
(pair
(string)
(none)))
(identifier)))) (identifier))))
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
(argument_list (string))))) (argument_list
(string)))))
===================================== ================================================================================
Async / await used as identifiers Async / await used as identifiers
===================================== ================================================================================
async = 4 async = 4
await = 5 await = 5
print async, await print async, await
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (assignment (identifier) (integer))) (expression_statement
(expression_statement (assignment (identifier) (integer))) (assignment
(print_statement (identifier) (identifier))) (identifier)
(integer)))
(expression_statement
(assignment
(identifier)
(integer)))
(print_statement
(identifier)
(identifier)))
===================================== ================================================================================
Calls with splats Calls with splats
===================================== ================================================================================
a(*()) a(*())
a(**{}) a(**{})
a(*b) a(*b)
c(d, *e, **g) c(d, *e, **g)
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (call (expression_statement
(call
(identifier) (identifier)
(argument_list (list_splat (tuple))))) (argument_list
(expression_statement (call (list_splat
(tuple)))))
(expression_statement
(call
(identifier) (identifier)
(argument_list (dictionary_splat (dictionary))))) (argument_list
(expression_statement (call (dictionary_splat
(dictionary)))))
(expression_statement
(call
(identifier) (identifier)
(argument_list (argument_list
(list_splat (identifier))))) (list_splat
(expression_statement (call (identifier)))))
(expression_statement
(call
(identifier) (identifier)
(argument_list (argument_list
(identifier) (identifier)
(list_splat (identifier)) (list_splat
(dictionary_splat (identifier)))))) (identifier))
(dictionary_splat
(identifier))))))
===================================== ================================================================================
Math operators Math operators
===================================== ================================================================================
a + b * c ** d - e / 5 a + b * c ** d - e / 5
-5 -5
+x +x
~x ~x
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -298,13 +381,19 @@ a + b * c ** d - e / 5
(binary_operator (binary_operator
(identifier) (identifier)
(integer)))) (integer))))
(expression_statement (unary_operator (integer))) (expression_statement
(expression_statement (unary_operator (identifier))) (unary_operator
(expression_statement (unary_operator (identifier)))) (integer)))
(expression_statement
(unary_operator
(identifier)))
(expression_statement
(unary_operator
(identifier))))
===================================== ================================================================================
Binary Addition / Subtraction With Floats Binary Addition / Subtraction With Floats
===================================== ================================================================================
.1-.0 .1-.0
.1+.0 .1+.0
@ -314,30 +403,42 @@ Binary Addition / Subtraction With Floats
1-.0 1-.0
1+.0 1+.0
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(binary_operator (float) (float))) (binary_operator
(float)
(float)))
(expression_statement (expression_statement
(binary_operator (float) (float))) (binary_operator
(float)
(float)))
(expression_statement (expression_statement
(binary_operator (float) (integer))) (binary_operator
(float)
(integer)))
(expression_statement (expression_statement
(binary_operator (float) (integer))) (binary_operator
(float)
(integer)))
(expression_statement (expression_statement
(binary_operator (integer) (float))) (binary_operator
(integer)
(float)))
(expression_statement (expression_statement
(binary_operator (integer) (float)))) (binary_operator
(integer)
(float))))
===================================== ================================================================================
Power Operator Precedence Power Operator Precedence
===================================== ================================================================================
2**2**3 2**2**3
-2**2 -2**2
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -352,13 +453,13 @@ Power Operator Precedence
(integer) (integer)
(integer))))) (integer)))))
===================================== ================================================================================
Operator precedence Operator precedence
===================================== ================================================================================
a() + b[c] * c.d.e a() + b[c] * c.d.e
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -376,13 +477,13 @@ a() + b[c] * c.d.e
attribute: (identifier)) attribute: (identifier))
attribute: (identifier)))))) attribute: (identifier))))))
===================================== ================================================================================
Bitwise operators Bitwise operators
===================================== ================================================================================
a << b | c >> d & e a << b | c >> d & e
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -396,14 +497,14 @@ a << b | c >> d & e
(identifier)) (identifier))
(identifier))))) (identifier)))))
===================================== ================================================================================
Boolean operators Boolean operators
===================================== ================================================================================
a or b and c a or b and c
not d not d
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -413,16 +514,17 @@ not d
(identifier) (identifier)
(identifier)))) (identifier))))
(expression_statement (expression_statement
(not_operator (identifier)))) (not_operator
(identifier))))
===================================== ================================================================================
Comparison operators Comparison operators
===================================== ================================================================================
a < b <= c == d >= e > f a < b <= c == d >= e > f
not a == b or c == d not a == b or c == d
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -434,13 +536,18 @@ not a == b or c == d
(identifier) (identifier)
(identifier))) (identifier)))
(expression_statement (expression_statement
(not_operator (boolean_operator (not_operator
(comparison_operator (identifier) (identifier)) (boolean_operator
(comparison_operator (identifier) (identifier)))))) (comparison_operator
(identifier)
(identifier))
(comparison_operator
(identifier)
(identifier))))))
==================================================== ================================================================================
Assignments Assignments
==================================================== ================================================================================
a = 1 a = 1
a, b = 1, 2 a, b = 1, 2
@ -449,7 +556,7 @@ a, = 1, 2
a[b] = c = d a[b] = c = d
a, *b.c = d a, *b.c = d
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -468,7 +575,8 @@ a, *b.c = d
(assignment (assignment
(pattern_list (pattern_list
(identifier) (identifier)
(list_splat_pattern (identifier))) (list_splat_pattern
(identifier)))
(expression_list (expression_list
(integer) (integer)
(integer) (integer)
@ -482,7 +590,9 @@ a, *b.c = d
(integer)))) (integer))))
(expression_statement (expression_statement
(assignment (assignment
(subscript (identifier) (identifier)) (subscript
(identifier)
(identifier))
(assignment (assignment
(identifier) (identifier)
(identifier)))) (identifier))))
@ -490,32 +600,39 @@ a, *b.c = d
(assignment (assignment
(pattern_list (pattern_list
(identifier) (identifier)
(list_splat_pattern (attribute (identifier) (identifier)))) (list_splat_pattern
(attribute
(identifier)
(identifier))))
(identifier)))) (identifier))))
==================================================== ================================================================================
Assignments with type annotations Assignments with type annotations
==================================================== ================================================================================
tail_leaves: List[Leaf] = [] tail_leaves: List[Leaf] = []
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (assignment (expression_statement
(assignment
(identifier) (identifier)
(type (subscript (identifier) (identifier))) (type
(subscript
(identifier)
(identifier)))
(list)))) (list))))
==================================================== ================================================================================
Augmented assignments Augmented assignments
==================================================== ================================================================================
a += 1 a += 1
b >>= 2 b >>= 2
c //= 1 c //= 1
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -531,9 +648,9 @@ c //= 1
(identifier) (identifier)
(integer)))) (integer))))
==================================================== ================================================================================
Named expressions Named expressions
==================================================== ================================================================================
a := x a := x
(y := f(x)) (y := f(x))
@ -546,7 +663,7 @@ def foo(answer: (p := 42) = 5):
foo(x := 3, cat='vector') foo(x := 3, cat='vector')
(z := (y := (x := 0))) (z := (y := (x := 0)))
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -557,7 +674,10 @@ foo(x := 3, cat='vector')
(parenthesized_expression (parenthesized_expression
(named_expression (named_expression
(identifier) (identifier)
(call (identifier) (argument_list (identifier)))))) (call
(identifier)
(argument_list
(identifier))))))
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
@ -567,35 +687,56 @@ foo(x := 3, cat='vector')
(parenthesized_expression (parenthesized_expression
(named_expression (named_expression
(identifier) (identifier)
(call (identifier) (argument_list (identifier))))))))) (call
(identifier)
(argument_list
(identifier)))))))))
(expression_statement (expression_statement
(assignment (assignment
(identifier) (identifier)
(parenthesized_expression (parenthesized_expression
(named_expression (named_expression
(identifier) (identifier)
(call (identifier) (argument_list (identifier))))))) (call
(identifier)
(argument_list
(identifier)))))))
(function_definition (function_definition
(identifier) (identifier)
(parameters (parameters
(default_parameter (default_parameter
(identifier) (identifier)
(parenthesized_expression (named_expression (identifier) (integer))))) (parenthesized_expression
(block (return_statement (identifier)))) (named_expression
(identifier)
(integer)))))
(block
(return_statement
(identifier))))
(function_definition (function_definition
(identifier) (identifier)
(parameters (parameters
(typed_default_parameter (typed_default_parameter
(identifier) (identifier)
(type (parenthesized_expression (named_expression (identifier) (integer)))) (type
(parenthesized_expression
(named_expression
(identifier)
(integer))))
(integer))) (integer)))
(block (return_statement (identifier)))) (block
(return_statement
(identifier))))
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
(argument_list (argument_list
(named_expression (identifier) (integer)) (named_expression
(keyword_argument (identifier) (string))))) (identifier)
(integer))
(keyword_argument
(identifier)
(string)))))
(expression_statement (expression_statement
(parenthesized_expression (parenthesized_expression
(named_expression (named_expression
@ -608,9 +749,9 @@ foo(x := 3, cat='vector')
(identifier) (identifier)
(integer))))))))) (integer)))))))))
==================================================== ================================================================================
Yield expressions Yield expressions
==================================================== ================================================================================
def example(): def example():
yield yield
@ -619,17 +760,26 @@ def example():
yield from a yield from a
yield from (yield from (x for x in range(1, 10))) yield from (yield from (x for x in range(1, 10)))
--- --------------------------------------------------------------------------------
(module (module
(function_definition (identifier) (parameters) (block (function_definition
(expression_statement (yield)) (identifier)
(expression_statement (yield (integer))) (parameters)
(block
(expression_statement
(yield))
(expression_statement
(yield
(integer)))
(expression_statement (expression_statement
(assignment (assignment
(identifier) (identifier)
(yield (integer)))) (yield
(expression_statement (yield (identifier))) (integer))))
(expression_statement
(yield
(identifier)))
(expression_statement (expression_statement
(yield (yield
(parenthesized_expression (parenthesized_expression
@ -638,18 +788,22 @@ def example():
(identifier) (identifier)
(for_in_clause (for_in_clause
(identifier) (identifier)
(call (identifier) (argument_list (integer) (integer)))))))))))) (call
(identifier)
(argument_list
(integer)
(integer))))))))))))
==================================================== ================================================================================
lambdas lambdas
==================================================== ================================================================================
lambda b, c: d("e" % f) lambda b, c: d("e" % f)
lambda: True lambda: True
lambda a, b = c, *d, **e: a lambda a, b = c, *d, **e: a
lambda (a, b): (a, b) lambda (a, b): (a, b)
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -660,86 +814,123 @@ lambda (a, b): (a, b)
(call (call
(identifier) (identifier)
(argument_list (argument_list
(binary_operator (string) (identifier)))))) (binary_operator
(string)
(identifier))))))
(expression_statement (expression_statement
(lambda (true))) (lambda
(true)))
(expression_statement (expression_statement
(lambda (lambda
(lambda_parameters (lambda_parameters
(identifier) (identifier)
(default_parameter (identifier) (identifier)) (default_parameter
(list_splat_pattern (identifier)) (identifier)
(dictionary_splat_pattern (identifier))) (identifier))
(list_splat_pattern
(identifier))
(dictionary_splat_pattern
(identifier)))
(identifier))) (identifier)))
(expression_statement (expression_statement
(lambda (lambda
(lambda_parameters (tuple_pattern (identifier) (identifier))) (lambda_parameters
(tuple (identifier) (identifier))))) (tuple_pattern
(identifier)
(identifier)))
(tuple
(identifier)
(identifier)))))
===================================== ================================================================================
Tuples with splats Tuples with splats
===================================== ================================================================================
(foo, *bar, *baz) (foo, *bar, *baz)
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(tuple (identifier) (list_splat (identifier)) (list_splat (identifier))))) (tuple
(identifier)
(list_splat
(identifier))
(list_splat
(identifier)))))
===================================== ================================================================================
Tuples with yield Tuples with yield
===================================== ================================================================================
(a, yield a, b, c) (a, yield a, b, c)
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(tuple (tuple
(identifier) (identifier)
(yield (expression_list (identifier) (identifier) (identifier)))))) (yield
(expression_list
(identifier)
(identifier)
(identifier))))))
===================================== ================================================================================
Conditional if expressions Conditional if expressions
===================================== ================================================================================
a = b if c else d a = b if c else d
something() if a else d something() if a else d
slice(1,1,1) if a else d slice(1,1,1) if a else d
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(assignment (assignment
(identifier) (identifier)
(conditional_expression (identifier) (identifier) (identifier)))) (conditional_expression
(identifier)
(identifier)
(identifier))))
(expression_statement (expression_statement
(conditional_expression (call (identifier) (argument_list)) (identifier) (identifier))) (conditional_expression
(call
(identifier)
(argument_list))
(identifier)
(identifier)))
(expression_statement (expression_statement
(conditional_expression (conditional_expression
(call (identifier) (argument_list (integer) (integer) (integer))) (call
(identifier) (identifier)))) (identifier)
(argument_list
(integer)
(integer)
(integer)))
(identifier)
(identifier))))
======================================== ================================================================================
Async context managers and iterators Async context managers and iterators
======================================== ================================================================================
async with a as b: async with a as b:
async for c in d: async for c in d:
[e async for f in g] [e async for f in g]
--- --------------------------------------------------------------------------------
(module (module
(with_statement (with_statement
(with_clause (with_clause
(with_item (with_item
value: (identifier) value: (as_pattern
alias: (identifier))) (identifier)
alias: (as_pattern_target
(identifier)))))
body: (block body: (block
(for_statement (for_statement
left: (identifier) left: (identifier)

@ -1,6 +1,6 @@
===================================== ================================================================================
Integers Integers
===================================== ================================================================================
-1 -1
0xDEAD 0xDEAD
@ -16,26 +16,41 @@ Integers
0O1_1 0O1_1
0L 0L
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (unary_operator (integer))) (expression_statement
(expression_statement (integer)) (unary_operator
(expression_statement (integer)) (integer)))
(expression_statement (integer)) (expression_statement
(expression_statement (unary_operator (integer))) (integer))
(expression_statement (integer)) (expression_statement
(expression_statement (integer)) (integer))
(expression_statement (integer)) (expression_statement
(expression_statement (integer)) (integer))
(expression_statement (integer)) (expression_statement
(expression_statement (integer)) (unary_operator
(expression_statement (integer)) (integer)))
(expression_statement (integer))) (expression_statement
(integer))
===================================== (expression_statement
(integer))
(expression_statement
(integer))
(expression_statement
(integer))
(expression_statement
(integer))
(expression_statement
(integer))
(expression_statement
(integer))
(expression_statement
(integer)))
================================================================================
Floats Floats
===================================== ================================================================================
-.6_6 -.6_6
+.1_1 +.1_1
@ -48,24 +63,35 @@ Floats
1_0.l 1_0.l
.1l .1l
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (unary_operator (float))) (expression_statement
(expression_statement (unary_operator (float))) (unary_operator
(expression_statement (float)) (float)))
(expression_statement (float)) (expression_statement
(expression_statement (float)) (unary_operator
(expression_statement (float)) (float)))
(expression_statement (float)) (expression_statement
(expression_statement (float)) (float))
(expression_statement (float)) (expression_statement
(expression_statement (float))) (float))
(expression_statement
(float))
===================================== (expression_statement
(float))
(expression_statement
(float))
(expression_statement
(float))
(expression_statement
(float))
(expression_statement
(float)))
================================================================================
Scientific Notation Floats Scientific Notation Floats
===================================== ================================================================================
1e322 1e322
1e-3 1e-3
@ -74,19 +100,26 @@ Scientific Notation Floats
1.e10 1.e10
-1e10 -1e10
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (float)) (expression_statement
(expression_statement (float)) (float))
(expression_statement (float)) (expression_statement
(expression_statement (float)) (float))
(expression_statement (float)) (expression_statement
(expression_statement (unary_operator (float)))) (float))
(expression_statement
===================================== (float))
(expression_statement
(float))
(expression_statement
(unary_operator
(float))))
================================================================================
Strings Strings
===================================== ================================================================================
"I'm ok" "I'm ok"
'"ok"' '"ok"'
@ -102,25 +135,53 @@ b"\x12\u12\U12\x13\N{WINKING FACE}"
"\xab\123\'\"\a\b\f\r\n\t\v\\" "\xab\123\'\"\a\b\f\r\n\t\v\\"
"\xgh\o123\p\q\c\d\e\u12\U1234" "\xgh\o123\p\q\c\d\e\u12\U1234"
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (string)) (expression_statement
(expression_statement (string)) (string))
(expression_statement (string)) (expression_statement
(expression_statement (string)) (string))
(expression_statement (string)) (expression_statement
(expression_statement (string)) (string))
(expression_statement (string (escape_sequence))) (expression_statement
(expression_statement (string)) (string))
(expression_statement (string (escape_sequence))) (expression_statement
(expression_statement (string (escape_sequence) (escape_sequence))) (string))
(expression_statement (string (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence) (escape_sequence))) (expression_statement
(expression_statement (string))) (string))
(expression_statement
===================================== (string
(escape_sequence)))
(expression_statement
(string))
(expression_statement
(string
(escape_sequence)))
(expression_statement
(string
(escape_sequence)
(escape_sequence)))
(expression_statement
(string
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)
(escape_sequence)))
(expression_statement
(string)))
================================================================================
Raw strings Raw strings
===================================== ================================================================================
'ab\x00cd' 'ab\x00cd'
"\n" "\n"
@ -129,34 +190,44 @@ Raw strings
r'ab\x00cd' r'ab\x00cd'
ur"\n" ur"\n"
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (string (escape_sequence))) (expression_statement
(expression_statement (string (escape_sequence))) (string
(escape_sequence)))
(expression_statement
(string
(escape_sequence)))
(comment) (comment)
(expression_statement (string)) (expression_statement
(expression_statement (string))) (string))
(expression_statement
(string)))
===================================== ================================================================================
Raw strings with escaped quotes Raw strings with escaped quotes
===================================== ================================================================================
re.compile(r"(\n|\A)#include\s*['\"]" re.compile(r"(\n|\A)#include\s*['\"]"
r"(?P<name>[\w\d./\\]+[.]src)['\"]") r"(?P<name>[\w\d./\\]+[.]src)['\"]")
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(call (call
(attribute (identifier) (identifier)) (attribute
(identifier)
(identifier))
(argument_list (argument_list
(concatenated_string (string) (string)))))) (concatenated_string
(string)
(string))))))
===================================== ================================================================================
Format strings Format strings
===================================== ================================================================================
# nested! # nested!
f"a {b(f'c {e} d')} e" f"a {b(f'c {e} d')} e"
@ -168,7 +239,7 @@ f"a {{{b}"
f"a {{b}}" f"a {{b}}"
f"a {{{b}}}" f"a {{{b}}}"
--- --------------------------------------------------------------------------------
(module (module
(comment) (comment)
@ -206,68 +277,89 @@ f"a {{{b}}}"
(interpolation (interpolation
(identifier))))) (identifier)))))
====================================== ================================================================================
Format strings with format specifiers Format strings with format specifiers
====================================== ================================================================================
f"a {b:2} {c:34.5}" f"a {b:2} {c:34.5}"
f"{b:{c.d}.{d.e}}" f"{b:{c.d}.{d.e}}"
f"{a:#06x}" f"{a:#06x}"
f"{a=}"
f"{a=:.2f}"
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(string (string
(interpolation (identifier) (format_specifier)) (interpolation
(interpolation (identifier) (format_specifier)))) (identifier)
(format_specifier))
(interpolation
(identifier)
(format_specifier))))
(expression_statement (expression_statement
(string (string
(interpolation (interpolation
(identifier) (identifier)
(format_specifier (format_specifier
(format_expression (attribute (identifier) (identifier))) (format_expression
(format_expression (attribute (identifier) (identifier))))))) (attribute
(identifier)
(identifier)))
(format_expression
(attribute
(identifier)
(identifier)))))))
(expression_statement
(string
(interpolation (identifier) (format_specifier))))
(expression_statement
(string (interpolation (identifier))))
(expression_statement (expression_statement
(string (string
(interpolation (identifier) (format_specifier))))) (interpolation (identifier) (format_specifier)))))
===================================== ================================================================================
Unicode escape sequences Unicode escape sequences
===================================== ================================================================================
"\x12 \123 \u1234" "\x12 \123 \u1234"
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (string (expression_statement
(string
(escape_sequence) (escape_sequence)
(escape_sequence) (escape_sequence)
(escape_sequence)))) (escape_sequence))))
===================================== ================================================================================
Other primitives Other primitives
===================================== ================================================================================
True True
False False
None None
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (true)) (expression_statement
(expression_statement (false)) (true))
(expression_statement (none))) (expression_statement
(false))
(expression_statement
(none)))
===================================== ================================================================================
Concatenated strings Concatenated strings
===================================== ================================================================================
"one" "two" "three" "one" "two" "three"
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -276,9 +368,9 @@ Concatenated strings
(string) (string)
(string)))) (string))))
===================================== ================================================================================
Multi-line strings Multi-line strings
===================================== ================================================================================
""" """
A double quote hello, A double quote hello,
@ -316,16 +408,23 @@ with an escaped newline\n\
and another escaped newline\n\ and another escaped newline\n\
""" """
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (string)) (expression_statement
(expression_statement (string)) (string))
(expression_statement (string)) (expression_statement
(expression_statement (string)) (string))
(expression_statement (string)) (expression_statement
(expression_statement (string)) (string))
(expression_statement (string (expression_statement
(string))
(expression_statement
(string))
(expression_statement
(string))
(expression_statement
(string
(escape_sequence) (escape_sequence)
(escape_sequence) (escape_sequence)
(escape_sequence) (escape_sequence)
@ -333,9 +432,9 @@ and another escaped newline\n\
(escape_sequence) (escape_sequence)
(escape_sequence)))) (escape_sequence))))
===================================== ================================================================================
Lists Lists
===================================== ================================================================================
[a, b, [c, d]] [a, b, [c, d]]
[*()] [*()]
@ -345,7 +444,7 @@ Lists
[*a[b].c] [*a[b].c]
[*a()] [*a()]
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
@ -355,30 +454,61 @@ Lists
(list (list
(identifier) (identifier)
(identifier)))) (identifier))))
(expression_statement (list (list_splat (tuple)))) (expression_statement
(expression_statement (list (list_splat (list)))) (list
(expression_statement (list (list_splat (identifier)))) (list_splat
(expression_statement (list (list_splat (attribute (identifier) (identifier))))) (tuple))))
(expression_statement (list (list_splat (attribute (subscript (identifier) (identifier)) (identifier))))) (expression_statement
(expression_statement (list (list_splat (call (identifier) (argument_list)))))) (list
(list_splat
===================================== (list))))
(expression_statement
(list
(list_splat
(identifier))))
(expression_statement
(list
(list_splat
(attribute
(identifier)
(identifier)))))
(expression_statement
(list
(list_splat
(attribute
(subscript
(identifier)
(identifier))
(identifier)))))
(expression_statement
(list
(list_splat
(call
(identifier)
(argument_list))))))
================================================================================
List comprehensions List comprehensions
===================================== ================================================================================
[a + b for (a, b) in items] [a + b for (a, b) in items]
[a for b in c for a in b] [a for b in c for a in b]
[(x,y) for x in [1,2,3] for y in [1,2,3] if True] [(x,y) for x in [1,2,3] for y in [1,2,3] if True]
[a for a in lambda: True, lambda: False if a()] [a for a in lambda: True, lambda: False if a()]
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(list_comprehension (list_comprehension
(binary_operator (identifier) (identifier)) (binary_operator
(identifier)
(identifier))
(for_in_clause (for_in_clause
(tuple_pattern (identifier) (identifier)) (identifier)))) (tuple_pattern
(identifier)
(identifier))
(identifier))))
(expression_statement (expression_statement
(list_comprehension (list_comprehension
(identifier) (identifier)
@ -390,23 +520,40 @@ List comprehensions
(identifier)))) (identifier))))
(expression_statement (expression_statement
(list_comprehension (list_comprehension
(tuple (identifier) (identifier)) (tuple
(for_in_clause (identifier) (identifier)
(list (integer) (integer) (integer))) (identifier))
(for_in_clause (identifier) (for_in_clause
(list (integer) (integer) (integer))) (identifier)
(if_clause (true)))) (list
(integer)
(integer)
(integer)))
(for_in_clause
(identifier)
(list
(integer)
(integer)
(integer)))
(if_clause
(true))))
(expression_statement (expression_statement
(list_comprehension (list_comprehension
(identifier) (identifier)
(for_in_clause (identifier) (for_in_clause
(lambda (true)) (identifier)
(lambda (false))) (lambda
(if_clause (call (identifier) (argument_list)))))) (true))
(lambda
(false)))
(if_clause
(call
(identifier)
(argument_list))))))
===================================== ================================================================================
Dictionaries Dictionaries
===================================== ================================================================================
{a: 1, b: 2} {a: 1, b: 2}
{} {}
@ -416,77 +563,122 @@ Dictionaries
{**a[b].c} {**a[b].c}
{**a()} {**a()}
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(dictionary (dictionary
(pair (identifier) (integer)) (pair
(pair (identifier) (integer)))) (identifier)
(integer))
(pair
(identifier)
(integer))))
(expression_statement (expression_statement
(dictionary)) (dictionary))
(expression_statement (expression_statement
(dictionary (dictionary_splat (dictionary)))) (dictionary
(dictionary_splat
(dictionary))))
(expression_statement (expression_statement
(dictionary (dictionary_splat (identifier)))) (dictionary
(dictionary_splat
(identifier))))
(expression_statement (expression_statement
(dictionary (dictionary_splat (attribute (identifier) (identifier))))) (dictionary
(dictionary_splat
(attribute
(identifier)
(identifier)))))
(expression_statement (expression_statement
(dictionary (dictionary_splat (attribute (subscript (identifier) (identifier)) (identifier))))) (dictionary
(dictionary_splat
(attribute
(subscript
(identifier)
(identifier))
(identifier)))))
(expression_statement (expression_statement
(dictionary (dictionary_splat (call (identifier) (argument_list)))))) (dictionary
(dictionary_splat
(call
(identifier)
(argument_list))))))
===================================== ================================================================================
Dictionary comprehensions Dictionary comprehensions
===================================== ================================================================================
{a: b for a, b in items} {a: b for a, b in items}
{a: b for c in d for e in items} {a: b for c in d for e in items}
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(dictionary_comprehension (dictionary_comprehension
(pair (identifier) (identifier)) (pair
(identifier)
(identifier))
(for_in_clause (for_in_clause
(pattern_list (identifier) (identifier)) (identifier)))) (pattern_list
(identifier)
(identifier))
(identifier))))
(expression_statement (expression_statement
(dictionary_comprehension (dictionary_comprehension
(pair (identifier) (identifier)) (pair
(identifier)
(identifier))
(for_in_clause (for_in_clause
(identifier) (identifier)) (identifier)
(identifier))
(for_in_clause (for_in_clause
(identifier) (identifier))))) (identifier)
(identifier)))))
===================================== ================================================================================
Sets Sets
===================================== ================================================================================
{a, b, c,} {a, b, c,}
{*{}} {*{}}
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (set (identifier) (identifier) (identifier))) (expression_statement
(expression_statement (set (list_splat (dictionary))))) (set
(identifier)
(identifier)
(identifier)))
(expression_statement
(set
(list_splat
(dictionary)))))
===================================== ================================================================================
Set comprehensions Set comprehensions
===================================== ================================================================================
{a[b][c] for a, b, c in items} {a[b][c] for a, b, c in items}
{r for s in qs for n in ms} {r for s in qs for n in ms}
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(set_comprehension (set_comprehension
(subscript (subscript (identifier) (identifier)) (identifier)) (subscript
(subscript
(identifier)
(identifier))
(identifier))
(for_in_clause (for_in_clause
(pattern_list (identifier) (identifier) (identifier)) (pattern_list
(identifier)
(identifier)
(identifier))
(identifier)))) (identifier))))
(expression_statement (expression_statement
(set_comprehension (set_comprehension
@ -498,48 +690,70 @@ Set comprehensions
(identifier) (identifier)
(identifier))))) (identifier)))))
===================================== ================================================================================
Simple Tuples Simple Tuples
===================================== ================================================================================
() ()
(a, b) (a, b)
(a, b, c,) (a, b, c,)
(print, exec) (print, exec)
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (tuple)) (expression_statement
(expression_statement (tuple (identifier) (identifier))) (tuple))
(expression_statement (tuple (identifier) (identifier) (identifier))) (expression_statement
(expression_statement (tuple (identifier) (identifier)))) (tuple
(identifier)
(identifier)))
(expression_statement
(tuple
(identifier)
(identifier)
(identifier)))
(expression_statement
(tuple
(identifier)
(identifier))))
===================================== ================================================================================
Generator expression Generator expression
===================================== ================================================================================
(a[b][c] for a, b, c in items) (a[b][c] for a, b, c in items)
dict((a, b) for a, b in d) dict((a, b) for a, b in d)
(a for b in c for d in e,) (a for b in c for d in e,)
(x for x in range(1, 10)) (x for x in range(1, 10))
--- --------------------------------------------------------------------------------
(module (module
(expression_statement (expression_statement
(generator_expression (generator_expression
(subscript (subscript (identifier) (identifier)) (identifier)) (subscript
(subscript
(identifier)
(identifier))
(identifier))
(for_in_clause (for_in_clause
(pattern_list (identifier) (identifier) (identifier)) (pattern_list
(identifier)
(identifier)
(identifier))
(identifier)))) (identifier))))
(expression_statement (expression_statement
(call (call
(identifier) (identifier)
(generator_expression (generator_expression
(tuple (identifier) (identifier)) (tuple
(identifier)
(identifier))
(for_in_clause (for_in_clause
(pattern_list (identifier) (identifier)) (pattern_list
(identifier)
(identifier))
(identifier))))) (identifier)))))
(expression_statement (expression_statement
(generator_expression (generator_expression
@ -555,4 +769,8 @@ dict((a, b) for a, b in d)
(identifier) (identifier)
(for_in_clause (for_in_clause
(identifier) (identifier)
(call (identifier) (argument_list (integer) (integer))))))) (call
(identifier)
(argument_list
(integer)
(integer)))))))

@ -0,0 +1,568 @@
================================================================================
Matching specific values
================================================================================
match command.split():
case ["quit"]:
print("Goodbye!")
quit_game()
case ["look"]:
current_room.describe()
case ["get", obj]:
character.get(obj, current_room)
case ["go", direction]:
current_room = current_room.neighbor(direction)
# The rest of your commands go here
--------------------------------------------------------------------------------
(module
(match_statement
(call
(attribute
(identifier)
(identifier))
(argument_list))
(case_clause
(case_pattern
(list
(string)))
(block
(expression_statement
(call
(identifier)
(argument_list
(string))))
(expression_statement
(call
(identifier)
(argument_list)))))
(case_clause
(case_pattern
(list
(string)))
(block
(expression_statement
(call
(attribute
(identifier)
(identifier))
(argument_list)))))
(case_clause
(case_pattern
(list
(string)
(identifier)))
(block
(expression_statement
(call
(attribute
(identifier)
(identifier))
(argument_list
(identifier)
(identifier))))))
(case_clause
(case_pattern
(list
(string)
(identifier)))
(block
(expression_statement
(assignment
(identifier)
(call
(attribute
(identifier)
(identifier))
(argument_list
(identifier))))))))
(comment))
================================================================================
Matching multiple values
================================================================================
match command.split():
case ["drop", *objects]:
for obj in objects:
character.drop(obj, current_room)
--------------------------------------------------------------------------------
(module
(match_statement
(call
(attribute
(identifier)
(identifier))
(argument_list))
(case_clause
(case_pattern
(list
(string)
(list_splat
(identifier))))
(block
(for_statement
(identifier)
(identifier)
(block
(expression_statement
(call
(attribute
(identifier)
(identifier))
(argument_list
(identifier)
(identifier))))))))))
================================================================================
Adding a wild card
================================================================================
match command.split():
# ^ conditional
case ["quit"]: ... # Code omitted for brevity
case ["go", direction]: pass
case ["drop", *objects]: pass
case _:
print(f"Sorry, I couldn't understand {command!r}")
--------------------------------------------------------------------------------
(module
(match_statement
(call
(attribute
(identifier)
(identifier))
(argument_list))
(comment)
(case_clause
(case_pattern
(list
(string)))
(block
(expression_statement
(ellipsis))
(comment)))
(case_clause
(case_pattern
(list
(string)
(identifier)))
(block
(pass_statement)))
(case_clause
(case_pattern
(list
(string)
(list_splat
(identifier))))
(block
(pass_statement)))
(case_clause
(case_pattern
(identifier))
(block
(expression_statement
(call
(identifier)
(argument_list
(string
(interpolation
(identifier)
(type_conversion))))))))))
================================================================================
Or patterns
================================================================================
match command.split():
case ["north"] | ["go", "north"]:
current_room = current_room.neighbor("north")
case ["get", obj] | ["pick", "up", obj] | ["pick", obj, "up"]:
pass
--------------------------------------------------------------------------------
(module
(match_statement
(call
(attribute
(identifier)
(identifier))
(argument_list))
(case_clause
(case_pattern
(binary_operator
(list
(string))
(list
(string)
(string))))
(block
(expression_statement
(assignment
(identifier)
(call
(attribute
(identifier)
(identifier))
(argument_list
(string)))))))
(case_clause
(case_pattern
(binary_operator
(binary_operator
(list
(string)
(identifier))
(list
(string)
(string)
(identifier)))
(list
(string)
(identifier)
(string))))
(block
(pass_statement)))))
================================================================================
As patterns
================================================================================
match command.split():
case ["go", ("north" | "south" | "east" | "west") as direction]:
current_room = current_room.neighbor(direction)
--------------------------------------------------------------------------------
(module
(match_statement
(call
(attribute
(identifier)
(identifier))
(argument_list))
(case_clause
(case_pattern
(list
(string)
(as_pattern
(parenthesized_expression
(binary_operator
(binary_operator
(binary_operator
(string)
(string))
(string))
(string)))
(as_pattern_target
(identifier)))))
(block
(expression_statement
(assignment
(identifier)
(call
(attribute
(identifier)
(identifier))
(argument_list
(identifier)))))))))
================================================================================
Actually not match
================================================================================
match = 2
match, a = 2, 3
match: int = secret
x, match = 2, "hey, what's up?"
--------------------------------------------------------------------------------
(module
(expression_statement
(assignment
(identifier)
(integer)))
(expression_statement
(assignment
(pattern_list
(identifier)
(identifier))
(expression_list
(integer)
(integer))))
(expression_statement
(assignment
(identifier)
(type
(identifier))
(identifier)))
(expression_statement
(assignment
(pattern_list
(identifier)
(identifier))
(expression_list
(integer)
(string)))))
================================================================================
Match is match but not pattern matching
================================================================================
a = [match]
match = [match]
--------------------------------------------------------------------------------
(module
(expression_statement
(assignment
(identifier)
(list
(identifier))))
(expression_statement
(assignment
(identifier)
(list
(identifier)))))
================================================================================
Match kwargs
================================================================================
field = call(match=r".*\.txt$")
--------------------------------------------------------------------------------
(module
(expression_statement
(assignment
(identifier)
(call
(identifier)
(argument_list
(keyword_argument
(identifier)
(string)))))))
================================================================================
Match kwargs 2
================================================================================
field = match(match=match, match)
--------------------------------------------------------------------------------
(module
(expression_statement
(assignment
(identifier)
(call
(identifier)
(argument_list
(keyword_argument
(identifier)
(identifier))
(identifier))))))
================================================================================
Case used as identifier
================================================================================
a = [case]
case = [case]
just_in_case = call_me(case=True)
--------------------------------------------------------------------------------
(module
(expression_statement
(assignment
(identifier)
(list
(identifier))))
(expression_statement
(assignment
(identifier)
(list
(identifier))))
(expression_statement
(assignment
(identifier)
(call
(identifier)
(argument_list
(keyword_argument
(identifier)
(true)))))))
================================================================================
If guards
================================================================================
match 0:
case 0 if False:
x = False
case 0 if True:
x = True
--------------------------------------------------------------------------------
(module
(match_statement
(integer)
(case_clause
(case_pattern
(integer))
(if_clause
(false))
(block
(expression_statement
(assignment
(identifier)
(false)))))
(case_clause
(case_pattern
(integer))
(if_clause
(true))
(block
(expression_statement
(assignment
(identifier)
(true)))))))
================================================================================
Comma separated cases
================================================================================
match (0, 1, 2):
case 0,1:
x = 0
case 0, *x:
x = 0
--------------------------------------------------------------------------------
(module
(match_statement
(tuple
(integer)
(integer)
(integer))
(case_clause
(case_pattern
(integer))
(case_pattern
(integer))
(block
(expression_statement
(assignment
(identifier)
(integer)))))
(case_clause
(case_pattern
(integer))
(case_pattern
(identifier))
(block
(expression_statement
(assignment
(identifier)
(integer)))))))
================================================================================
case terminating in comma
================================================================================
match x,:
case *x,:
y = 0
--------------------------------------------------------------------------------
(module
(match_statement
(identifier)
(case_clause
(case_pattern
(identifier))
(block
(expression_statement
(assignment
(identifier)
(integer)))))))
================================================================================
Multiple match patterns
================================================================================
match ..., ...:
case a, b:
return locals()
--------------------------------------------------------------------------------
(module
(match_statement
(ellipsis)
(ellipsis)
(case_clause
(case_pattern
(identifier))
(case_pattern
(identifier))
(block
(return_statement
(call
(identifier)
(argument_list)))))))
================================================================================
Match match, case case
================================================================================
match = case = 0
match match:
case case:
x = 0
--------------------------------------------------------------------------------
(module
(expression_statement
(assignment
(identifier)
(assignment
(identifier)
(integer))))
(match_statement
(identifier)
(case_clause
(case_pattern
(identifier))
(block
(expression_statement
(assignment
(identifier)
(integer)))))))
================================================================================
Walrus match (Issue #150)
================================================================================
if match := re.fullmatch(r"(-)?(\d+:)?\d?\d:\d\d(\.\d*)?", time, flags=re.ASCII):
return 42
--------------------------------------------------------------------------------
(module
(if_statement
(named_expression
(identifier)
(call
(attribute
(identifier)
(identifier))
(argument_list
(string)
(identifier)
(keyword_argument
(identifier)
(attribute
(identifier)
(identifier))))))
(block
(return_statement
(integer)))))

File diff suppressed because it is too large Load Diff

@ -0,0 +1,4 @@
def g(h, i, /, j, *, k=100, **kwarg):
# ^ operator
# ^ operator
pass

@ -0,0 +1,54 @@
match command.split():
# ^ keyword
case ["quit"]:
# ^ keyword
print("Goodbye!")
quit_game()
case ["look"]:
# ^ keyword
current_room.describe()
case ["get", obj]:
# ^ keyword
character.get(obj, current_room)
case ["go", direction]:
# ^ keyword
current_room = current_room.neighbor(direction)
# The rest of your commands go here
match command.split():
# ^ keyword
case ["drop", *objects]:
# ^ keyword
for obj in objects:
character.drop(obj, current_room)
match command.split():
# ^ keyword
case ["quit"]: ... # Code omitted for brevity
case ["go", direction]: pass
case ["drop", *objects]: pass
case _:
print(f"Sorry, I couldn't understand {command!r}")
match command.split():
# ^ keyword
case ["north"] | ["go", "north"]:
# ^ keyword
current_room = current_room.neighbor("north")
case ["get", obj] | ["pick", "up", obj] | ["pick", obj, "up"]:
# ^ keyword
pass
match = 2
# ^ variable
match, a = 2, 3
# ^ variable
match: int = secret
# ^ variable
x, match: str = 2, "hey, what's up?"
# <- variable
# ^ variable
if match := re.fullmatch(r"(-)?(\d+:)?\d?\d:\d\d(\.\d*)?", time, flags=re.ASCII):
# ^ variable
return match