1
0

Compare commits

...

2 Commits

Author SHA1 Message Date
d1b116cc35 Begin completing syntax revision 2023-10-31 18:18:39 -04:00
ea4ffb492c Revise syntax 2023-10-31 16:25:13 -04:00
14 changed files with 83954 additions and 56268 deletions

View File

@ -3,28 +3,20 @@ suspects = ['White' 'Green']
weapons = ['Rope' 'Lead_Pipe'] weapons = ['Rope' 'Lead_Pipe']
cards = [rooms suspects weapons] cards = [rooms suspects weapons]
take_turn = function <current_room opponent_card> { take_turn = function current_room opponent_card
(remove_card opponent_card) remove_card opponent_card
(make_guess current_room) make_guess current_room
}
remove_card = function <opponent_card> { remove_card = function opponent_card
for card_list in cards { for card_list in cards
# removed = remove card from card_list { removed = remove card from card_list
card == opponent_card card == opponent_card
}
}
if (type removed) == 'empty' { if type removed == 'empty'
(output 'Card not found.') output 'Card not found.'
}
}
make_guess = function <current_room> { make_guess = function current_room
if (length suspects) == 1 if length suspects == 1 && length rooms == 1 && length weapons == 1
&& (length rooms) == 1
&& (length weapons) == 1
{
(output 'It was ' (output 'It was '
+ suspects:0 + suspects:0
+ ' in the ' + ' in the '
@ -32,7 +24,7 @@ make_guess = function <current_room> {
+ ' with the ' + ' with the '
+ weapons:0 + weapons:0
+ '!') + '!')
} else { else
(output 'I accuse ' (output 'I accuse '
+ (random suspects) + (random suspects)
+ ' in the ' + ' in the '
@ -40,7 +32,5 @@ make_guess = function <current_room> {
+ ' with the ' + ' with the '
+ (random weapons) + (random weapons)
+ '!') + '!')
}
}
(make_guess 'Library') (make_guess 'Library')

View File

@ -286,6 +286,7 @@ impl AbstractTree for BuiltInFunction {
} }
BuiltInFunction::AssertEqual(expressions) => { BuiltInFunction::AssertEqual(expressions) => {
let mut prev_value = None; let mut prev_value = None;
for expression in expressions { for expression in expressions {
let value = expression.run(source, context)?; let value = expression.run(source, context)?;

View File

@ -24,7 +24,7 @@ impl AbstractTree for FunctionCall {
for index in 1..node.child_count() { for index in 1..node.child_count() {
let child = node.child(index).unwrap(); let child = node.child(index).unwrap();
if child.kind() == "expression" { if child.is_named() {
let expression = Expression::from_syntax_node(source, child)?; let expression = Expression::from_syntax_node(source, child)?;
arguments.push(expression); arguments.push(expression);
@ -59,13 +59,16 @@ impl AbstractTree for FunctionCall {
return Err(Error::FunctionIdentifierNotFound(name.clone())); return Err(Error::FunctionIdentifierNotFound(name.clone()));
}; };
let mut function_context = Map::clone_from(context); let mut function_context = Map::clone_from(context);
let identifier_expression_pairs = definition.identifiers().iter().zip(arguments.iter());
for (identifier, expression) in identifier_expression_pairs { if let Some(parameters) = definition.identifiers() {
let key = identifier.inner().clone(); let parameter_expression_pairs = parameters.iter().zip(arguments.iter());
let value = expression.run(source, context)?;
function_context.variables_mut().insert(key, value); for (identifier, expression) in parameter_expression_pairs {
let key = identifier.clone().take_inner();
let value = expression.run(source, context)?;
function_context.variables_mut().insert(key, value);
}
} }
definition.body().run(source, &mut function_context) definition.body().run(source, &mut function_context)

View File

@ -55,22 +55,23 @@ impl AbstractTree for ValueNode {
ValueType::List(expressions) ValueType::List(expressions)
} }
"table" => { "table" => {
let child_count = child.child_count(); let identifier_list_node = child.child(1).unwrap();
let mut column_names = Vec::new(); let identifier_count = identifier_list_node.child_count();
let mut column_names = Vec::with_capacity(identifier_count);
let expression_node = child.child(child_count - 1).unwrap(); for index in 0..identifier_count {
let expression = Expression::from_syntax_node(source, expression_node)?; let identifier_node = identifier_list_node.child(index).unwrap();
for index in 2..child.child_count() - 2 { if identifier_node.is_named() {
let node = child.child(index).unwrap(); let identifier = Identifier::from_syntax_node(source, identifier_node)?;
if node.is_named() {
let identifier = Identifier::from_syntax_node(source, node)?;
column_names.push(identifier) column_names.push(identifier)
} }
} }
let expression_node = child.child(2).unwrap();
let expression = Expression::from_syntax_node(source, expression_node)?;
ValueType::Table { ValueType::Table {
column_names, column_names,
rows: Box::new(expression), rows: Box::new(expression),
@ -99,24 +100,28 @@ impl AbstractTree for ValueNode {
ValueType::Map(child_nodes) ValueType::Map(child_nodes)
} }
"function" => { "function" => {
let mut identifiers = Vec::new(); let parameters_node = child.child_by_field_name("parameters");
let parameters = if let Some(node) = parameters_node {
let mut parameter_list = Vec::new();
let block_node = child.child(child.child_count() - 1).unwrap(); for index in 0..node.child_count() {
let block = Block::from_syntax_node(source, block_node)?; let child_node = node.child(index).unwrap();
for index in 1..child.child_count() - 1 { if child_node.is_named() {
let child_node = child.child(index).unwrap(); let parameter = Identifier::from_syntax_node(source, child_node)?;
if child_node.kind() == "identifier" { parameter_list.push(parameter);
let identifier = Identifier::from_syntax_node(source, child_node)?; }
identifiers.push(identifier);
} }
}
let function = Function::new(identifiers, block); Some(parameter_list)
} else {
None
};
let body_node = child.child_by_field_name("body").unwrap();
let body = Block::from_syntax_node(source, body_node)?;
ValueType::Function(function) ValueType::Function(Function::new(parameters, body))
} }
_ => { _ => {
return Err(Error::UnexpectedSyntaxNode { return Err(Error::UnexpectedSyntaxNode {

View File

@ -174,7 +174,7 @@ mod tests {
assert_eq!( assert_eq!(
evaluate( evaluate(
" "
table <messages, numbers> [ table |messages numbers| [
['hiya', 42] ['hiya', 42]
['foo', 57] ['foo', 57]
['bar', 99.99] ['bar', 99.99]
@ -247,7 +247,7 @@ mod tests {
assert_eq!( assert_eq!(
evaluate( evaluate(
" "
foobar = function <message> { message } foobar = |message| => message
(foobar 'Hiya') (foobar 'Hiya')
", ",
), ),

View File

@ -6,19 +6,19 @@ use crate::{Block, Identifier};
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] #[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
pub struct Function { pub struct Function {
parameters: Vec<Identifier>, parameters: Option<Vec<Identifier>>,
body: Box<Block>, body: Box<Block>,
} }
impl Function { impl Function {
pub fn new(parameters: Vec<Identifier>, body: Block) -> Self { pub fn new(parameters: Option<Vec<Identifier>>, body: Block) -> Self {
Function { Function {
parameters, parameters,
body: Box::new(body), body: Box::new(body),
} }
} }
pub fn identifiers(&self) -> &Vec<Identifier> { pub fn identifiers(&self) -> &Option<Vec<Identifier>> {
&self.parameters &self.parameters
} }

View File

@ -2,7 +2,7 @@
Simple Function Simple Function
================================================================================ ================================================================================
function { "Hiya" } => "Hiya"
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -18,6 +18,30 @@ function { "Hiya" }
(value (value
(string))))))))))) (string)))))))))))
================================================================================
Function Assignment
================================================================================
x = => "Hiya"
--------------------------------------------------------------------------------
(root
(block
(statement
(assignment
(identifier)
(assignment_operator)
(statement
(expression
(value
(function
(block
(statement
(expression
(value
(string)))))))))))))
================================================================================ ================================================================================
Function Call Function Call
================================================================================ ================================================================================
@ -40,7 +64,7 @@ Function Call
Complex Function Complex Function
================================================================================ ================================================================================
function <message number> { |message number| => {
(output message) (output message)
(output number) (output number)
} }
@ -53,8 +77,9 @@ function <message number> {
(expression (expression
(value (value
(function (function
(identifier) (identifier_list
(identifier) (identifier)
(identifier))
(block (block
(statement (statement
(expression (expression

View File

@ -24,7 +24,7 @@ if true { "True" }
Complex If Complex If
================== ==================
if 1 == 1 && 2 == 2 && 3 == 3 { "True" } if 1 == 1 && 2 == 2 && 3 == 3 "True"
--- ---
@ -76,13 +76,11 @@ if 1 == 1 && 2 == 2 && 3 == 3 { "True" }
Nested If Nested If
================== ==================
if true { if true
if 42 == 12 { if 42 == 12
'hiya' 'hiya'
} else { else
'bye' 'bye'
}
}
--- ---

View File

@ -3,7 +3,7 @@ Simple Statements
================== ==================
1 1
"one" "one";
x x
--- ---
@ -26,7 +26,7 @@ x
Simple Assignment Simple Assignment
================== ==================
x = 1 x = 1;
y = "one" y = "one"
--- ---

View File

@ -2,22 +2,23 @@
Table Declaration Table Declaration
================== ==================
table <messages, numbers> [ table |messages numbers| [
['hiya', 42] ['hiya' 42]
['foo', 57] ['foo' 57]
['bar', 99.99] ['bar' 99.99]
] ]
--- ---
(root (root
(block (block
(statement (statement
(expression (expression
(value (value
(table (table
(identifier) (identifier_list
(identifier) (identifier)
(identifier))
(expression (expression
(value (value
(list (list
@ -53,7 +54,7 @@ table <messages, numbers> [
Table Access Table Access
================== ==================
select <number> from foobar { select |number| from foobar {
text == 'answer' text == 'answer'
} }
@ -63,7 +64,8 @@ select <number> from foobar {
(block (block
(statement (statement
(select (select
(identifier) (identifier_list
(identifier))
(expression (expression
(identifier)) (identifier))
(block (block

View File

@ -6,6 +6,7 @@ module.exports = grammar({
extras: $ => [ /\s/, $.comment ], extras: $ => [ /\s/, $.comment ],
conflicts: $ => [ conflicts: $ => [
[$.block],
[$.map, $.assignment_operator], [$.map, $.assignment_operator],
], ],
@ -14,29 +15,32 @@ module.exports = grammar({
comment: $ => /[#][^#\n]*[#|\n]/, comment: $ => /[#][^#\n]*[#|\n]/,
block: $ => prec.right(choice( block: $ => choice(
repeat1($.statement), repeat1($.statement),
seq('{', repeat1($.statement), '}'), seq('{', repeat1($.statement), '}'),
),
statement: $ => prec.right(seq(
choice(
$.assignment,
$.async,
$.expression,
$.filter,
$.find,
$.for,
$.if_else,
$.insert,
$.match,
$.reduce,
$.remove,
$.select,
$.transform,
$.while,
),
optional(';'),
)), )),
statement: $ => prec.right(choice( expression: $ => prec.right(choice(
$.assignment,
$.async,
$.expression,
$.filter,
$.find,
$.for,
$.if_else,
$.insert,
$.match,
$.reduce,
$.remove,
$.select,
$.transform,
$.while,
)),
expression: $ => prec.left(choice(
$._expression_kind, $._expression_kind,
seq('(', $._expression_kind, ')'), seq('(', $._expression_kind, ')'),
)), )),
@ -50,6 +54,8 @@ module.exports = grammar({
$.value, $.value,
)), )),
_expression_list: $ => repeat1(prec.right(seq($.expression, optional(',')))),
identifier: $ => /[_a-zA-Z]+[_a-zA-Z0-9]?/, identifier: $ => /[_a-zA-Z]+[_a-zA-Z0-9]?/,
value: $ => choice( value: $ => choice(
@ -111,12 +117,6 @@ module.exports = grammar({
)), )),
)), )),
table: $ => prec.left(seq(
'table',
seq('<', repeat1(seq($.identifier, optional(','))), '>'),
$.expression,
)),
math: $ => prec.left(seq( math: $ => prec.left(seq(
$.expression, $.expression,
$.math_operator, $.math_operator,
@ -160,28 +160,28 @@ module.exports = grammar({
"-=", "-=",
), ),
if_else: $ => prec.left(seq( if_else: $ => prec.right(seq(
$.if, $.if,
repeat($.else_if), repeat($.else_if),
optional($.else), optional($.else),
)), )),
if: $ => prec.left(seq( if: $ => seq(
'if', 'if',
$.expression, $.expression,
$.block, $.block,
)), ),
else_if: $ => prec.left(seq( else_if: $ => seq(
'else if', 'else if',
$.expression, $.expression,
$.block, $.block,
)), ),
else: $ => prec.left(seq( else: $ => seq(
'else', 'else',
$.block, $.block,
)), ),
match: $ => prec.right(seq( match: $ => prec.right(seq(
'match', 'match',
@ -252,9 +252,7 @@ module.exports = grammar({
select: $ => prec.right(seq( select: $ => prec.right(seq(
'select', 'select',
'<', $.identifier_list,
repeat(seq($.identifier, optional(','))),
'>',
'from', 'from',
$.expression, $.expression,
optional($.block), optional($.block),
@ -272,10 +270,24 @@ module.exports = grammar({
$.block, $.block,
), ),
identifier_list: $ => prec.right(choice(
seq(
'|',
repeat(seq($.identifier, optional(','))),
'|',
),
)),
table: $ => prec.right(seq(
'table',
$.identifier_list,
$.expression,
)),
function: $ => seq( function: $ => seq(
'function', field('parameters', optional($.identifier_list)),
optional(seq('<', repeat(seq($.identifier, optional(','))), '>')), '=>',
$.block, field('body', $.block),
), ),
function_call: $ => choice( function_call: $ => choice(
@ -285,12 +297,12 @@ module.exports = grammar({
_context_defined_function: $ => prec.right(seq( _context_defined_function: $ => prec.right(seq(
$.identifier, $.identifier,
repeat(prec.right(seq($.expression, optional(',')))), optional($._expression_list),
)), )),
built_in_function: $ => prec.right(seq( built_in_function: $ => prec.right(seq(
$._built_in_function_name, $._built_in_function_name,
repeat(prec.right(seq($.expression, optional(',')))), optional($._expression_list),
)), )),
_built_in_function_name: $ => choice( _built_in_function_name: $ => choice(

View File

@ -14,108 +14,121 @@
"value": "[#][^#\\n]*[#|\\n]" "value": "[#][^#\\n]*[#|\\n]"
}, },
"block": { "block": {
"type": "CHOICE",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "statement"
}
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "statement"
}
},
{
"type": "STRING",
"value": "}"
}
]
}
]
},
"statement": {
"type": "PREC_RIGHT", "type": "PREC_RIGHT",
"value": 0, "value": 0,
"content": { "content": {
"type": "CHOICE", "type": "SEQ",
"members": [ "members": [
{ {
"type": "REPEAT1", "type": "CHOICE",
"content": { "members": [
"type": "SYMBOL", {
"name": "statement" "type": "SYMBOL",
} "name": "assignment"
},
{
"type": "SYMBOL",
"name": "async"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "filter"
},
{
"type": "SYMBOL",
"name": "find"
},
{
"type": "SYMBOL",
"name": "for"
},
{
"type": "SYMBOL",
"name": "if_else"
},
{
"type": "SYMBOL",
"name": "insert"
},
{
"type": "SYMBOL",
"name": "match"
},
{
"type": "SYMBOL",
"name": "reduce"
},
{
"type": "SYMBOL",
"name": "remove"
},
{
"type": "SYMBOL",
"name": "select"
},
{
"type": "SYMBOL",
"name": "transform"
},
{
"type": "SYMBOL",
"name": "while"
}
]
}, },
{ {
"type": "SEQ", "type": "CHOICE",
"members": [ "members": [
{ {
"type": "STRING", "type": "STRING",
"value": "{" "value": ";"
}, },
{ {
"type": "REPEAT1", "type": "BLANK"
"content": {
"type": "SYMBOL",
"name": "statement"
}
},
{
"type": "STRING",
"value": "}"
} }
] ]
} }
] ]
} }
}, },
"statement": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "assignment"
},
{
"type": "SYMBOL",
"name": "async"
},
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "SYMBOL",
"name": "filter"
},
{
"type": "SYMBOL",
"name": "find"
},
{
"type": "SYMBOL",
"name": "for"
},
{
"type": "SYMBOL",
"name": "if_else"
},
{
"type": "SYMBOL",
"name": "insert"
},
{
"type": "SYMBOL",
"name": "match"
},
{
"type": "SYMBOL",
"name": "reduce"
},
{
"type": "SYMBOL",
"name": "remove"
},
{
"type": "SYMBOL",
"name": "select"
},
{
"type": "SYMBOL",
"name": "transform"
},
{
"type": "SYMBOL",
"name": "while"
}
]
}
},
"expression": { "expression": {
"type": "PREC_LEFT", "type": "PREC_RIGHT",
"value": 0, "value": 0,
"content": { "content": {
"type": "CHOICE", "type": "CHOICE",
@ -177,6 +190,34 @@
] ]
} }
}, },
"_expression_list": {
"type": "REPEAT1",
"content": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
}
}
},
"identifier": { "identifier": {
"type": "PATTERN", "type": "PATTERN",
"value": "[_a-zA-Z]+[_a-zA-Z0-9]?" "value": "[_a-zA-Z]+[_a-zA-Z0-9]?"
@ -559,60 +600,6 @@
] ]
} }
}, },
"table": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "table"
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "REPEAT1",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
}
},
{
"type": "STRING",
"value": ">"
}
]
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"math": { "math": {
"type": "PREC_LEFT", "type": "PREC_LEFT",
"value": 0, "value": 0,
@ -752,7 +739,7 @@
] ]
}, },
"if_else": { "if_else": {
"type": "PREC_LEFT", "type": "PREC_RIGHT",
"value": 0, "value": 0,
"content": { "content": {
"type": "SEQ", "type": "SEQ",
@ -784,63 +771,51 @@
} }
}, },
"if": { "if": {
"type": "PREC_LEFT", "type": "SEQ",
"value": 0, "members": [
"content": { {
"type": "SEQ", "type": "STRING",
"members": [ "value": "if"
{ },
"type": "STRING", {
"value": "if" "type": "SYMBOL",
}, "name": "expression"
{ },
"type": "SYMBOL", {
"name": "expression" "type": "SYMBOL",
}, "name": "block"
{ }
"type": "SYMBOL", ]
"name": "block"
}
]
}
}, },
"else_if": { "else_if": {
"type": "PREC_LEFT", "type": "SEQ",
"value": 0, "members": [
"content": { {
"type": "SEQ", "type": "STRING",
"members": [ "value": "else if"
{ },
"type": "STRING", {
"value": "else if" "type": "SYMBOL",
}, "name": "expression"
{ },
"type": "SYMBOL", {
"name": "expression" "type": "SYMBOL",
}, "name": "block"
{ }
"type": "SYMBOL", ]
"name": "block"
}
]
}
}, },
"else": { "else": {
"type": "PREC_LEFT", "type": "SEQ",
"value": 0, "members": [
"content": { {
"type": "SEQ", "type": "STRING",
"members": [ "value": "else"
{ },
"type": "STRING", {
"value": "else" "type": "SYMBOL",
}, "name": "block"
{ }
"type": "SYMBOL", ]
"name": "block"
}
]
}
}, },
"match": { "match": {
"type": "PREC_RIGHT", "type": "PREC_RIGHT",
@ -1093,36 +1068,8 @@
"value": "select" "value": "select"
}, },
{ {
"type": "STRING", "type": "SYMBOL",
"value": "<" "name": "identifier_list"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
}
},
{
"type": "STRING",
"value": ">"
}, },
{ {
"type": "STRING", "type": "STRING",
@ -1185,61 +1132,103 @@
} }
] ]
}, },
"identifier_list": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "|"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
}
},
{
"type": "STRING",
"value": "|"
}
]
}
]
}
},
"table": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "table"
},
{
"type": "SYMBOL",
"name": "identifier_list"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
},
"function": { "function": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
{
"type": "FIELD",
"name": "parameters",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "identifier_list"
},
{
"type": "BLANK"
}
]
}
},
{ {
"type": "STRING", "type": "STRING",
"value": "function" "value": "=>"
}, },
{ {
"type": "CHOICE", "type": "FIELD",
"members": [ "name": "body",
{ "content": {
"type": "SEQ", "type": "SYMBOL",
"members": [ "name": "block"
{ }
"type": "STRING",
"value": "<"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
}
},
{
"type": "STRING",
"value": ">"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "block"
} }
] ]
}, },
@ -1267,32 +1256,16 @@
"name": "identifier" "name": "identifier"
}, },
{ {
"type": "REPEAT", "type": "CHOICE",
"content": { "members": [
"type": "PREC_RIGHT", {
"value": 0, "type": "SYMBOL",
"content": { "name": "_expression_list"
"type": "SEQ", },
"members": [ {
{ "type": "BLANK"
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
} }
} ]
} }
] ]
} }
@ -1308,32 +1281,16 @@
"name": "_built_in_function_name" "name": "_built_in_function_name"
}, },
{ {
"type": "REPEAT", "type": "CHOICE",
"content": { "members": [
"type": "PREC_RIGHT", {
"value": 0, "type": "SYMBOL",
"content": { "name": "_expression_list"
"type": "SEQ", },
"members": [ {
{ "type": "BLANK"
"type": "SYMBOL",
"name": "expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
} }
} ]
} }
] ]
} }
@ -1475,6 +1432,9 @@
} }
], ],
"conflicts": [ "conflicts": [
[
"block"
],
[ [
"map", "map",
"assignment_operator" "assignment_operator"

View File

@ -241,20 +241,27 @@
{ {
"type": "function", "type": "function",
"named": true, "named": true,
"fields": {}, "fields": {
"children": { "body": {
"multiple": true, "multiple": false,
"required": true, "required": true,
"types": [ "types": [
{ {
"type": "block", "type": "block",
"named": true "named": true
}, }
{ ]
"type": "identifier", },
"named": true "parameters": {
} "multiple": false,
] "required": false,
"types": [
{
"type": "identifier_list",
"named": true
}
]
}
} }
}, },
{ {
@ -280,6 +287,21 @@
] ]
} }
}, },
{
"type": "identifier_list",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "identifier",
"named": true
}
]
}
},
{ {
"type": "if", "type": "if",
"named": true, "named": true,
@ -535,7 +557,7 @@
"named": true "named": true
}, },
{ {
"type": "identifier", "type": "identifier_list",
"named": true "named": true
} }
] ]
@ -621,7 +643,7 @@
"named": true "named": true
}, },
{ {
"type": "identifier", "type": "identifier_list",
"named": true "named": true
} }
] ]
@ -768,6 +790,10 @@
"type": ":", "type": ":",
"named": false "named": false
}, },
{
"type": ";",
"named": false
},
{ {
"type": "<", "type": "<",
"named": false "named": false
@ -876,10 +902,6 @@
"type": "from_json", "type": "from_json",
"named": false "named": false
}, },
{
"type": "function",
"named": false
},
{ {
"type": "help", "type": "help",
"named": false "named": false
@ -1036,6 +1058,10 @@
"type": "{", "type": "{",
"named": false "named": false
}, },
{
"type": "|",
"named": false
},
{ {
"type": "||", "type": "||",
"named": false "named": false

File diff suppressed because it is too large Load Diff