Implement list, map and string indexing
This commit is contained in:
parent
4eabd61ea8
commit
9f571a0bfb
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -316,7 +316,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dust-lang"
|
name = "dust-lang"
|
||||||
version = "0.3.2"
|
version = "0.3.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term",
|
"ansi_term",
|
||||||
"cc",
|
"cc",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
numbers = [1, 2, 3]
|
numbers = [1, 2, 3]
|
||||||
|
|
||||||
x = numbers.0
|
x = numbers.{0}
|
||||||
y = numbers.1
|
y = numbers.{1}
|
||||||
z = numbers.2
|
z = numbers.{2}
|
||||||
|
|
||||||
(assert_equal x + y, z)
|
(assert_equal x + y, z)
|
||||||
|
11
examples/map.ds
Normal file
11
examples/map.ds
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
dictionary = {
|
||||||
|
dust = "awesome"
|
||||||
|
answer = 42
|
||||||
|
}
|
||||||
|
|
||||||
|
(output
|
||||||
|
'Dust is '
|
||||||
|
+ dictionary.dust
|
||||||
|
+ '! The answer is '
|
||||||
|
+ dictionary.answer
|
||||||
|
)
|
@ -15,10 +15,10 @@ impl AbstractTree for Index {
|
|||||||
let collection_node = node.child(0).unwrap();
|
let collection_node = node.child(0).unwrap();
|
||||||
let collection = Expression::from_syntax_node(source, collection_node)?;
|
let collection = Expression::from_syntax_node(source, collection_node)?;
|
||||||
|
|
||||||
let index_node = node.child(3).unwrap();
|
let index_node = node.child(2).unwrap();
|
||||||
let index = Expression::from_syntax_node(source, index_node)?;
|
let index = Expression::from_syntax_node(source, index_node)?;
|
||||||
|
|
||||||
let index_end_node = node.child(5);
|
let index_end_node = node.child(4);
|
||||||
let index_end = if let Some(index_end_node) = index_end_node {
|
let index_end = if let Some(index_end_node) = index_end_node {
|
||||||
Some(Expression::from_syntax_node(source, index_end_node)?)
|
Some(Expression::from_syntax_node(source, index_end_node)?)
|
||||||
} else {
|
} else {
|
||||||
@ -52,10 +52,8 @@ impl AbstractTree for Index {
|
|||||||
}
|
}
|
||||||
Value::Map(mut map) => {
|
Value::Map(mut map) => {
|
||||||
let value = self.index.run(source, &mut map)?;
|
let value = self.index.run(source, &mut map)?;
|
||||||
let index = value.as_string()?;
|
|
||||||
let item = map.variables().get(index).cloned().unwrap_or_default();
|
|
||||||
|
|
||||||
Ok(item)
|
Ok(value)
|
||||||
}
|
}
|
||||||
Value::String(string) => {
|
Value::String(string) => {
|
||||||
let index = self.index.run(source, context)?.as_integer()? as usize;
|
let index = self.index.run(source, context)?.as_integer()? as usize;
|
||||||
|
@ -86,39 +86,3 @@ for list in list_of_lists {
|
|||||||
(expression
|
(expression
|
||||||
(value
|
(value
|
||||||
(string))))))))))))))
|
(string))))))))))))))
|
||||||
|
|
||||||
==================
|
|
||||||
Async For Loop
|
|
||||||
==================
|
|
||||||
|
|
||||||
asnyc for list in list_of_lists {
|
|
||||||
async for item in list {
|
|
||||||
(output item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
(root
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(expression
|
|
||||||
(identifier))))
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(for
|
|
||||||
(identifier)
|
|
||||||
(expression
|
|
||||||
(identifier))
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(for
|
|
||||||
(identifier)
|
|
||||||
(expression
|
|
||||||
(identifier))
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(expression
|
|
||||||
(tool
|
|
||||||
(expression
|
|
||||||
(identifier)))))))))))))
|
|
||||||
|
@ -21,52 +21,3 @@ __xyz__
|
|||||||
(statement
|
(statement
|
||||||
(expression
|
(expression
|
||||||
(identifier)))))
|
(identifier)))))
|
||||||
|
|
||||||
==================
|
|
||||||
Dot Notation
|
|
||||||
==================
|
|
||||||
|
|
||||||
dust_data.{1}.{name}
|
|
||||||
|
|
||||||
creature.{total_clams}
|
|
||||||
|
|
||||||
foobar.{1}.{42}
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
(root
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(expression
|
|
||||||
(index
|
|
||||||
(expression
|
|
||||||
(index
|
|
||||||
(expression
|
|
||||||
(identifier))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer)))))
|
|
||||||
(expression
|
|
||||||
(identifier))))))
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(expression
|
|
||||||
(index
|
|
||||||
(expression
|
|
||||||
(identifier))
|
|
||||||
(expression
|
|
||||||
(identifier))))))
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(expression
|
|
||||||
(index
|
|
||||||
(expression
|
|
||||||
(index
|
|
||||||
(expression
|
|
||||||
(identifier))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer)))))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer))))))))
|
|
||||||
|
80
tree-sitter-dust/corpus/index.txt
Normal file
80
tree-sitter-dust/corpus/index.txt
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
==================
|
||||||
|
Indexing
|
||||||
|
==================
|
||||||
|
|
||||||
|
dust_data:1:name
|
||||||
|
|
||||||
|
creature:total_clams
|
||||||
|
|
||||||
|
foobar:1:42
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(root
|
||||||
|
(item
|
||||||
|
(statement
|
||||||
|
(expression
|
||||||
|
(index
|
||||||
|
(expression
|
||||||
|
(index
|
||||||
|
(expression
|
||||||
|
(identifier))
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(integer)))))
|
||||||
|
(expression
|
||||||
|
(identifier))))))
|
||||||
|
(item
|
||||||
|
(statement
|
||||||
|
(expression
|
||||||
|
(index
|
||||||
|
(expression
|
||||||
|
(identifier))
|
||||||
|
(expression
|
||||||
|
(identifier))))))
|
||||||
|
(item
|
||||||
|
(statement
|
||||||
|
(expression
|
||||||
|
(index
|
||||||
|
(expression
|
||||||
|
(index
|
||||||
|
(expression
|
||||||
|
(identifier))
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(integer)))))
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(integer))))))))
|
||||||
|
|
||||||
|
==================
|
||||||
|
Sublist
|
||||||
|
==================
|
||||||
|
|
||||||
|
['answers', 42, 666]:1..2
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(root
|
||||||
|
(item
|
||||||
|
(statement
|
||||||
|
(expression
|
||||||
|
(index
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(list
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(string)))
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(integer)))
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(integer))))))
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(integer)))
|
||||||
|
(expression
|
||||||
|
(value
|
||||||
|
(integer))))))))
|
@ -80,64 +80,3 @@ List Nesting
|
|||||||
(expression
|
(expression
|
||||||
(value
|
(value
|
||||||
(integer)))))))))))))))
|
(integer)))))))))))))))
|
||||||
|
|
||||||
==================
|
|
||||||
List Index
|
|
||||||
==================
|
|
||||||
|
|
||||||
['answers', 42, 666].{1}
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
(root
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(expression
|
|
||||||
(index
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(list
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(string)))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer)))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer))))))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer))))))))
|
|
||||||
|
|
||||||
==================
|
|
||||||
Sublist
|
|
||||||
==================
|
|
||||||
|
|
||||||
['answers', 42, 666].{1..2}
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
(root
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(expression
|
|
||||||
(index
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(list
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(string)))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer)))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer))))))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer)))
|
|
||||||
(expression
|
|
||||||
(value
|
|
||||||
(integer))))))))
|
|
||||||
|
@ -43,21 +43,3 @@ x = {
|
|||||||
(expression
|
(expression
|
||||||
(value
|
(value
|
||||||
(integer)))))))))))
|
(integer)))))))))))
|
||||||
|
|
||||||
==================
|
|
||||||
Map Access
|
|
||||||
==================
|
|
||||||
|
|
||||||
x.{answer}
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
(root
|
|
||||||
(item
|
|
||||||
(statement
|
|
||||||
(expression
|
|
||||||
(index
|
|
||||||
(expression
|
|
||||||
(identifier))
|
|
||||||
(expression
|
|
||||||
(identifier)))))))
|
|
@ -91,14 +91,12 @@ module.exports = grammar({
|
|||||||
|
|
||||||
index: $ => prec.left(seq(
|
index: $ => prec.left(seq(
|
||||||
$.expression,
|
$.expression,
|
||||||
'.',
|
':',
|
||||||
'{',
|
|
||||||
$.expression,
|
$.expression,
|
||||||
optional(seq(
|
optional(seq(
|
||||||
'..',
|
'..',
|
||||||
$.expression,
|
$.expression,
|
||||||
)),
|
)),
|
||||||
'}'
|
|
||||||
)),
|
)),
|
||||||
|
|
||||||
function: $ => seq(
|
function: $ => seq(
|
||||||
@ -109,13 +107,13 @@ module.exports = grammar({
|
|||||||
'}',
|
'}',
|
||||||
),
|
),
|
||||||
|
|
||||||
table: $ => prec.right(seq(
|
table: $ => prec.left(seq(
|
||||||
'table',
|
'table',
|
||||||
seq('<', repeat1(seq($.identifier, optional(','))), '>'),
|
seq('<', repeat1(seq($.identifier, optional(','))), '>'),
|
||||||
$.expression,
|
$.expression,
|
||||||
)),
|
)),
|
||||||
|
|
||||||
math: $ => prec.left(1, seq(
|
math: $ => prec.left(seq(
|
||||||
$.expression,
|
$.expression,
|
||||||
$.math_operator,
|
$.math_operator,
|
||||||
$.expression,
|
$.expression,
|
||||||
@ -129,7 +127,7 @@ module.exports = grammar({
|
|||||||
'%',
|
'%',
|
||||||
),
|
),
|
||||||
|
|
||||||
logic: $ => prec.right(1, seq(
|
logic: $ => prec.right(seq(
|
||||||
$.expression,
|
$.expression,
|
||||||
$.logic_operator,
|
$.logic_operator,
|
||||||
$.expression,
|
$.expression,
|
||||||
@ -161,7 +159,7 @@ module.exports = grammar({
|
|||||||
if_else: $ => prec.left(seq(
|
if_else: $ => prec.left(seq(
|
||||||
$.if,
|
$.if,
|
||||||
repeat(seq($.else_if)),
|
repeat(seq($.else_if)),
|
||||||
optional(seq($.else)),
|
optional($.else),
|
||||||
)),
|
)),
|
||||||
|
|
||||||
if: $ => seq(
|
if: $ => seq(
|
||||||
@ -203,7 +201,7 @@ module.exports = grammar({
|
|||||||
),
|
),
|
||||||
|
|
||||||
for: $ => seq(
|
for: $ => seq(
|
||||||
choice('for', 'async for'),
|
'for',
|
||||||
$.identifier,
|
$.identifier,
|
||||||
'in',
|
'in',
|
||||||
$.expression,
|
$.expression,
|
||||||
|
@ -407,11 +407,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "STRING",
|
"type": "STRING",
|
||||||
"value": "."
|
"value": ":"
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "STRING",
|
|
||||||
"value": "{"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "SYMBOL",
|
"type": "SYMBOL",
|
||||||
@ -437,10 +433,6 @@
|
|||||||
"type": "BLANK"
|
"type": "BLANK"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "STRING",
|
|
||||||
"value": "}"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -512,7 +504,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"type": "PREC_RIGHT",
|
"type": "PREC_LEFT",
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"content": {
|
"content": {
|
||||||
"type": "SEQ",
|
"type": "SEQ",
|
||||||
@ -567,7 +559,7 @@
|
|||||||
},
|
},
|
||||||
"math": {
|
"math": {
|
||||||
"type": "PREC_LEFT",
|
"type": "PREC_LEFT",
|
||||||
"value": 1,
|
"value": 0,
|
||||||
"content": {
|
"content": {
|
||||||
"type": "SEQ",
|
"type": "SEQ",
|
||||||
"members": [
|
"members": [
|
||||||
@ -613,7 +605,7 @@
|
|||||||
},
|
},
|
||||||
"logic": {
|
"logic": {
|
||||||
"type": "PREC_RIGHT",
|
"type": "PREC_RIGHT",
|
||||||
"value": 1,
|
"value": 0,
|
||||||
"content": {
|
"content": {
|
||||||
"type": "SEQ",
|
"type": "SEQ",
|
||||||
"members": [
|
"members": [
|
||||||
@ -733,13 +725,8 @@
|
|||||||
"type": "CHOICE",
|
"type": "CHOICE",
|
||||||
"members": [
|
"members": [
|
||||||
{
|
{
|
||||||
"type": "SEQ",
|
"type": "SYMBOL",
|
||||||
"members": [
|
"name": "else"
|
||||||
{
|
|
||||||
"type": "SYMBOL",
|
|
||||||
"name": "else"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "BLANK"
|
"type": "BLANK"
|
||||||
@ -894,17 +881,8 @@
|
|||||||
"type": "SEQ",
|
"type": "SEQ",
|
||||||
"members": [
|
"members": [
|
||||||
{
|
{
|
||||||
"type": "CHOICE",
|
"type": "STRING",
|
||||||
"members": [
|
"value": "for"
|
||||||
{
|
|
||||||
"type": "STRING",
|
|
||||||
"value": "for"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "STRING",
|
|
||||||
"value": "async for"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "SYMBOL",
|
"type": "SYMBOL",
|
||||||
|
@ -714,6 +714,10 @@
|
|||||||
"type": "/",
|
"type": "/",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": ":",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "<",
|
"type": "<",
|
||||||
"named": false
|
"named": false
|
||||||
@ -762,10 +766,6 @@
|
|||||||
"type": "async",
|
"type": "async",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"type": "async for",
|
|
||||||
"named": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "bash",
|
"type": "bash",
|
||||||
"named": false
|
"named": false
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user