@+:block_parameter { { !"\n" SP }+ @+:block_parameter }*\r
;\r
\r
-implicit_identifier_tuple\r
- =\r
- tuple+:IDENTIFIER { {SP}* "," {SP}* tuple+:IDENTIFIER }+\r
- ;\r
-\r
block_parameters\r
=\r
@+:block_parameter\r
\r
block_parameter_key\r
=\r
- | implicit_identifier_tuple\r
- | variable_accessor_call_parameter_key\r
+ variable_accessor_call_parameter_key\r
;\r
\r
block_parameter_value_only\r
=\r
- | value:implicit_identifier_tuple\r
| value:variable_identifier_with_alias\r
| value:variable_accessor_call_parameter_value\r
| value:conditional_expression\r
=\r
literal_type:`tuple`\r
(\r
- | ( "(" {SP}* value+:LITERAL {SP}* { "," {SP}* value+:LITERAL {SP}* }+ ")" )\r
- | ( "(" {SP}* value+:LITERAL {SP}* "," {SP}* ")" )\r
+ | value:EXPLICIT_TUPLE_LITERAL\r
+ | value:IMPLICIT_TUPLE_LITERAL\r
+ | EMPTY_TUPLE_LITERAL\r
)\r
;\r
\r
+EXPLICIT_TUPLE_LITERAL\r
+ =\r
+ | ( "(" {SP}* @+:LITERAL {SP}* { "," {SP}* @+:LITERAL {SP}* }+ ")" )\r
+ | ( "(" {SP}* @+:LITERAL {SP}* "," {SP}* ")" )\r
+ ;\r
+\r
+IMPLICIT_TUPLE_LITERAL\r
+ =\r
+ | ( @+:LITERAL {SP}* { "," {SP}* @+:LITERAL {SP}* }+ )\r
+ | ( @+:LITERAL {SP}* "," {SP}* )\r
+ ;\r
+\r
+EMPTY_TUPLE_LITERAL\r
+ =\r
+ "(" {SP}* ")"\r
+ ;\r
+\r
INTEGER_LITERAL\r
=\r
/[\d_]*\d+/\r
return nodes.Template(parse(ast), lineno=1)\r
\r
def parse_variable(ast, variable_context='load'):\r
- if 'tuple' in ast:\r
- return parse_variable_tuple(ast, variable_context)\r
-\r
name = ast['variable']\r
\r
if 'literal_type' in name:\r
\r
return last_filter\r
\r
-def parse_variable_tuple(ast, variable_context):\r
- identifiers = []\r
-\r
- for name in ast['tuple']:\r
- identifiers.append(nodes.Name(name, variable_context))\r
-\r
- return nodes.Tuple(\r
- identifiers,\r
- variable_context,\r
- lineno=lineno_from_parseinfo(ast['parseinfo'])\r
- )\r
-\r
def _parse_import_context(block_parameters):\r
if block_parameters[-1]['value']['variable'] != 'context':\r
return None\r