Added more function tests and improved case AST

pull/204/head
Jonathan Arnett 2021-12-29 14:20:18 +07:00
parent 99e0b3b0ae
commit 12ab1ee0f9
5 changed files with 11522 additions and 11434 deletions

@ -54,11 +54,11 @@ fn replace(
name: (identifier)
(arguments
(argument
(function_call
value: (function_call
name: (identifier)
(arguments
(argument
(var)))))))))
value: (var)))))))))
(function
name: (identifier)
parameters: (function_parameters
@ -88,13 +88,13 @@ fn replace(
(arguments
(argument
label: (identifier)
(var))
value: (var))
(argument
label: (identifier)
(var))
value: (var))
(argument
label: (identifier)
(var)))))))
value: (var)))))))
==========================
Complex binary expressions
@ -136,6 +136,194 @@ fn complicated(x, y) {
(var))
(integer)))))))
===============
Basic Functions
===============
fn str() {
"Hello, World!"
}
fn integer() {
42
}
fn float() {
12.34
}
fn record() {
Cat(name: "Nubi")
}
fn remote_record() {
cats.Cat(name: "Nubi")
}
fn var(x) {
x
}
fn funcall() {
myfun()
}
fn unfinished() {
todo("Finish me!")
}
fn tuple(x) {
#(x, 1)
}
fn list(x) {
[1, 2, ..x]
}
fn bit_string() {
<<0:4, 1:3, 1:1>>
}
fn return_fun(x) {
fn(foo y: Int) { x + y }
}
fn expression_group() {
{
1 + 1
"Hello, World!"
}
}
fn foob(x, y) {
case x, y {
1, 2 | 3, 4 -> True
_else -> False
}
}
---
(source_file
(function
name: (identifier)
(function_body
(string)))
(function
name: (identifier)
(function_body
(integer)))
(function
name: (identifier)
(function_body
(float)))
(function
name: (identifier)
(function_body
(record
(arguments
(argument
label: (identifier)
value: (string))))))
(function
name: (identifier)
(function_body
(remote_record
module: (identifier)
(record
(arguments
(argument
label: (identifier)
value: (string)))))))
(function
name: (identifier)
parameters: (function_parameters
(function_parameter
name: (identifier)))
(function_body
(var)))
(function
name: (identifier)
(function_body
(function_call
name: (identifier))))
(function
name: (identifier)
(function_body
(todo
message: (string))))
(function
name: (identifier)
parameters: (function_parameters
(function_parameter
name: (identifier)))
(function_body
(tuple
(var)
(integer))))
(function
name: (identifier)
parameters: (function_parameters
(function_parameter
name: (identifier)))
(function_body
(list
(integer)
(integer)
spread: (var))))
(function
name: (identifier)
(function_body
(bit_string
(bit_string_segment
value: (integer)
options: (bit_string_segment_options
(integer)))
(bit_string_segment
value: (integer)
options: (bit_string_segment_options
(integer)))
(bit_string_segment
value: (integer)
options: (bit_string_segment_options
(integer))))))
(function
name: (identifier)
parameters: (function_parameters
(function_parameter
name: (identifier)))
(function_body
(anonymous_function
parameters: (function_parameters
(function_parameter
label: (identifier)
name: (identifier)
type: (type)))
(function_body
(binop
(var)
(var))))))
(function
name: (identifier)
(function_body
(expression_group
(binop
(integer)
(integer))
(string))))
(function
name: (identifier)
parameters: (function_parameters
(function_parameter
name: (identifier))
(function_parameter
name: (identifier)))
(function_body
(case
subjects: (case_subjects
(var)
(var))
(case_clause
patterns: (case_clause_patterns
(case_clause_pattern
(integer)
(integer))
(case_clause_pattern
(integer)
(integer)))
(record))
(case_clause
patterns: (case_clause_patterns
(case_clause_pattern
(discard_var)))
(record))))))
============
Try Patterns

@ -343,7 +343,7 @@ module.exports = grammar({
argument: ($) =>
seq(
optional(seq(field("label", $.identifier), ":")),
choice(alias($.discard_var, $.hole), $._expression)
field("value", choice(alias($.discard_var, $.hole), $._expression))
),
todo: ($) =>
seq("todo", optional(seq("(", field("message", $.string), ")"))),
@ -354,7 +354,7 @@ module.exports = grammar({
optional(
seq(
series_of($._expression, ","),
optional(seq("..", field("spread", $._expression)))
optional(seq(",", "..", field("spread", $._expression)))
)
),
"]"
@ -375,18 +375,20 @@ module.exports = grammar({
case: ($) =>
seq(
"case",
field("subjects", series_of($._expression, ",")),
field("subjects", $.case_subjects),
"{",
series_of($.case_clause, ""),
repeat1($.case_clause),
"}"
),
case_subjects: ($) => seq(series_of($._expression, ",")),
case_clause: ($) =>
seq(
field("patterns", series_of($.case_clause_pattern, "|")),
field("patterns", $.case_clause_patterns),
optional(field("guard", $.case_clause_guard)),
"->",
$._expression
),
case_clause_patterns: ($) => seq(series_of($.case_clause_pattern, "|")),
case_clause_pattern: ($) => series_of($._pattern, ","),
case_clause_guard: ($) => seq("if", $._case_clause_guard_expression),
_case_clause_guard_expression: ($) =>

@ -2398,22 +2398,26 @@
]
},
{
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "discard_var"
"type": "FIELD",
"name": "value",
"content": {
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "discard_var"
},
"named": true,
"value": "hole"
},
"named": true,
"value": "hole"
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
{
"type": "SYMBOL",
"name": "_expression"
}
]
}
}
]
},
@ -2549,6 +2553,10 @@
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "STRING",
"value": ".."
@ -2864,41 +2872,36 @@
"type": "FIELD",
"name": "subjects",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
}
}
]
"type": "SYMBOL",
"name": "case_subjects"
}
},
{
"type": "STRING",
"value": "{"
},
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "case_clause"
}
},
{
"type": "STRING",
"value": "}"
}
]
},
"case_subjects": {
"type": "SEQ",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "case_clause"
"name": "_expression"
},
{
"type": "REPEAT",
@ -2907,20 +2910,16 @@
"members": [
{
"type": "STRING",
"value": ""
"value": ","
},
{
"type": "SYMBOL",
"name": "case_clause"
"name": "_expression"
}
]
}
}
]
},
{
"type": "STRING",
"value": "}"
}
]
},
@ -2931,29 +2930,8 @@
"type": "FIELD",
"name": "patterns",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "case_clause_pattern"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "|"
},
{
"type": "SYMBOL",
"name": "case_clause_pattern"
}
]
}
}
]
"type": "SYMBOL",
"name": "case_clause_patterns"
}
},
{
@ -2982,6 +2960,36 @@
}
]
},
"case_clause_patterns": {
"type": "SEQ",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "case_clause_pattern"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "|"
},
{
"type": "SYMBOL",
"name": "case_clause_pattern"
}
]
}
}
]
}
]
},
"case_clause_pattern": {
"type": "SEQ",
"members": [

@ -85,77 +85,77 @@
"named": true
}
]
},
"value": {
"multiple": false,
"required": true,
"types": [
{
"type": "anonymous_function",
"named": true
},
{
"type": "binop",
"named": true
},
{
"type": "bit_string",
"named": true
},
{
"type": "case",
"named": true
},
{
"type": "expression_group",
"named": true
},
{
"type": "float",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "hole",
"named": true
},
{
"type": "integer",
"named": true
},
{
"type": "list",
"named": true
},
{
"type": "record",
"named": true
},
{
"type": "remote_record",
"named": true
},
{
"type": "string",
"named": true
},
{
"type": "todo",
"named": true
},
{
"type": "tuple",
"named": true
},
{
"type": "var",
"named": true
}
]
}
},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "anonymous_function",
"named": true
},
{
"type": "binop",
"named": true
},
{
"type": "bit_string",
"named": true
},
{
"type": "case",
"named": true
},
{
"type": "expression_group",
"named": true
},
{
"type": "float",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "hole",
"named": true
},
{
"type": "integer",
"named": true
},
{
"type": "list",
"named": true
},
{
"type": "record",
"named": true
},
{
"type": "remote_record",
"named": true
},
{
"type": "string",
"named": true
},
{
"type": "todo",
"named": true
},
{
"type": "tuple",
"named": true
},
{
"type": "var",
"named": true
}
]
}
},
{
@ -565,71 +565,11 @@
"named": true,
"fields": {
"subjects": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
"type": ",",
"named": false
},
{
"type": "anonymous_function",
"named": true
},
{
"type": "binop",
"named": true
},
{
"type": "bit_string",
"named": true
},
{
"type": "case",
"named": true
},
{
"type": "expression_group",
"named": true
},
{
"type": "float",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "integer",
"named": true
},
{
"type": "list",
"named": true
},
{
"type": "record",
"named": true
},
{
"type": "remote_record",
"named": true
},
{
"type": "string",
"named": true
},
{
"type": "todo",
"named": true
},
{
"type": "tuple",
"named": true
},
{
"type": "var",
"type": "case_subjects",
"named": true
}
]
@ -661,16 +601,12 @@
]
},
"patterns": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
"type": "case_clause_pattern",
"type": "case_clause_patterns",
"named": true
},
{
"type": "|",
"named": false
}
]
}
@ -863,6 +799,92 @@
]
}
},
{
"type": "case_clause_patterns",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "case_clause_pattern",
"named": true
}
]
}
},
{
"type": "case_subjects",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "anonymous_function",
"named": true
},
{
"type": "binop",
"named": true
},
{
"type": "bit_string",
"named": true
},
{
"type": "case",
"named": true
},
{
"type": "expression_group",
"named": true
},
{
"type": "float",
"named": true
},
{
"type": "function_call",
"named": true
},
{
"type": "integer",
"named": true
},
{
"type": "list",
"named": true
},
{
"type": "record",
"named": true
},
{
"type": "remote_record",
"named": true
},
{
"type": "string",
"named": true
},
{
"type": "todo",
"named": true
},
{
"type": "tuple",
"named": true
},
{
"type": "var",
"named": true
}
]
}
},
{
"type": "constant",
"named": true,
@ -2805,10 +2827,6 @@
"named": true,
"fields": {}
},
{
"type": "",
"named": false
},
{
"type": "!=",
"named": false

File diff suppressed because it is too large Load Diff