Finally got all the stuff to parse
This commit is contained in:
parent
bea8e5a92b
commit
0429141baf
4 changed files with 65 additions and 27 deletions
|
@ -13,7 +13,8 @@
|
||||||
// ## INPUTS
|
// ## INPUTS
|
||||||
// ####################################
|
// ####################################
|
||||||
|
|
||||||
file = _{ soi ~ def_module* ~ eoi }
|
file = _{ soi ~ newline* ~ (file_contents ~ newline*)? ~ eoi }
|
||||||
|
file_contents = _{ def_module ~ (newline+ ~ def_module)* }
|
||||||
|
|
||||||
|
|
||||||
// ####################################
|
// ####################################
|
||||||
|
@ -32,8 +33,8 @@ expression_infix = !{ literal ~ (binary_operator ~ literal)+ }
|
||||||
array = !{ "[" ~ (expression ~ ("," ~ expression)*)? ~ "]" }
|
array = !{ "[" ~ (expression ~ ("," ~ expression)*)? ~ "]" }
|
||||||
atom = ${ ":" ~ identifier }
|
atom = ${ ":" ~ identifier }
|
||||||
boolean = { boolean_true | boolean_false }
|
boolean = { boolean_true | boolean_false }
|
||||||
boolean_false = { "false" }
|
boolean_false = @{ keyword_false }
|
||||||
boolean_true = { "true" }
|
boolean_true = @{ keyword_true }
|
||||||
braced = !{ "(" ~ expression ~ ")" }
|
braced = !{ "(" ~ expression ~ ")" }
|
||||||
constructor = !{ type_name ~ "{" ~ argument_list? ~ "}" }
|
constructor = !{ type_name ~ "{" ~ argument_list? ~ "}" }
|
||||||
literal = !{ unary | constructor | array | float | integer | string | atom | property | variable | braced | boolean | type_name }
|
literal = !{ unary | constructor | array | float | integer | string | atom | property | variable | braced | boolean | type_name }
|
||||||
|
@ -46,23 +47,38 @@ variable = @{ identifier }
|
||||||
// ## WHITESPACE
|
// ## WHITESPACE
|
||||||
// ####################################
|
// ####################################
|
||||||
|
|
||||||
whitespace = _{ space | newline }
|
whitespace = _{ " " | "\t" }
|
||||||
space = _{ " " | "\t" }
|
|
||||||
newline = _{ "\n" | "\r\n" }
|
newline = _{ "\n" | "\r\n" }
|
||||||
padded_newline = _{ space* ~ newline ~ space* }
|
comment = _{ "#" ~ (!newline ~ any)* ~ (newline | eoi) }
|
||||||
comment = _{ "#" ~ (!newline ~ any)* }
|
|
||||||
|
|
||||||
|
|
||||||
// ####################################
|
// ####################################
|
||||||
// ## IDENTIFIERS
|
// ## IDENTIFIERS
|
||||||
// ####################################
|
// ####################################
|
||||||
|
|
||||||
|
keyword = _{
|
||||||
|
keyword_stabby | keyword_end | keyword_def_static |
|
||||||
|
keyword_def_public | keyword_def_private |
|
||||||
|
keyword_def_type | keyword_def_trait |
|
||||||
|
keyword_def_impl |
|
||||||
|
keyword_true | keyword_false
|
||||||
|
}
|
||||||
|
keyword_stabby = _{ "->" }
|
||||||
|
keyword_end = _{ "end" ~ !identifier_tail }
|
||||||
|
keyword_def_static = { "defstatic" }
|
||||||
|
keyword_def_public = { "def" }
|
||||||
|
keyword_def_private = { "defp" }
|
||||||
|
keyword_def_type = { "deftype" }
|
||||||
|
keyword_def_trait = { "deftrait" }
|
||||||
|
keyword_def_impl = { "defimpl" }
|
||||||
|
keyword_true = { "true" }
|
||||||
|
keyword_false = { "false" }
|
||||||
|
|
||||||
identifier_test = _{ soi ~ identifier ~ eoi }
|
identifier_test = _{ soi ~ identifier ~ eoi }
|
||||||
identifier = @{ !identifier_reserved ~ identifier_head ~ identifier_tail? }
|
identifier = @{ !keyword ~ identifier_head ~ identifier_tail? }
|
||||||
identifier_reserved = _{ block_end | def_keyword | boolean }
|
|
||||||
identifier_head = @{ 'a'..'z' | "_" }
|
identifier_head = @{ 'a'..'z' | "_" }
|
||||||
identifier_tail = @{ ('a'..'z' | 'A'..'Z' | "_" | '0'..'9')+ }
|
identifier_tail = @{ ('a'..'z' | 'A'..'Z' | "_" | '0'..'9')+ }
|
||||||
type_name = @{ !identifier_reserved ~ type_name_head ~ identifier_tail? }
|
type_name = @{ !keyword ~ type_name_head ~ identifier_tail? }
|
||||||
type_name_head = @{ 'A'..'Z' }
|
type_name_head = @{ 'A'..'Z' }
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,11 +87,9 @@ type_name_head = @{ 'A'..'Z' }
|
||||||
// ####################################
|
// ####################################
|
||||||
|
|
||||||
block_test = _{ soi ~ block ~ eoi }
|
block_test = _{ soi ~ block ~ eoi }
|
||||||
block = @{ block_stabby ~ whitespace+ ~ (block_end | block_body) }
|
block = { keyword_stabby ~ newline* ~ (block_body ~ newline*)? ~ keyword_end }
|
||||||
block_stabby = _{ "->" }
|
block_body = _{ block_expression ~ (newline+ ~ block_expression)* }
|
||||||
block_body = _{ block_expression ~ (padded_newline+ ~ block_expression)* ~ whitespace* ~ block_end }
|
|
||||||
block_expression = _{ def_function | expression }
|
block_expression = _{ def_function | expression }
|
||||||
block_end = _{ "end" ~ !identifier_tail }
|
|
||||||
|
|
||||||
|
|
||||||
// ####################################
|
// ####################################
|
||||||
|
@ -133,12 +147,12 @@ argument_keyword = ${ identifier ~ ":" }
|
||||||
def_fn_keyword = _{ def_static | def_private | def_public }
|
def_fn_keyword = _{ def_static | def_private | def_public }
|
||||||
def_type_keyword = _{ def_trait | def_type | def_impl }
|
def_type_keyword = _{ def_trait | def_type | def_impl }
|
||||||
def_keyword = _{ def_type_keyword | def_fn_keyword }
|
def_keyword = _{ def_type_keyword | def_fn_keyword }
|
||||||
def_static = { "defstatic" }
|
def_static = @{ keyword_def_static }
|
||||||
def_private = { "defp" }
|
def_private = @{ keyword_def_private }
|
||||||
def_public = { "def" }
|
def_public = @{ keyword_def_public }
|
||||||
def_trait = { "deftrait" }
|
def_trait = @{ keyword_def_trait }
|
||||||
def_type = { "deftype" }
|
def_type = @{ keyword_def_type }
|
||||||
def_impl = { "defimpl" }
|
def_impl = @{ keyword_def_impl }
|
||||||
def_name = ${ identifier ~ def_predicate? }
|
def_name = ${ identifier ~ def_predicate? }
|
||||||
def_predicate = { "?" }
|
def_predicate = { "?" }
|
||||||
def_return_type = { "<" ~ type_name ~ ">" }
|
def_return_type = { "<" ~ type_name ~ ">" }
|
||||||
|
|
|
@ -7,7 +7,7 @@ fn empty() {
|
||||||
input: "-> end ",
|
input: "-> end ",
|
||||||
rule: Rule::block,
|
rule: Rule::block,
|
||||||
tokens: [
|
tokens: [
|
||||||
block(0, 6, [])
|
block(0, 7)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,23 @@ fn with_multi_function_def() {
|
||||||
def none?
|
def none?
|
||||||
end"#,
|
end"#,
|
||||||
rule: Rule::block_test,
|
rule: Rule::block_test,
|
||||||
tokens: []
|
tokens: [
|
||||||
|
block(0, 84, [
|
||||||
|
def_function(23, 32, [
|
||||||
|
def_public(23, 26),
|
||||||
|
def_name(27, 32, [
|
||||||
|
identifier(27, 31),
|
||||||
|
def_predicate(31, 32)
|
||||||
|
])
|
||||||
|
]),
|
||||||
|
def_function(53, 62, [
|
||||||
|
def_public(53, 56),
|
||||||
|
def_name(57, 62, [
|
||||||
|
identifier(57, 61),
|
||||||
|
def_predicate(61, 62)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,15 @@ fn leading_comment() {
|
||||||
parser: Grammar,
|
parser: Grammar,
|
||||||
input: "# test
|
input: "# test
|
||||||
123",
|
123",
|
||||||
rule: Rule::expression,
|
rule: Rule::expression_test,
|
||||||
tokens: [
|
tokens: [
|
||||||
|
expression(23, 26, [
|
||||||
|
literal(23, 26, [
|
||||||
|
integer(23, 26, [
|
||||||
|
integer_decimal(23, 26)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ fn multi_def_with_args() {
|
||||||
",
|
",
|
||||||
rule: Rule::file,
|
rule: Rule::file,
|
||||||
tokens: [
|
tokens: [
|
||||||
def_module(17, 66, [
|
def_module(17, 48, [
|
||||||
def_type(17, 24),
|
def_type(17, 24),
|
||||||
type_name(25, 33),
|
type_name(25, 33),
|
||||||
argument_pair(34, 48, [
|
argument_pair(34, 48, [
|
||||||
|
@ -23,7 +23,7 @@ fn multi_def_with_args() {
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
]),
|
]),
|
||||||
def_module(66, 115, [
|
def_module(66, 99, [
|
||||||
def_impl(66, 73),
|
def_impl(66, 73),
|
||||||
type_name(74, 85),
|
type_name(74, 85),
|
||||||
argument_pair(86, 99, [
|
argument_pair(86, 99, [
|
||||||
|
@ -50,11 +50,11 @@ fn multi_def_no_args() {
|
||||||
",
|
",
|
||||||
rule: Rule::file,
|
rule: Rule::file,
|
||||||
tokens: [
|
tokens: [
|
||||||
def_module(17, 51, [
|
def_module(17, 33, [
|
||||||
def_type(17, 24),
|
def_type(17, 24),
|
||||||
type_name(25, 33),
|
type_name(25, 33),
|
||||||
]),
|
]),
|
||||||
def_module(51, 86, [
|
def_module(51, 70, [
|
||||||
def_impl(51, 58),
|
def_impl(51, 58),
|
||||||
type_name(59, 70)
|
type_name(59, 70)
|
||||||
])
|
])
|
||||||
|
|
Reference in a new issue