Add let expressions
This commit is contained in:
parent
68aac9a0ae
commit
1449aa939f
24
grammar.js
24
grammar.js
|
@ -54,6 +54,7 @@ module.exports = grammar({
|
||||||
$.while_expression,
|
$.while_expression,
|
||||||
$.for_expression,
|
$.for_expression,
|
||||||
$.break_expression,
|
$.break_expression,
|
||||||
|
$.let_expression,
|
||||||
),
|
),
|
||||||
|
|
||||||
nil_literal: (_) => "nil",
|
nil_literal: (_) => "nil",
|
||||||
|
@ -210,6 +211,29 @@ module.exports = grammar({
|
||||||
|
|
||||||
break_expression: (_) => "break",
|
break_expression: (_) => "break",
|
||||||
|
|
||||||
|
let_expression: ($) => seq(
|
||||||
|
"let",
|
||||||
|
field("declarations", optional($._declaration_chunks)),
|
||||||
|
"in",
|
||||||
|
field("body", sepBy(";", $._expr)),
|
||||||
|
"end",
|
||||||
|
),
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
|
||||||
|
// Declarations {{{
|
||||||
|
|
||||||
|
_declaration_chunks: ($) => repeat1($._declaration_chunk),
|
||||||
|
|
||||||
|
_declaration_chunk: ($) => choice(
|
||||||
|
$.import_declaration,
|
||||||
|
),
|
||||||
|
|
||||||
|
import_declaration: ($) => seq(
|
||||||
|
"import",
|
||||||
|
field("file", $.string_literal),
|
||||||
|
),
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
107
src/grammar.json
107
src/grammar.json
|
@ -73,6 +73,10 @@
|
||||||
{
|
{
|
||||||
"type": "SYMBOL",
|
"type": "SYMBOL",
|
||||||
"name": "break_expression"
|
"name": "break_expression"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "let_expression"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -945,6 +949,109 @@
|
||||||
"break_expression": {
|
"break_expression": {
|
||||||
"type": "STRING",
|
"type": "STRING",
|
||||||
"value": "break"
|
"value": "break"
|
||||||
|
},
|
||||||
|
"let_expression": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "let"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "FIELD",
|
||||||
|
"name": "declarations",
|
||||||
|
"content": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_declaration_chunks"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "BLANK"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "in"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "FIELD",
|
||||||
|
"name": "body",
|
||||||
|
"content": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_expr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "REPEAT",
|
||||||
|
"content": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": ";"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_expr"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "BLANK"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "end"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"_declaration_chunks": {
|
||||||
|
"type": "REPEAT1",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_declaration_chunk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_declaration_chunk": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "import_declaration"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"import_declaration": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "import"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "FIELD",
|
||||||
|
"name": "file",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "string_literal"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"extras": [
|
"extras": [
|
||||||
|
|
|
@ -47,6 +47,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -121,6 +125,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -229,6 +237,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -327,6 +339,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -407,6 +423,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -491,6 +511,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -571,6 +595,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -645,6 +673,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -729,6 +761,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -813,6 +849,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -903,6 +943,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -977,6 +1021,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1051,6 +1099,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1083,6 +1135,120 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "import_declaration",
|
||||||
|
"named": true,
|
||||||
|
"fields": {
|
||||||
|
"file": {
|
||||||
|
"multiple": false,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "string_literal",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true,
|
||||||
|
"fields": {
|
||||||
|
"body": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": ";",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "array_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "array_value",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "assignment_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "binary_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "break_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "for_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_call",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "identifier",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer_literal",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "nil_literal",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "record_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "record_value",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "sequence_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string_literal",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "unary_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_expression",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"declarations": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "import_declaration",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "record_expression",
|
"type": "record_expression",
|
||||||
"named": true,
|
"named": true,
|
||||||
|
@ -1141,6 +1307,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1265,6 +1435,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1344,6 +1518,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1438,6 +1616,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1528,6 +1710,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1602,6 +1788,10 @@
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let_expression",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1686,6 +1876,10 @@
|
||||||
"type": "else",
|
"type": "else",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "end",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "escape_sequence",
|
"type": "escape_sequence",
|
||||||
"named": true
|
"named": true
|
||||||
|
@ -1702,10 +1896,22 @@
|
||||||
"type": "if",
|
"type": "if",
|
||||||
"named": false
|
"named": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "import",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "in",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "integer_literal",
|
"type": "integer_literal",
|
||||||
"named": true
|
"named": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "let",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "nil_literal",
|
"type": "nil_literal",
|
||||||
"named": true
|
"named": true
|
||||||
|
|
4137
src/parser.c
4137
src/parser.c
File diff suppressed because it is too large
Load diff
123
test/corpus/let_expressions.txt
Normal file
123
test/corpus/let_expressions.txt
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
================================================================================
|
||||||
|
Let expression
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
let
|
||||||
|
import "a.tih"
|
||||||
|
in
|
||||||
|
12
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(let_expression
|
||||||
|
declarations: (import_declaration
|
||||||
|
file: (string_literal))
|
||||||
|
body: (integer_literal)))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Let multiple declarations
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
let
|
||||||
|
import "a.tih"
|
||||||
|
import "b.tih"
|
||||||
|
in
|
||||||
|
12
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(let_expression
|
||||||
|
declarations: (import_declaration
|
||||||
|
file: (string_literal))
|
||||||
|
declarations: (import_declaration
|
||||||
|
file: (string_literal))
|
||||||
|
body: (integer_literal)))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Let multiple expressions
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
let
|
||||||
|
import "a.tih"
|
||||||
|
in
|
||||||
|
12;
|
||||||
|
27
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(let_expression
|
||||||
|
declarations: (import_declaration
|
||||||
|
file: (string_literal))
|
||||||
|
body: (integer_literal)
|
||||||
|
body: (integer_literal)))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Let multiple expressions and declarations
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
let
|
||||||
|
import "a.tih"
|
||||||
|
import "b.tih"
|
||||||
|
in
|
||||||
|
12;
|
||||||
|
27
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(let_expression
|
||||||
|
declarations: (import_declaration
|
||||||
|
file: (string_literal))
|
||||||
|
declarations: (import_declaration
|
||||||
|
file: (string_literal))
|
||||||
|
body: (integer_literal)
|
||||||
|
body: (integer_literal)))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Let empty declarations
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
let
|
||||||
|
in
|
||||||
|
42
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(let_expression
|
||||||
|
body: (integer_literal)))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Let empty expressions
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
let
|
||||||
|
import "a.tih"
|
||||||
|
in
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(let_expression
|
||||||
|
declarations: (import_declaration
|
||||||
|
file: (string_literal))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Let empty
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
let in end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(let_expression))
|
Loading…
Reference in a new issue