Improve generated AST. Fixed a few "empty" bugs.

pull/204/head
Jonathan Arnett 2021-12-17 02:41:40 +07:00
parent 71c1660942
commit fd348b11c3
7 changed files with 3658 additions and 3730 deletions

@ -6,7 +6,9 @@ const a = "hello"
const a:Int = 1234
const a:Float = -1_234.53__23
const a:#(Int, String) = #(1, "Hello!")
const a:#() = #()
const a:List(Int) = [1, 2]
const a:List(_) = []
const a = <<3>>
const a = <<0:4, 1:3, 1:1>>
const a = <<3:size(8)>>
@ -39,6 +41,10 @@ const a = uri.Uri(host: "github.com")
value: (tuple
(integer)
(string)))
(constant
name: (identifier)
type: (tuple_type)
value: (tuple))
(constant
name: (identifier)
type: (type_constructor
@ -46,6 +52,11 @@ const a = uri.Uri(host: "github.com")
value: (list
(integer)
(integer)))
(constant
name: (identifier)
type: (type_constructor
(type_hole))
value: (list))
(constant
name: (identifier)
value: (bit_string
@ -109,10 +120,12 @@ Public constants
=================
pub const a = "hello"
pub const a:Int = 1234
pub const a:Float = -1_234.53__23
pub const a:#(Int, String) = #(1, "Hello!")
pub const a:List(Int) = [1, 2]
pub const a: Int = 1234
pub const a: Float = -1_234.53__23
pub const a: #(Int, String) = #(1, "Hello!")
pub const a: #() = #()
pub const a: List(Int) = [1, 2]
pub const a: List(_) = []
pub const a = <<3>>
pub const a = <<0:4, 1:3, 1:1>>
pub const a = <<3:size(8)>>
@ -145,6 +158,10 @@ pub const a = uri.Uri(host: "github.com")
value: (tuple
(integer)
(string)))
(public_constant
name: (identifier)
type: (tuple_type)
value: (tuple))
(public_constant
name: (identifier)
type: (type_constructor
@ -152,6 +169,11 @@ pub const a = uri.Uri(host: "github.com")
value: (list
(integer)
(integer)))
(public_constant
name: (identifier)
type: (type_constructor
(type_hole))
value: (list))
(public_constant
name: (identifier)
value: (bit_string

@ -12,8 +12,8 @@ external fn a() -> #(List(Int), fn(Int) -> String) = "x" "y"
(source_file
(external_function
name: (function_name)
parameters: (external_function_parameters
(external_function_parameter
parameters: (function_parameters
(function_parameter
type: (type)))
return_type: (type_constructor
(type)
@ -23,8 +23,8 @@ external fn a() -> #(List(Int), fn(Int) -> String) = "x" "y"
(string)))
(external_function
name: (function_name)
parameters: (external_function_parameters
(external_function_parameter
parameters: (function_parameters
(function_parameter
name: (identifier)
type: (type)))
return_type: (type)
@ -33,6 +33,7 @@ external fn a() -> #(List(Int), fn(Int) -> String) = "x" "y"
(string)))
(external_function
name: (function_name)
parameters: (function_parameters)
return_type: (tuple_type
(type_constructor
(type))
@ -58,8 +59,8 @@ pub external fn a() -> #(List(Int), fn(Int) -> String) = "x" "y"
(source_file
(public_external_function
name: (function_name)
parameters: (external_function_parameters
(external_function_parameter
parameters: (function_parameters
(function_parameter
type: (type)))
return_type: (type_constructor
(type)
@ -69,8 +70,8 @@ pub external fn a() -> #(List(Int), fn(Int) -> String) = "x" "y"
(string)))
(public_external_function
name: (function_name)
parameters: (external_function_parameters
(external_function_parameter
parameters: (function_parameters
(function_parameter
name: (identifier)
type: (type)))
return_type: (type)
@ -79,6 +80,7 @@ pub external fn a() -> #(List(Int), fn(Int) -> String) = "x" "y"
(string)))
(public_external_function
name: (function_name)
parameters: (function_parameters)
return_type: (tuple_type
(type_constructor
(type))

@ -10,14 +10,13 @@ external type Map(key, value)
(source_file
(external_type
name: (type_name))
(type))
(external_type
name: (type_name))
(type_constructor))
(external_type
name: (type_name)
arguments: (external_type_arguments
(external_type_argument)
(external_type_argument))))
(type_constructor
(type_argument)
(type_argument))))
======================
Public external types
@ -31,11 +30,10 @@ pub external type Map(key, value)
(source_file
(public_external_type
name: (type_name))
(type))
(public_external_type
name: (type_name))
(type_constructor))
(public_external_type
name: (type_name)
arguments: (external_type_arguments
(external_type_argument)
(external_type_argument))))
(type_constructor
(type_argument)
(type_argument))))

@ -92,8 +92,9 @@ module.exports = grammar({
alias($._constant_remote_record, $.remote_record)
),
_constant_tuple: ($) =>
seq("#", "(", series_of($._constant_value, ","), ")"),
_constant_list: ($) => seq("[", series_of($._constant_value, ","), "]"),
seq("#", "(", optional(series_of($._constant_value, ",")), ")"),
_constant_list: ($) =>
seq("[", optional(series_of($._constant_value, ",")), "]"),
_constant_bit_string: ($) =>
seq(
"<<",
@ -191,13 +192,21 @@ module.exports = grammar({
seq(
"external",
"type",
field("name", alias($._upname, $.type_name)),
optional(
field("arguments", seq("(", optional($.external_type_arguments), ")"))
choice($.type, alias($.external_type_constructor, $.type_constructor))
),
// TODO: Is this actually any different from the module type constructors?
external_type_constructor: ($) =>
seq(
$._upname,
seq(
"(",
optional(
series_of(alias($.external_type_argument, $.type_argument), ",")
),
")"
)
),
external_type_arguments: ($) =>
series_of(alias($._name, $.external_type_argument), ","),
external_type_argument: ($) => $._name,
/* External functions */
public_external_function: ($) => seq("pub", $._external_function),
@ -207,16 +216,27 @@ module.exports = grammar({
"external",
"fn",
field("name", alias($._name, $.function_name)),
"(",
optional(field("parameters", $.external_function_parameters)),
")",
field(
"parameters",
alias($.external_function_parameters, $.function_parameters)
),
"->",
field("return_type", $._type),
"=",
field("body", $.external_function_body)
),
// TODO: Different from module function parameters?
external_function_parameters: ($) =>
series_of($.external_function_parameter, ","),
seq(
"(",
optional(
series_of(
alias($.external_function_parameter, $.function_parameter),
","
)
),
")"
),
external_function_parameter: ($) =>
seq(
optional(seq(field("name", $.identifier), ":")),
@ -230,14 +250,13 @@ module.exports = grammar({
seq(
"fn",
field("name", $.identifier),
"(",
optional(field("parameters", $.function_parameters)),
")",
optional(seq("->", field("return_type", $._type))),
"{",
"}"
),
function_parameters: ($) => series_of($.function_parameter, ","),
function_parameters: ($) =>
seq("(", optional(series_of($.function_parameter, ",")), ")"),
function_parameter: ($) =>
seq(
choice(
@ -271,8 +290,8 @@ module.exports = grammar({
string: ($) => /\"(?:\\[efnrt\"\\]|[^\"])*\"/,
float: ($) => /-?[0-9_]+\.[0-9_]+/,
integer: ($) => /-?[0-9_]+/,
tuple: ($) => seq("#", "(", series_of($._literal, ","), ")"),
list: ($) => seq("[", series_of($._literal, ","), "]"),
tuple: ($) => seq("#", "(", optional(series_of($._literal, ",")), ")"),
list: ($) => seq("[", optional(series_of($._literal, ",")), "]"),
bit_string: ($) =>
seq("<<", optional(series_of($.bit_string_segment, ",")), ">>"),
bit_string_segment: ($) =>
@ -328,13 +347,12 @@ module.exports = grammar({
function_type: ($) =>
seq(
"fn",
"(",
optional(field("parameter_types", $.function_parameter_types)),
")",
"->",
field("return_type", $._type)
),
function_parameter_types: ($) => series_of($._type, ","),
function_parameter_types: ($) =>
seq("(", optional(series_of($._type, ",")), ")"),
_type_name: ($) => choice($.type_constructor, $.type),
_remote_type_name: ($) =>
seq(

@ -525,27 +525,35 @@
"value": "("
},
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_constant_value"
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_constant_value"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_constant_value"
}
]
}
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_constant_value"
}
]
}
"type": "BLANK"
}
]
},
@ -563,27 +571,35 @@
"value": "["
},
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_constant_value"
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_constant_value"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_constant_value"
}
]
}
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_constant_value"
}
]
}
"type": "BLANK"
}
]
},
@ -1132,93 +1148,95 @@
"type": "STRING",
"value": "type"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_upname"
},
"named": true,
"value": "type_name"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "arguments",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "external_type_arguments"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
}
"type": "SYMBOL",
"name": "type"
},
{
"type": "BLANK"
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "external_type_constructor"
},
"named": true,
"value": "type_constructor"
}
]
}
]
},
"external_type_arguments": {
"external_type_constructor": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_name"
},
"named": true,
"value": "external_type_argument"
"type": "SYMBOL",
"name": "_upname"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_name"
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "external_type_argument"
},
"named": true,
"value": "type_argument"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "external_type_argument"
},
"named": true,
"value": "type_argument"
}
]
}
}
]
},
"named": true,
"value": "external_type_argument"
}
]
}
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
}
]
},
"external_type_argument": {
"type": "SYMBOL",
"name": "_name"
},
"public_external_function": {
"type": "SEQ",
"members": [
@ -1261,28 +1279,17 @@
}
},
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "parameters",
"content": {
"type": "SYMBOL",
"name": "external_function_parameters"
}
"type": "FIELD",
"name": "parameters",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "external_function_parameters"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
"named": true,
"value": "function_parameters"
}
},
{
"type": "STRING",
@ -1314,24 +1321,55 @@
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "external_function_parameter"
"type": "STRING",
"value": "("
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "external_function_parameter"
}
]
}
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "external_function_parameter"
},
"named": true,
"value": "function_parameter"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "external_function_parameter"
},
"named": true,
"value": "function_parameter"
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
@ -1401,10 +1439,6 @@
"name": "identifier"
}
},
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
@ -1421,10 +1455,6 @@
}
]
},
{
"type": "STRING",
"value": ")"
},
{
"type": "CHOICE",
"members": [
@ -1464,24 +1494,45 @@
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "function_parameter"
"type": "STRING",
"value": "("
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "function_parameter"
}
]
}
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "function_parameter"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "function_parameter"
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
@ -1622,27 +1673,35 @@
"value": "("
},
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_literal"
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_literal"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_literal"
}
]
}
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_literal"
}
]
}
"type": "BLANK"
}
]
},
@ -1660,27 +1719,35 @@
"value": "["
},
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_literal"
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_literal"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_literal"
}
]
}
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_literal"
}
]
}
"type": "BLANK"
}
]
},
@ -2134,10 +2201,6 @@
"type": "STRING",
"value": "fn"
},
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
@ -2154,10 +2217,6 @@
}
]
},
{
"type": "STRING",
"value": ")"
},
{
"type": "STRING",
"value": "->"
@ -2176,24 +2235,45 @@
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_type"
"type": "STRING",
"value": "("
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_type"
}
]
}
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_type"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "_type"
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},

@ -387,10 +387,10 @@
},
"parameters": {
"multiple": false,
"required": false,
"required": true,
"types": [
{
"type": "external_function_parameters",
"type": "function_parameters",
"named": true
}
]
@ -455,122 +455,19 @@
}
},
{
"type": "external_function_parameter",
"named": true,
"fields": {
"name": {
"multiple": false,
"required": false,
"types": [
{
"type": "identifier",
"named": true
}
]
},
"type": {
"multiple": true,
"required": true,
"types": [
{
"type": ".",
"named": false
},
{
"type": "function_type",
"named": true
},
{
"type": "remote_type",
"named": true
},
{
"type": "remote_type_constructor",
"named": true
},
{
"type": "tuple_type",
"named": true
},
{
"type": "type",
"named": true
},
{
"type": "type_constructor",
"named": true
},
{
"type": "type_hole",
"named": true
},
{
"type": "type_var",
"named": true
}
]
}
}
},
{
"type": "external_function_parameters",
"type": "external_type",
"named": true,
"fields": {},
"children": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
"type": "external_function_parameter",
"type": "type",
"named": true
}
]
}
},
{
"type": "external_type",
"named": true,
"fields": {
"arguments": {
"multiple": true,
"required": false,
"types": [
{
"type": "(",
"named": false
},
{
"type": ")",
"named": false
},
{
"type": "external_type_arguments",
"named": true
}
]
},
"name": {
"multiple": false,
"required": true,
"types": [
{
"type": "type_name",
"named": true
}
]
}
}
},
{
"type": "external_type_arguments",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
},
{
"type": "external_type_argument",
"type": "type_constructor",
"named": true
}
]
@ -718,7 +615,7 @@
"fields": {},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "function_type",
@ -761,7 +658,7 @@
"fields": {},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "function_parameter",
@ -875,7 +772,7 @@
"fields": {},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "bit_string",
@ -1031,10 +928,10 @@
},
"parameters": {
"multiple": false,
"required": false,
"required": true,
"types": [
{
"type": "external_function_parameters",
"type": "function_parameters",
"named": true
}
]
@ -1086,35 +983,20 @@
{
"type": "public_external_type",
"named": true,
"fields": {
"arguments": {
"multiple": true,
"required": false,
"types": [
{
"type": "(",
"named": false
},
{
"type": ")",
"named": false
},
{
"type": "external_type_arguments",
"named": true
}
]
},
"name": {
"multiple": false,
"required": true,
"types": [
{
"type": "type_name",
"named": true
}
]
}
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "type",
"named": true
},
{
"type": "type_constructor",
"named": true
}
]
}
},
{
@ -1350,7 +1232,7 @@
"fields": {},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "bit_string",
@ -1435,6 +1317,11 @@
"named": true,
"fields": {}
},
{
"type": "type_argument",
"named": true,
"fields": {}
},
{
"type": "type_constructor",
"named": true,
@ -1463,6 +1350,10 @@
"type": "type",
"named": true
},
{
"type": "type_argument",
"named": true
},
{
"type": "type_constructor",
"named": true
@ -1648,10 +1539,6 @@
"type": "external",
"named": false
},
{
"type": "external_type_argument",
"named": true
},
{
"type": "float",
"named": true
@ -1700,10 +1587,6 @@
"type": "type",
"named": false
},
{
"type": "type_name",
"named": true
},
{
"type": "unit",
"named": false

File diff suppressed because it is too large Load Diff