tree-sitter-tony
Version:
Tony grammar for tree-sitter
1,123 lines (1,014 loc) • 23.6 kB
Plain Text
==================
abstraction
==================
(a) =>
a
(a, b) => a
(a :: Type, b :: Type, 1, { c :: Type = 1 }) => a
fib :=
(0) =>
0
(1) => 1
<a>(n :: a = 2) =>
fib(n - 1) + fib(n - 2)
<a <: Type>(...a :: a) =>
b := (c :: Type) =>
c
b(1)
() => 1
/ := (a, b) => /
(program
term: (abstraction
branch: (abstraction_branch
element: (identifier_pattern
name: (identifier_pattern_name))
body: (block
term: (identifier))))
term: (abstraction
branch: (abstraction_branch
element: (identifier_pattern
name: (identifier_pattern_name))
element: (identifier_pattern
name: (identifier_pattern_name))
body: (block
term: (identifier))))
term: (abstraction
branch: (abstraction_branch
element: (identifier_pattern
name: (identifier_pattern_name)
type: (parametric_type
name: (type)))
element: (identifier_pattern
name: (identifier_pattern_name)
type: (parametric_type
name: (type)))
element: (number)
element: (destructuring_pattern
pattern: (struct_pattern
member: (shorthand_member_pattern
name: (identifier_pattern_name)
type: (parametric_type
name: (type))
default: (number))))
body: (block
term: (identifier))))
term: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (abstraction
branch: (abstraction_branch
element: (number)
body: (block
term: (number)))
branch: (abstraction_branch
element: (number)
body: (block
term: (number)))
branch: (abstraction_branch
typeParameter: (type_variable_declaration
name: (type_variable_declaration_name))
element: (identifier_pattern
name: (identifier_pattern_name)
type: (type_variable)
default: (number))
body: (block
term: (infix_application
left: (application
name: (identifier)
element: (argument
value: (infix_application
left: (identifier)
name: (identifier)
right: (number))))
name: (identifier)
right: (application
name: (identifier)
element: (argument
value: (infix_application
left: (identifier)
name: (identifier)
right: (number)))))))))
term: (abstraction
branch: (abstraction_branch
typeParameter: (type_variable_declaration
name: (type_variable_declaration_name)
constraint: (parametric_type
name: (type)))
rest: (identifier_pattern
name: (identifier_pattern_name)
type: (type_variable))
body: (block
term: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (abstraction
branch: (abstraction_branch
element: (identifier_pattern
name: (identifier_pattern_name)
type: (parametric_type
name: (type)))
body: (block
term: (identifier)))))
term: (application
name: (identifier)
element: (argument
value: (number))))))
term: (abstraction
branch: (abstraction_branch
body: (block
term: (number))))
term: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (abstraction
branch: (abstraction_branch
element: (identifier_pattern
name: (identifier_pattern_name))
element: (identifier_pattern
name: (identifier_pattern_name))
body: (block
term: (identifier))))))
==================
application
==================
a(1)(1, 2)
+(1)
a<Type<Type, Type>, Type>(?, 1)
+ 1
1 `a` -b()
a(...(a, b))
(program
term: (application
name: (application
name: (identifier)
element: (argument
value: (number)))
element: (argument
value: (number))
element: (argument
value: (number)))
term: (prefix_application
name: (identifier)
value: (group
term: (number)))
term: (application
name: (identifier)
typeArgument: (parametric_type
name: (type)
argument: (parametric_type
name: (type))
argument: (parametric_type
name: (type)))
typeArgument: (parametric_type
name: (type))
element: (argument)
element: (argument
value: (number)))
term: (prefix_application
name: (identifier)
value: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (prefix_application
name: (identifier)
value: (application
name: (identifier))))
term: (application
name: (identifier)
element: (argument
value: (spread
value: (tuple
element: (identifier)
element: (identifier))))))
==================
prefix application
==================
!false
+1
-1
~1
(program
term: (prefix_application
name: (identifier)
value: (boolean))
term: (prefix_application
name: (identifier)
value: (number))
term: (prefix_application
name: (identifier)
value: (number))
term: (prefix_application
name: (identifier)
value: (number)))
==================
infix application
==================
1 .. 1
1 ^ 1
1 * 1
1 / 1
1 + 1
1 - 1
1 % 1
1 < 1
1 <= 1
1 > 1
1 >= 1
1 == 1
1 != 1
a === 1
1 !== b
a ~ b
false && false
false || false
false ==> true <=> true
false && false || false
false || false && false
1 + 1 % 1
1 - 1 + 1
1 - -1
1 * 1 / 1 - 1
false || !false
(a.b) . c ^ 1 . (d.e)
(program
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (number))
term: (infix_application
left: (identifier)
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (identifier))
term: (infix_application
left: (identifier)
name: (identifier)
right: (identifier))
term: (infix_application
left: (boolean)
name: (identifier)
right: (boolean))
term: (infix_application
left: (boolean)
name: (identifier)
right: (boolean))
term: (infix_application
left: (infix_application
left: (boolean)
name: (identifier)
right: (boolean))
name: (identifier)
right: (boolean))
term: (infix_application
left: (infix_application
left: (boolean)
name: (identifier)
right: (boolean))
name: (identifier)
right: (boolean))
term: (infix_application
left: (boolean)
name: (identifier)
right: (infix_application
left: (boolean)
name: (identifier)
right: (boolean)))
term: (infix_application
left: (infix_application
left: (number)
name: (identifier)
right: (number))
name: (identifier)
right: (number))
term: (infix_application
left: (infix_application
left: (number)
name: (identifier)
right: (number))
name: (identifier)
right: (number))
term: (infix_application
left: (number)
name: (identifier)
right: (prefix_application
name: (identifier)
value: (number)))
term: (infix_application
left: (infix_application
left: (infix_application
left: (number)
name: (identifier)
right: (number))
name: (identifier)
right: (number))
name: (identifier)
right: (number))
term: (infix_application
left: (boolean)
name: (identifier)
right: (prefix_application
name: (identifier)
value: (boolean)))
term: (infix_application
left: (pipeline
value: (group
term: (pipeline
value: (identifier)
name: (identifier)))
name: (identifier))
name: (identifier)
right: (pipeline
value: (number)
name: (group
term: (pipeline
value: (identifier)
name: (identifier))))))
==================
pipeline
==================
a.b.c(1)
(program
term: (application
name: (pipeline
value: (pipeline
value: (identifier)
name: (identifier))
name: (identifier))
element: (argument
value: (number))))
==================
sections
==================
((+) 1)
(1 (+))
(`mod` 1)
(1 `mod`)
(program
term: (right_section
name: (identifier)
value: (number))
term: (left_section
value: (number)
name: (identifier))
term: (right_section
name: (identifier)
value: (number))
term: (left_section
value: (number)
name: (identifier)))
==================
access
==================
a[0]
a->b(1)
a.b[c]
(program
term: (access
name: (identifier)
value: (number))
term: (application
name: (access
name: (identifier)
value: (shorthand_access_identifier))
element: (argument
value: (number)))
term: (pipeline
value: (identifier)
name: (access
name: (identifier)
value: (identifier))))
==================
assignment
==================
a :: Type := 1
a := (a :: Type) =>
1
(program
term: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name)
type: (parametric_type
name: (type)))
value: (number))
term: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (abstraction
branch: (abstraction_branch
element: (identifier_pattern
name: (identifier_pattern_name)
type: (parametric_type
name: (type)))
body: (block
term: (number))))))
==================
export
==================
export a := 1
export a := (x :: a) =>
1
(program
term: (export
declaration: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (number)))
term: (export
declaration: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (abstraction
branch: (abstraction_branch
element: (identifier_pattern
name: (identifier_pattern_name)
type: (type_variable))
body: (block
term: (number)))))))
==================
return
==================
return 1
return (a :: Type) =>
1
(program
term: (return
value: (number))
term: (return
value: (abstraction
branch: (abstraction_branch
element: (identifier_pattern
name: (identifier_pattern_name)
type: (parametric_type
name: (type)))
body: (block
term: (number))))))
==================
if
==================
if false then
1
if true then
1
else
1
a :=
if true then
1
else if false then 1
else if true then
1
fn(if false then 1)
if true then 1 else 1
(program
term: (if
condition: (boolean)
body: (block
term: (number)))
term: (if
condition: (boolean)
body: (block
term: (number))
else: (block
term: (number)))
term: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (if
condition: (boolean)
body: (block
term: (number))
elseIf: (else_if
condition: (boolean)
body: (block
term: (number)))
elseIf: (else_if
condition: (boolean)
body: (block
term: (number)))))
term: (application
name: (identifier)
element: (argument
value: (if
condition: (boolean)
body: (block
term: (number)))))
term: (if
condition: (boolean)
body: (block
term: (number))
else: (block
term: (number))))
==================
case
==================
a :=
case a
when 1 then
1
else 1
case a
when [1, a :: Type] then
a
when 1, 1 then 1
else 1
(program
term: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (case
value: (identifier)
when: (when
pattern: (number)
body: (block
term: (number)))
else: (block
term: (number))))
term: (case
value: (identifier)
when: (when
pattern: (destructuring_pattern
pattern: (list_pattern
element: (number)
element: (identifier_pattern
name: (identifier_pattern_name)
type: (parametric_type
name: (type)))))
body: (block
term: (identifier)))
when: (when
pattern: (number)
pattern: (number)
body: (block
term: (number)))
else: (block
term: (number))))
==================
enum
==================
enum Type
a
b = 'string'
(program
term: (enum
name: (type)
value: (enum_value
name: (identifier_pattern_name))
value: (enum_value
name: (identifier_pattern_name)
value: (string))))
==================
class
==================
class Type<a>
a :: a -> Number
b :: a -> Number
class Ord<a <: Eq, b <: (Num; Eq; Ord)>
compare :: a -> b -> Number
(program
term: (class
name: (type_declaration
name: (type)
parameter: (type_variable_declaration
name: (type_variable_declaration_name)))
member: (class_member
name: (identifier_pattern_name)
type: (curried_type
from: (type_variable)
to: (parametric_type
name: (type))))
member: (class_member
name: (identifier_pattern_name)
type: (curried_type
from: (type_variable)
to: (parametric_type
name: (type)))))
term: (class
name: (type_declaration
name: (type)
parameter: (type_variable_declaration
name: (type_variable_declaration_name)
constraint: (parametric_type
name: (type)))
parameter: (type_variable_declaration
name: (type_variable_declaration_name)
constraint: (parametric_type
name: (type))
constraint: (parametric_type
name: (type))
constraint: (parametric_type
name: (type))))
member: (class_member
name: (identifier_pattern_name)
type: (curried_type
from: (type_variable)
to: (curried_type
from: (type_variable)
to: (parametric_type
name: (type)))))))
==================
instance
==================
instance Ord<Number>
compare := 1
(program
term: (instance
name: (parametric_type
name: (type)
argument: (parametric_type
name: (type)))
assignment: (assignment
pattern: (identifier_pattern
name: (identifier_pattern_name))
value: (number))))
==================
struct
==================
{}
{ a, b }
{ ['a']: 1, ...b, c: 'str', d, e }
(program
term: (struct)
term: (struct
member: (shorthand_member)
member: (shorthand_member))
term: (struct
member: (member
key: (string)
value: (number))
member: (spread
value: (identifier))
member: (member
key: (shorthand_member_identifier)
value: (string))
member: (shorthand_member)
member: (shorthand_member)))
==================
tagged struct
==================
<constructor>{}
<constructor>{ a, b }
<constructor>{ ['a']: 1, ...b, c: 'str', d, e }
(program
term: (tagged_value
name: (identifier)
value: (struct))
term: (tagged_value
name: (identifier)
value: (struct
member: (shorthand_member)
member: (shorthand_member)))
term: (tagged_value
name: (identifier)
value: (struct
member: (member
key: (string)
value: (number))
member: (spread
value: (identifier))
member: (member
key: (shorthand_member_identifier)
value: (string))
member: (shorthand_member)
member: (shorthand_member))))
==================
tuple
==================
()
(a, 1, 'str', ...x)
(1,1)
(program
term: (tuple)
term: (tuple
element: (identifier)
element: (number)
element: (string)
element: (spread
value: (identifier)))
term: (tuple
element: (number)
element: (number)))
==================
tagged tuple
==================
<constructor>()
<constructor>(a, 1, 'str', ...x)
<constructor>(1,1)
(program
term: (tagged_value
name: (identifier)
value: (tuple))
term: (tagged_value
name: (identifier)
value: (tuple
element: (identifier)
element: (number)
element: (string)
element: (spread
value: (identifier))))
term: (tagged_value
name: (identifier)
value: (tuple
element: (number)
element: (number))))
==================
list
==================
[]
[a, 1, ...b, 'str']
[1,1..1,1]
(program
term: (list)
term: (list
element: (identifier)
element: (number)
element: (spread
value: (identifier))
element: (string))
term: (list
element: (number)
element: (infix_application
left: (number)
name: (identifier)
right: (number))
element: (number)))
==================
tagged list
==================
<constructor>[]
<constructor>[a, 1, ...b, 'str']
<constructor>[1,1..1,1]
(program
term: (tagged_value
name: (identifier)
value: (list))
term: (tagged_value
name: (identifier)
value: (list
element: (identifier)
element: (number)
element: (spread
value: (identifier))
element: (string)))
term: (tagged_value
name: (identifier)
value: (list
element: (number)
element: (infix_application
left: (number)
name: (identifier)
right: (number))
element: (number))))
==================
list comprehension
==================
[i * 2 | i in 1..10]
[i / 2 | i in 1..10 if i % 2 == 0]
[[x, y] | x in 1..10 if x % 2 == 0, y in 1..10 if i % 2 == 0]
(program
term: (list_comprehension
body: (block
term: (infix_application
left: (identifier)
name: (identifier)
right: (number)))
generator: (generator
name: (identifier_pattern_name)
value: (infix_application
left: (number)
name: (identifier)
right: (number))))
term: (list_comprehension
body: (block
term: (infix_application
left: (identifier)
name: (identifier)
right: (number)))
generator: (generator
name: (identifier_pattern_name)
value: (infix_application
left: (number)
name: (identifier)
right: (number))
condition: (infix_application
left: (infix_application
left: (identifier)
name: (identifier)
right: (number))
name: (identifier)
right: (number))))
term: (list_comprehension
body: (block
term: (list
element: (identifier)
element: (identifier)))
generator: (generator
name: (identifier_pattern_name)
value: (infix_application
left: (number)
name: (identifier)
right: (number))
condition: (infix_application
left: (infix_application
left: (identifier)
name: (identifier)
right: (number))
name: (identifier)
right: (number)))
generator: (generator
name: (identifier_pattern_name)
value: (infix_application
left: (number)
name: (identifier)
right: (number))
condition: (infix_application
left: (infix_application
left: (identifier)
name: (identifier)
right: (number))
name: (identifier)
right: (number)))))
==================
tagged value
==================
<constructor>'String'
<constructor>1
<constructor>
(program
term: (tagged_value
name: (identifier)
value: (string))
term: (tagged_value
name: (identifier)
value: (number))
term: (tagged_value
name: (identifier)))
==================
type alias
==================
type Type := Type
type <constructor> Type := Type
type Type<a, b <: Num> := a -> b
type GreaterThan<a>(x :: a) := [y :: a | y > x]
(program
term: (type_alias
name: (type_declaration
name: (type))
type: (parametric_type
name: (type)))
term: (type_alias
name: (type_declaration
tag: (identifier_pattern_name)
name: (type))
type: (parametric_type
name: (type)))
term: (type_alias
name: (type_declaration
name: (type)
parameter: (type_variable_declaration
name: (type_variable_declaration_name))
parameter: (type_variable_declaration
name: (type_variable_declaration_name)
constraint: (parametric_type
name: (type))))
type: (curried_type
from: (type_variable)
to: (type_variable)))
term: (type_alias
name: (type_declaration
name: (type)
parameter: (type_variable_declaration
name: (type_variable_declaration_name))
element: (identifier_pattern
name: (identifier_pattern_name)
type: (type_variable)))
type: (refinement_type
generator: (refinement_type_declaration
name: (identifier_pattern_name)
type: (type_variable))
predicate: (infix_application
left: (identifier)
name: (identifier)
right: (identifier)))))
==================
type hint
==================
'string' as String
(program
term: (type_hint
value: (string)
type: (parametric_type
name: (type))))
==================
group
==================
(1)
(n)
(-1)
(-n)
n / ((n + 1) * (-2))
(program
term: (group
term: (number))
term: (group
term: (identifier))
term: (group
term: (prefix_application
name: (identifier)
value: (number)))
term: (group
term: (prefix_application
name: (identifier)
value: (identifier)))
term: (infix_application
left: (identifier)
name: (identifier)
right: (group
term: (infix_application
left: (group
term: (infix_application
left: (identifier)
name: (identifier)
right: (number)))
name: (identifier)
right: (group
term: (prefix_application
name: (identifier)
value: (number)))))))