Simplify grammar structure
This commit is contained in:
parent
71c169a1cf
commit
f0fb16607c
@ -1,42 +0,0 @@
|
||||
use rayon::prelude::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use tree_sitter::Node;
|
||||
|
||||
use crate::{AbstractTree, Block, Map, Result, Value};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
|
||||
pub struct Async {
|
||||
block: Block,
|
||||
}
|
||||
|
||||
impl AbstractTree for Async {
|
||||
fn from_syntax_node(source: &str, node: Node) -> Result<Self> {
|
||||
debug_assert_eq!("async", node.kind());
|
||||
|
||||
let block_node = node.child(1).unwrap();
|
||||
let block = Block::from_syntax_node(source, block_node)?;
|
||||
|
||||
Ok(Async { block })
|
||||
}
|
||||
|
||||
fn run(&self, source: &str, context: &mut Map) -> Result<Value> {
|
||||
let statements = self.block.statements();
|
||||
|
||||
statements
|
||||
.into_par_iter()
|
||||
.enumerate()
|
||||
.find_map_first(|(index, statement)| {
|
||||
let mut context = context.clone();
|
||||
let result = statement.run(source, &mut context);
|
||||
|
||||
if result.is_err() {
|
||||
Some(result)
|
||||
} else if index == statements.len() - 1 {
|
||||
Some(result)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.unwrap_or(Ok(Value::Empty))
|
||||
}
|
||||
}
|
@ -1,27 +1,26 @@
|
||||
use rayon::prelude::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use tree_sitter::Node;
|
||||
|
||||
use crate::{AbstractTree, Result, Statement};
|
||||
use crate::{AbstractTree, Result, Statement, Value};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
|
||||
pub struct Block {
|
||||
pub statements: Vec<Statement>,
|
||||
}
|
||||
|
||||
impl Block {
|
||||
pub fn statements(&self) -> &Vec<Statement> {
|
||||
&self.statements
|
||||
}
|
||||
is_async: bool,
|
||||
statements: Vec<Statement>,
|
||||
}
|
||||
|
||||
impl AbstractTree for Block {
|
||||
fn from_syntax_node(source: &str, node: Node) -> Result<Self> {
|
||||
debug_assert_eq!("block", node.kind());
|
||||
|
||||
let first_child = node.child(0).unwrap();
|
||||
let is_async = first_child.kind() == "async";
|
||||
|
||||
let statement_count = node.child_count();
|
||||
let mut statements = Vec::with_capacity(statement_count);
|
||||
|
||||
for index in 0..statement_count {
|
||||
for index in 0..statement_count - 1 {
|
||||
let child_node = node.child(index).unwrap();
|
||||
|
||||
if child_node.kind() == "statement" {
|
||||
@ -30,10 +29,33 @@ impl AbstractTree for Block {
|
||||
}
|
||||
}
|
||||
|
||||
Ok(Block { statements })
|
||||
Ok(Block {
|
||||
is_async,
|
||||
statements,
|
||||
})
|
||||
}
|
||||
|
||||
fn run(&self, source: &str, context: &mut crate::Map) -> crate::Result<crate::Value> {
|
||||
if self.is_async {
|
||||
let statements = &self.statements;
|
||||
|
||||
statements
|
||||
.into_par_iter()
|
||||
.enumerate()
|
||||
.find_map_first(|(index, statement)| {
|
||||
let mut context = context.clone();
|
||||
let result = statement.run(source, &mut context);
|
||||
|
||||
if result.is_err() {
|
||||
Some(result)
|
||||
} else if index == statements.len() - 1 {
|
||||
Some(result)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.unwrap_or(Ok(Value::Empty))
|
||||
} else {
|
||||
for statement in &self.statements[0..self.statements.len() - 1] {
|
||||
statement.run(source, context)?;
|
||||
}
|
||||
@ -44,3 +66,4 @@ impl AbstractTree for Block {
|
||||
Ok(final_value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -50,13 +50,13 @@ impl AbstractTree for Index {
|
||||
|
||||
Ok(item)
|
||||
}
|
||||
Value::Map(map) => {
|
||||
Value::Map(mut map) => {
|
||||
let value = if let Expression::Identifier(identifier) = &self.index {
|
||||
let key = identifier.inner();
|
||||
|
||||
map.variables()?.get(key).cloned().unwrap_or(Value::Empty)
|
||||
} else {
|
||||
let value = self.index.run(source, context)?;
|
||||
let value = self.index.run(source, &mut map)?;
|
||||
let key = value.as_string()?;
|
||||
|
||||
map.variables()?.get(key).cloned().unwrap_or(Value::Empty)
|
||||
@ -96,7 +96,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn evaluate_complex_index() {
|
||||
let test = evaluate("{x = [1 2 3]; y = || => {0}; x:((y));}").unwrap();
|
||||
let test = evaluate("x = [1 2 3]; y = || => {0}; x:((y));").unwrap();
|
||||
|
||||
assert_eq!(Value::Integer(1), test);
|
||||
}
|
||||
|
@ -7,7 +7,6 @@
|
||||
//! examples.
|
||||
|
||||
pub mod assignment;
|
||||
pub mod r#async;
|
||||
pub mod block;
|
||||
pub mod built_in_function;
|
||||
pub mod expression;
|
||||
@ -31,9 +30,8 @@ pub mod r#while;
|
||||
|
||||
pub use {
|
||||
assignment::*, block::*, built_in_function::*, expression::*, filter::*, find::*,
|
||||
function_call::*, identifier::*, if_else::*, index::*, insert::*, logic::*, math::*,
|
||||
r#async::*, r#for::*, r#match::*, r#while::*, remove::*, select::*, statement::*, transform::*,
|
||||
value_node::*,
|
||||
function_call::*, identifier::*, if_else::*, index::*, insert::*, logic::*, math::*, r#for::*,
|
||||
r#match::*, r#while::*, remove::*, select::*, statement::*, transform::*, value_node::*,
|
||||
};
|
||||
|
||||
use tree_sitter::Node;
|
||||
|
@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize};
|
||||
use tree_sitter::Node;
|
||||
|
||||
use crate::{
|
||||
AbstractTree, Assignment, Async, Error, Expression, Filter, Find, For, IfElse, Insert, Map,
|
||||
AbstractTree, Assignment, Block, Error, Expression, Filter, Find, For, IfElse, Insert, Map,
|
||||
Match, Remove, Result, Select, Transform, Value, While,
|
||||
};
|
||||
|
||||
@ -17,7 +17,7 @@ pub enum Statement {
|
||||
IfElse(Box<IfElse>),
|
||||
Match(Match),
|
||||
While(Box<While>),
|
||||
Async(Box<Async>),
|
||||
Block(Box<Block>),
|
||||
For(Box<For>),
|
||||
Transform(Box<Transform>),
|
||||
Filter(Box<Filter>),
|
||||
@ -49,7 +49,7 @@ impl AbstractTree for Statement {
|
||||
"while" => Ok(Statement::While(Box::new(While::from_syntax_node(
|
||||
source, child,
|
||||
)?))),
|
||||
"async" => Ok(Statement::Async(Box::new(Async::from_syntax_node(
|
||||
"block" => Ok(Statement::Block(Box::new(Block::from_syntax_node(
|
||||
source, child,
|
||||
)?))),
|
||||
"for" => Ok(Statement::For(Box::new(For::from_syntax_node(
|
||||
@ -89,7 +89,7 @@ impl AbstractTree for Statement {
|
||||
Statement::IfElse(if_else) => if_else.run(source, context),
|
||||
Statement::Match(r#match) => r#match.run(source, context),
|
||||
Statement::While(r#while) => r#while.run(source, context),
|
||||
Statement::Async(run) => run.run(source, context),
|
||||
Statement::Block(block) => block.run(source, context),
|
||||
Statement::For(r#for) => r#for.run(source, context),
|
||||
Statement::Transform(transform) => transform.run(source, context),
|
||||
Statement::Filter(filter) => filter.run(source, context),
|
||||
|
@ -6,7 +6,7 @@ use std::fmt::{self, Debug, Formatter};
|
||||
|
||||
use tree_sitter::{Parser, Tree as TSTree};
|
||||
|
||||
use crate::{language, AbstractTree, Block, Map, Result, Value};
|
||||
use crate::{language, AbstractTree, Map, Result, Statement, Value};
|
||||
|
||||
/// Evaluate the given source code.
|
||||
///
|
||||
@ -89,9 +89,9 @@ impl<'context, 'code> Evaluator<'context, 'code> {
|
||||
let root_node = cursor.node();
|
||||
let mut prev_result = Ok(Value::Empty);
|
||||
|
||||
for block_node in root_node.children(&mut cursor) {
|
||||
let block = Block::from_syntax_node(self.source, block_node)?;
|
||||
prev_result = block.run(self.source, self.context);
|
||||
for statement_node in root_node.children(&mut cursor) {
|
||||
let statement = Statement::from_syntax_node(self.source, statement_node)?;
|
||||
prev_result = statement.run(self.source, self.context);
|
||||
}
|
||||
|
||||
prev_result
|
||||
@ -227,7 +227,7 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn evaluate_if_else_else_if_else_if_else_if_else() {
|
||||
fn evaluate_if_else_if_else_if_else_if_else() {
|
||||
assert_eq!(
|
||||
evaluate(
|
||||
"
|
||||
@ -253,7 +253,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
evaluate(
|
||||
"
|
||||
foobar = |message| => message
|
||||
foobar = |message| => { message }
|
||||
(foobar 'Hiya')
|
||||
",
|
||||
),
|
||||
|
@ -1,13 +1,12 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Async Statements
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
async { (output 'Whaddup') }
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(async
|
||||
(block
|
||||
@ -17,11 +16,11 @@ async { (output 'Whaddup') }
|
||||
(built_in_function
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))))
|
||||
(string)))))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Complex Async Statements
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
async {
|
||||
if 1 % 2 == 0 {
|
||||
@ -33,10 +32,9 @@ async {
|
||||
'foobar'
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(async
|
||||
(block
|
||||
@ -72,4 +70,4 @@ async {
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string)))))))))
|
||||
(string))))))))
|
||||
|
@ -1,32 +1,30 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Function Call
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
(output 'hi')
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(function_call
|
||||
(built_in_function
|
||||
(expression
|
||||
(value
|
||||
(string)))))))))
|
||||
(string))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Nested Function Call
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
(assert_equal (random_integer) 4)
|
||||
assert_equal random_integer 4
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(function_call
|
||||
@ -46,4 +44,4 @@ assert_equal random_integer 4
|
||||
(built_in_function
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))))
|
||||
(integer)))))))))))
|
||||
|
@ -8,10 +8,9 @@ not_a_comment
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(identifier)))))
|
||||
(identifier))))
|
||||
|
||||
================================================================================
|
||||
Partial Line Comments
|
||||
@ -22,10 +21,9 @@ not_a_comment # comment
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(identifier)))))
|
||||
(identifier))))
|
||||
|
||||
================================================================================
|
||||
Multiline Comments
|
||||
@ -38,11 +36,10 @@ not_a_comment #
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(identifier)))
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))
|
||||
(string)))))
|
||||
|
@ -1,15 +1,14 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Filter Loop
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
filter i in [1, 2, 3] {
|
||||
i <= 1
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(filter
|
||||
(identifier)
|
||||
@ -34,11 +33,11 @@ filter i in [1, 2, 3] {
|
||||
(logic_operator)
|
||||
(expression
|
||||
(value
|
||||
(integer)))))))))))
|
||||
(integer))))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Nested Filter Loop
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
filter i in big_list {
|
||||
filter j in i {
|
||||
@ -46,10 +45,9 @@ filter i in big_list {
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(filter
|
||||
(identifier)
|
||||
@ -70,4 +68,4 @@ filter i in big_list {
|
||||
(logic_operator)
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))))))
|
||||
(integer)))))))))))))
|
||||
|
@ -9,7 +9,6 @@ find i in [1, 2, 3] {
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(find
|
||||
(identifier)
|
||||
@ -34,7 +33,7 @@ find i in [1, 2, 3] {
|
||||
(logic_operator)
|
||||
(expression
|
||||
(value
|
||||
(integer)))))))))))
|
||||
(integer))))))))))
|
||||
|
||||
================================================================================
|
||||
Nested Find Loop
|
||||
@ -56,7 +55,6 @@ find i in ["one", "two", "three"] {
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(find
|
||||
(identifier)
|
||||
@ -116,4 +114,4 @@ find i in ["one", "two", "three"] {
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(boolean)))))))))))))
|
||||
(boolean))))))))))))
|
||||
|
@ -2,12 +2,13 @@
|
||||
Simple For Loop
|
||||
================================================================================
|
||||
|
||||
for i in [1, 2, 3] output i
|
||||
for i in [1, 2, 3] {
|
||||
output i
|
||||
}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(for
|
||||
(identifier)
|
||||
@ -29,18 +30,21 @@ for i in [1, 2, 3] output i
|
||||
(function_call
|
||||
(built_in_function
|
||||
(expression
|
||||
(identifier)))))))))))
|
||||
(identifier))))))))))
|
||||
|
||||
================================================================================
|
||||
Nested For Loop
|
||||
================================================================================
|
||||
|
||||
for list in list_of_lists for item in list output item
|
||||
for list in list_of_lists {
|
||||
for item in list {
|
||||
(output item)
|
||||
}
|
||||
}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(for
|
||||
(identifier)
|
||||
@ -58,4 +62,4 @@ for list in list_of_lists for item in list output item
|
||||
(function_call
|
||||
(built_in_function
|
||||
(expression
|
||||
(identifier))))))))))))))
|
||||
(identifier)))))))))))))
|
||||
|
@ -2,12 +2,11 @@
|
||||
Simple Function
|
||||
================================================================================
|
||||
|
||||
=> "Hiya"
|
||||
=> { "Hiya" }
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -16,18 +15,17 @@ Simple Function
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string)))))))))))
|
||||
(string))))))))))
|
||||
|
||||
================================================================================
|
||||
Function Assignment
|
||||
================================================================================
|
||||
|
||||
x = => "Hiya"
|
||||
x = => { "Hiya" }
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(assignment
|
||||
(identifier)
|
||||
@ -40,7 +38,7 @@ x = => "Hiya"
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string)))))))))))))
|
||||
(string))))))))))))
|
||||
|
||||
================================================================================
|
||||
Function Call
|
||||
@ -51,14 +49,13 @@ Function Call
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(function_call
|
||||
(identifier)
|
||||
(expression
|
||||
(value
|
||||
(string))))))))
|
||||
(string)))))))
|
||||
|
||||
================================================================================
|
||||
Complex Function
|
||||
@ -72,7 +69,6 @@ Complex Function
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -92,7 +88,7 @@ Complex Function
|
||||
(function_call
|
||||
(built_in_function
|
||||
(expression
|
||||
(identifier)))))))))))))
|
||||
(identifier))))))))))))
|
||||
|
||||
================================================================================
|
||||
Complex Function Call
|
||||
@ -110,7 +106,6 @@ Complex Function Call
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(function_call
|
||||
@ -133,4 +128,4 @@ Complex Function Call
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))))
|
||||
(integer)))))))))))
|
||||
|
@ -1,15 +1,14 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Identifiers
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
x
|
||||
_y
|
||||
__xyz__
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(identifier)))
|
||||
@ -18,4 +17,4 @@ __xyz__
|
||||
(identifier)))
|
||||
(statement
|
||||
(expression
|
||||
(identifier)))))
|
||||
(identifier))))
|
||||
|
@ -1,13 +1,12 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple If
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
if true { "True" }
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(if_else
|
||||
(if
|
||||
@ -18,18 +17,17 @@ if true { "True" }
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))
|
||||
(string)))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Complex If
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
if 1 == 1 && 2 == 2 && 3 == 3 "True"
|
||||
if 1 == 1 && 2 == 2 && 3 == 3 { "True" }
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(if_else
|
||||
(if
|
||||
@ -70,22 +68,23 @@ if 1 == 1 && 2 == 2 && 3 == 3 "True"
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))
|
||||
(string)))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Nested If
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
if true
|
||||
if 42 == 12
|
||||
if true {
|
||||
if 42 == 12 {
|
||||
'hiya'
|
||||
else
|
||||
} else {
|
||||
'bye'
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(if_else
|
||||
(if
|
||||
@ -115,18 +114,17 @@ if true
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))))))
|
||||
(string)))))))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
If Else
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
if false "True" else "False"
|
||||
if false { "True" } else { "False" }
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(if_else
|
||||
(if
|
||||
@ -143,11 +141,11 @@ if false "True" else "False"
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))
|
||||
(string)))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
If Else If
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
if 1 == 1 {
|
||||
"math is fun"
|
||||
@ -155,10 +153,9 @@ if 1 == 1 {
|
||||
"math is broken"
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(if_else
|
||||
(if
|
||||
@ -190,25 +187,25 @@ if 1 == 1 {
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))
|
||||
(string)))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
If Else Else If Else
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
if false
|
||||
if false {
|
||||
"no"
|
||||
else if false
|
||||
} else if false {
|
||||
"no"
|
||||
else if 1 + 1 == 9
|
||||
} else if 1 + 1 == 9 {
|
||||
"not the answer"
|
||||
else
|
||||
} else {
|
||||
"42"
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(if_else
|
||||
(if
|
||||
@ -255,4 +252,4 @@ else
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))
|
||||
(string)))))))))
|
||||
|
@ -1,6 +1,6 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Indexes
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
dust_data:1:name
|
||||
|
||||
@ -8,10 +8,9 @@ creature:total_clams
|
||||
|
||||
foobar:1:42
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(index
|
||||
@ -43,18 +42,17 @@ foobar:1:42
|
||||
(integer)))))
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))
|
||||
(integer)))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Nested Indexes
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
[['answers' 'foobar'], 42, 666]:0:1:0..2
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(index
|
||||
@ -91,4 +89,4 @@ Nested Indexes
|
||||
(integer)))
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))
|
||||
(integer)))))))
|
||||
|
@ -1,13 +1,12 @@
|
||||
==================
|
||||
================================================================================
|
||||
List Declaration
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
['answer', 42]
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -17,18 +16,17 @@ List Declaration
|
||||
(string)))
|
||||
(expression
|
||||
(value
|
||||
(integer)))))))))
|
||||
(integer))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
List Nesting
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
['answers', [42, [666]]]
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -47,4 +45,4 @@ List Nesting
|
||||
(list
|
||||
(expression
|
||||
(value
|
||||
(integer)))))))))))))))
|
||||
(integer))))))))))))))
|
||||
|
@ -1,26 +1,26 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Map
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
{ answer = 42 }
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(statement
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(map
|
||||
(assignment
|
||||
(identifier)
|
||||
(assignment_operator)
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))
|
||||
(integer)))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Nested Maps
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
x = {
|
||||
y = {
|
||||
@ -32,19 +32,19 @@ x = {
|
||||
f = 12
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(assignment
|
||||
(identifier)
|
||||
(assignment_operator)
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(map
|
||||
(block
|
||||
(statement
|
||||
(assignment
|
||||
(identifier)
|
||||
(assignment_operator)
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -63,9 +63,12 @@ x = {
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))))
|
||||
(string))))))))))))))
|
||||
(statement
|
||||
(assignment
|
||||
(identifier)
|
||||
(assignment_operator)
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))))
|
||||
(integer)))))))))))
|
||||
|
@ -1,13 +1,12 @@
|
||||
==================
|
||||
================================================================================
|
||||
\==
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
3 == 1 + 1 + 1
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(logic
|
||||
@ -29,18 +28,17 @@
|
||||
(math_operator)
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))
|
||||
(integer)))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
&&
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
4 + 2 == 42 && true
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(logic
|
||||
@ -62,18 +60,17 @@
|
||||
(logic_operator)
|
||||
(expression
|
||||
(value
|
||||
(boolean))))))))))
|
||||
(boolean)))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
\||
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
4 + 2 == 42 || true
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(logic
|
||||
@ -95,4 +92,4 @@
|
||||
(logic_operator)
|
||||
(expression
|
||||
(value
|
||||
(boolean))))))))))
|
||||
(boolean)))))))))
|
||||
|
@ -1,15 +1,14 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Reduce Loop
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
reduce i to acc in [1, 2, 3] {
|
||||
acc += i
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(reduce
|
||||
(identifier)
|
||||
@ -33,20 +32,19 @@ reduce i to acc in [1, 2, 3] {
|
||||
(assignment_operator)
|
||||
(statement
|
||||
(expression
|
||||
(identifier))))))))))
|
||||
(identifier)))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Nested Reduce Loop
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
reduce i to acc in ["one", "two", "three"] {
|
||||
acc += i
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(reduce
|
||||
(identifier)
|
||||
@ -70,4 +68,4 @@ reduce i to acc in ["one", "two", "three"] {
|
||||
(assignment_operator)
|
||||
(statement
|
||||
(expression
|
||||
(identifier))))))))))
|
||||
(identifier)))))))))
|
||||
|
@ -1,15 +1,14 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Remove
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
remove i from [1, 2, 3] {
|
||||
i <= 2
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(remove
|
||||
(identifier)
|
||||
@ -34,11 +33,11 @@ remove i from [1, 2, 3] {
|
||||
(logic_operator)
|
||||
(expression
|
||||
(value
|
||||
(integer)))))))))))
|
||||
(integer))))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Nested Remove
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
remove i from big_list {
|
||||
remove j from i {
|
||||
@ -46,10 +45,9 @@ remove i from big_list {
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(remove
|
||||
(identifier)
|
||||
@ -70,4 +68,4 @@ remove i from big_list {
|
||||
(logic_operator)
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))))))
|
||||
(integer)))))))))))))
|
||||
|
@ -1,15 +1,14 @@
|
||||
==================
|
||||
================================================================================
|
||||
Simple Statements
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
1
|
||||
"one";
|
||||
x
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -20,19 +19,18 @@ x
|
||||
(string))))
|
||||
(statement
|
||||
(expression
|
||||
(identifier)))))
|
||||
(identifier))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Simple Assignment
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
x = 1;
|
||||
y = "one"
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(assignment
|
||||
(identifier)
|
||||
@ -48,11 +46,11 @@ y = "one"
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))
|
||||
(string)))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Complex Assignment
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
x = if 1 + 1 == 2 {
|
||||
'yo'
|
||||
@ -60,10 +58,9 @@ x = if 1 + 1 == 2 {
|
||||
'no'
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(assignment
|
||||
(identifier)
|
||||
@ -96,18 +93,17 @@ x = if 1 + 1 == 2 {
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))))
|
||||
(string)))))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Expression Precedence
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
x = 3 == 1 + 2 + 2
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(assignment
|
||||
(identifier)
|
||||
@ -133,4 +129,4 @@ x = 3 == 1 + 2 + 2
|
||||
(math_operator)
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))))
|
||||
(integer)))))))))))
|
||||
|
@ -1,6 +1,6 @@
|
||||
==================
|
||||
================================================================================
|
||||
Table Declaration
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
table |messages numbers| [
|
||||
['hiya' 42]
|
||||
@ -8,10 +8,9 @@ table |messages numbers| [
|
||||
['bar' 99.99]
|
||||
]
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -48,20 +47,19 @@ table |messages numbers| [
|
||||
(string)))
|
||||
(expression
|
||||
(value
|
||||
(float)))))))))))))))
|
||||
(float))))))))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Table Access
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
select |number| from foobar {
|
||||
text == 'answer'
|
||||
}
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(select
|
||||
(identifier_list
|
||||
@ -77,20 +75,19 @@ select |number| from foobar {
|
||||
(logic_operator)
|
||||
(expression
|
||||
(value
|
||||
(string)))))))))))
|
||||
(string))))))))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Table Insert
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
insert into foobar [
|
||||
['bob was here', 0]
|
||||
]
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(insert
|
||||
(identifier)
|
||||
@ -105,4 +102,4 @@ insert into foobar [
|
||||
(string)))
|
||||
(expression
|
||||
(value
|
||||
(integer)))))))))))))
|
||||
(integer))))))))))))
|
||||
|
@ -9,7 +9,6 @@ transform i in [1, 2, 3] {
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(transform
|
||||
(identifier)
|
||||
@ -31,7 +30,7 @@ transform i in [1, 2, 3] {
|
||||
(function_call
|
||||
(built_in_function
|
||||
(expression
|
||||
(identifier)))))))))))
|
||||
(identifier))))))))))
|
||||
|
||||
================================================================================
|
||||
Nested Transform Loop
|
||||
@ -46,7 +45,6 @@ transform i in [['one'] ['two'] ['three']] {
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(transform
|
||||
(identifier)
|
||||
@ -85,4 +83,4 @@ transform i in [['one'] ['two'] ['three']] {
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))))))
|
||||
(string)))))))))))))
|
||||
|
@ -1,14 +1,13 @@
|
||||
==================
|
||||
================================================================================
|
||||
Booleans
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
true
|
||||
false
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -16,19 +15,18 @@ false
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(boolean))))))
|
||||
(boolean)))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Integers
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
1 2 3
|
||||
456 7
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -48,18 +46,17 @@ Integers
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(integer))))))
|
||||
(integer)))))
|
||||
|
||||
==================
|
||||
================================================================================
|
||||
Strings
|
||||
==================
|
||||
================================================================================
|
||||
|
||||
"one" 'two' "three" `four` 'five'
|
||||
|
||||
---
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
@ -79,4 +76,4 @@ Strings
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(string))))))
|
||||
(string)))))
|
||||
|
@ -9,7 +9,6 @@ while true {
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(while
|
||||
(expression
|
||||
@ -22,7 +21,7 @@ while true {
|
||||
(built_in_function
|
||||
(expression
|
||||
(value
|
||||
(string))))))))))))
|
||||
(string)))))))))))
|
||||
|
||||
================================================================================
|
||||
Nested While Loop
|
||||
@ -37,7 +36,6 @@ while (true) {
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(while
|
||||
(expression
|
||||
@ -62,4 +60,4 @@ while (true) {
|
||||
(statement
|
||||
(expression
|
||||
(value
|
||||
(integer))))))))))))))
|
||||
(integer)))))))))))))
|
||||
|
@ -7,7 +7,6 @@ Simple Yield
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(yield
|
||||
@ -15,7 +14,7 @@ Simple Yield
|
||||
(value
|
||||
(integer)))
|
||||
(function_call
|
||||
(built_in_function)))))))
|
||||
(built_in_function))))))
|
||||
|
||||
================================================================================
|
||||
Long Yield
|
||||
@ -30,7 +29,6 @@ Long Yield
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(root
|
||||
(block
|
||||
(statement
|
||||
(expression
|
||||
(yield
|
||||
@ -59,4 +57,4 @@ Long Yield
|
||||
(function_call
|
||||
(identifier))))
|
||||
(function_call
|
||||
(built_in_function)))))))
|
||||
(built_in_function))))))
|
||||
|
@ -10,19 +10,21 @@ module.exports = grammar({
|
||||
],
|
||||
|
||||
rules: {
|
||||
root: $ => repeat1($.block),
|
||||
root: $ => prec(1, repeat1($.statement)),
|
||||
|
||||
_comment: $ => /[#][^#\n]*[#|\n]/,
|
||||
|
||||
block: $ => prec.right(choice(
|
||||
block: $ => seq(
|
||||
optional('async'),
|
||||
'{',
|
||||
repeat1($.statement),
|
||||
seq('{', repeat1($.statement), '}'),
|
||||
)),
|
||||
'}',
|
||||
),
|
||||
|
||||
statement: $ => prec.right(seq(
|
||||
choice(
|
||||
$.assignment,
|
||||
$.async,
|
||||
$.block,
|
||||
$.expression,
|
||||
$.filter,
|
||||
$.find,
|
||||
@ -268,11 +270,6 @@ module.exports = grammar({
|
||||
$.expression,
|
||||
)),
|
||||
|
||||
async: $ => seq(
|
||||
'async',
|
||||
$.block,
|
||||
),
|
||||
|
||||
identifier_list: $ => prec.right(choice(
|
||||
seq(
|
||||
'|',
|
||||
|
@ -3,10 +3,14 @@
|
||||
"word": "identifier",
|
||||
"rules": {
|
||||
"root": {
|
||||
"type": "PREC",
|
||||
"value": 1,
|
||||
"content": {
|
||||
"type": "REPEAT1",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "block"
|
||||
"name": "statement"
|
||||
}
|
||||
}
|
||||
},
|
||||
"_comment": {
|
||||
@ -14,19 +18,6 @@
|
||||
"value": "[#][^#\\n]*[#|\\n]"
|
||||
},
|
||||
"block": {
|
||||
"type": "PREC_RIGHT",
|
||||
"value": 0,
|
||||
"content": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "REPEAT1",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "statement"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
@ -45,9 +36,6 @@
|
||||
"value": "}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"statement": {
|
||||
"type": "PREC_RIGHT",
|
||||
@ -66,6 +54,10 @@
|
||||
"type": "SYMBOL",
|
||||
"name": "async"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "block"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "expression"
|
||||
|
@ -538,7 +538,7 @@
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "block",
|
||||
"type": "statement",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
@ -583,6 +583,10 @@
|
||||
"type": "async",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "block",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "expression",
|
||||
"named": true
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user