Finally got all the stuff to parse

This commit is contained in:
James Harton 2018-09-10 19:39:19 +12:00
parent bea8e5a92b
commit 0429141baf
4 changed files with 65 additions and 27 deletions

View file

@ -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 ~ ">" }

View file

@ -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)
])
])
])
]
) )
} }

View file

@ -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)
])
])
])
] ]
) )
} }

View file

@ -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)
]) ])