Support v0.24 binary concatenation operator (#39)

pull/844/head
Michael Davis 2022-10-27 22:54:52 +07:00 committed by GitHub
parent 926eb0262e
commit e21567343e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 26724 additions and 24566 deletions

@ -298,7 +298,8 @@ module.exports = grammar({
binaryExpr(prec.left, 7, "*.", $._expression),
binaryExpr(prec.left, 7, "/", $._expression),
binaryExpr(prec.left, 7, "/.", $._expression),
binaryExpr(prec.left, 7, "%", $._expression)
binaryExpr(prec.left, 7, "%", $._expression),
binaryExpr(prec.left, 7, "<>", $._expression)
),
// The way that this function is written in the Gleam parser is essentially
// incompatible with tree-sitter. It first parses some base expression,
@ -541,19 +542,24 @@ module.exports = grammar({
field("function", $._maybe_function_expression),
field("arguments", $.arguments)
),
_pattern_expression: ($) =>
choice(
$.identifier,
$.discard,
$.record_pattern,
$.string,
$.integer,
$.float,
$.tuple_pattern,
alias($._pattern_bit_string, $.bit_string_pattern),
$.list_pattern,
alias($._pattern_binary_expression, $.binary_expression)
),
_pattern_binary_expression: ($) =>
binaryExpr(prec.left, 1, "<>", $._pattern_expression),
_pattern: ($) =>
seq(
choice(
$.identifier,
$.discard,
$.record_pattern,
$.string,
$.integer,
$.float,
$.tuple_pattern,
alias($._pattern_bit_string, $.bit_string_pattern),
$.list_pattern
),
$._pattern_expression,
optional(field("assign", seq("as", $.identifier)))
),
record_pattern: ($) =>

165
src/grammar.json generated

@ -2582,6 +2582,39 @@
}
]
}
},
{
"type": "PREC_LEFT",
"value": 7,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "left",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
},
{
"type": "FIELD",
"name": "operator",
"content": {
"type": "STRING",
"value": "<>"
}
},
{
"type": "FIELD",
"name": "right",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
}
]
}
}
]
},
@ -4468,54 +4501,100 @@
}
]
},
"_pattern": {
"type": "SEQ",
"_pattern_expression": {
"type": "CHOICE",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "discard"
},
{
"type": "SYMBOL",
"name": "record_pattern"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "integer"
},
{
"type": "SYMBOL",
"name": "float"
},
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "discard"
},
{
"type": "SYMBOL",
"name": "record_pattern"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "integer"
},
{
"type": "SYMBOL",
"name": "float"
},
{
"type": "SYMBOL",
"name": "tuple_pattern"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_pattern_bit_string"
},
"named": true,
"value": "bit_string_pattern"
},
{
"type": "SYMBOL",
"name": "list_pattern"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_pattern_binary_expression"
},
"named": true,
"value": "binary_expression"
}
]
},
"_pattern_binary_expression": {
"type": "PREC_LEFT",
"value": 1,
"content": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "left",
"content": {
"type": "SYMBOL",
"name": "tuple_pattern"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_pattern_bit_string"
},
"named": true,
"value": "bit_string_pattern"
},
{
"name": "_pattern_expression"
}
},
{
"type": "FIELD",
"name": "operator",
"content": {
"type": "STRING",
"value": "<>"
}
},
{
"type": "FIELD",
"name": "right",
"content": {
"type": "SYMBOL",
"name": "list_pattern"
"name": "_pattern_expression"
}
]
}
]
}
},
"_pattern": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_pattern_expression"
},
{
"type": "CHOICE",

80
src/node-types.json generated

@ -198,6 +198,10 @@
"type": "as",
"named": false
},
{
"type": "binary_expression",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
@ -374,10 +378,18 @@
"type": "bit_string",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
},
{
"type": "case",
"named": true
},
{
"type": "discard",
"named": true
},
{
"type": "expression_group",
"named": true
@ -410,6 +422,10 @@
"type": "list",
"named": true
},
{
"type": "list_pattern",
"named": true
},
{
"type": "negation",
"named": true
@ -418,6 +434,10 @@
"type": "record",
"named": true
},
{
"type": "record_pattern",
"named": true
},
{
"type": "record_update",
"named": true
@ -438,6 +458,10 @@
"type": "tuple_access",
"named": true
},
{
"type": "tuple_pattern",
"named": true
},
{
"type": "{",
"named": false
@ -512,6 +536,10 @@
"type": "<=.",
"named": false
},
{
"type": "<>",
"named": false
},
{
"type": "==",
"named": false
@ -562,10 +590,18 @@
"type": "bit_string",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
},
{
"type": "case",
"named": true
},
{
"type": "discard",
"named": true
},
{
"type": "expression_group",
"named": true
@ -598,6 +634,10 @@
"type": "list",
"named": true
},
{
"type": "list_pattern",
"named": true
},
{
"type": "negation",
"named": true
@ -606,6 +646,10 @@
"type": "record",
"named": true
},
{
"type": "record_pattern",
"named": true
},
{
"type": "record_update",
"named": true
@ -626,6 +670,10 @@
"type": "tuple_access",
"named": true
},
{
"type": "tuple_pattern",
"named": true
},
{
"type": "{",
"named": false
@ -716,6 +764,10 @@
"type": "assert",
"named": true
},
{
"type": "binary_expression",
"named": true
},
{
"type": "bit_string",
"named": true
@ -1134,6 +1186,10 @@
"multiple": true,
"required": true,
"types": [
{
"type": "binary_expression",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
@ -2190,6 +2246,10 @@
"type": "as",
"named": false
},
{
"type": "binary_expression",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
@ -2543,6 +2603,10 @@
"multiple": true,
"required": false,
"types": [
{
"type": "binary_expression",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
@ -2798,6 +2862,10 @@
"type": "as",
"named": false
},
{
"type": "binary_expression",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
@ -3385,6 +3453,10 @@
"type": "as",
"named": false
},
{
"type": "binary_expression",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
@ -3701,6 +3773,10 @@
"multiple": true,
"required": false,
"types": [
{
"type": "binary_expression",
"named": true
},
{
"type": "bit_string_pattern",
"named": true
@ -4135,6 +4211,10 @@
"type": "<=.",
"named": false
},
{
"type": "<>",
"named": false
},
{
"type": "=",
"named": false

50953
src/parser.c generated

File diff suppressed because it is too large Load Diff

@ -40,3 +40,57 @@ True && !False
(negation
(record
(constructor_name)))))
================================================================================
Concatenation
================================================================================
let concat = "a" <> "b"
case "12345" {
"0" <> rest -> rest
"12" <> "34" <> "5" -> "match"
_ -> ""
}
--------------------------------------------------------------------------------
(source_file
(let
(identifier)
(binary_expression
(string
(quoted_content))
(string
(quoted_content))))
(case
(case_subjects
(string
(quoted_content)))
(case_clauses
(case_clause
(case_clause_patterns
(case_clause_pattern
(binary_expression
(string
(quoted_content))
(identifier))))
(identifier))
(case_clause
(case_clause_patterns
(case_clause_pattern
(binary_expression
(binary_expression
(string
(quoted_content))
(string
(quoted_content)))
(string
(quoted_content)))))
(string
(quoted_content)))
(case_clause
(case_clause_patterns
(case_clause_pattern
(discard)))
(string)))))

@ -0,0 +1,8 @@
case "12345" {
"123" <> rest -> rest
// <- string
// ^ operator
// ^ variable
_ -> ""
// ^ string
}