Skip to content
This repository has been archived by the owner on Jun 1, 2022. It is now read-only.

Commit

Permalink
fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
jonhue committed Dec 22, 2021
1 parent ac8b40a commit 59dd452
Show file tree
Hide file tree
Showing 7 changed files with 292 additions and 192 deletions.
92 changes: 55 additions & 37 deletions common/patterns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,84 +10,101 @@ import {
export const _pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) =>
choice(
$.wildcard_pattern,
$.binding_pattern,
$._assignable_pattern,
$._literal_pattern,
prec(
'base',
choice(
$.wildcard_pattern,
$.binding_pattern,
$._assignable_pattern,
$._literal_pattern,
),
)

export const _assignable_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) =>
choice(
alias($.root_binding_pattern, $.binding_pattern),
$.destructuring_pattern,
$.pattern_group,
prec(
'base',
choice(
alias($.root_binding_pattern, $.binding_pattern),
$.destructuring_pattern,
$.pattern_group,
),
)

export const destructuring_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) =>
seq(
optional(
seq(
field(
'alias',
choice(
alias($.identifier, $.identifier_pattern),
alias($.type, $.type_pattern),
prec(
'base',
seq(
optional(
seq(
field(
'alias',
choice(
alias($.identifier, $.identifier_pattern),
alias($.type, $.type_pattern),
),
),
'@',
),
),
field(
'pattern',
choice(
$.struct_pattern,
$.tuple_pattern,
$.list_pattern,
$.tag_pattern,
),
'@',
),
),
field(
'pattern',
choice($.struct_pattern, $.tuple_pattern, $.list_pattern, $.tag_pattern),
),
)

export const struct_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) =>
buildStruct(
$,
'member',
choice(
$.member_pattern,
alias($.binding_pattern, $.shorthand_member_pattern),
prec(
'base',
buildStruct(
$,
'member',
choice(
$.member_pattern,
alias($.binding_pattern, $.shorthand_member_pattern),
),
true,
),
true,
)

export const member_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) => buildMember($, $._term, $._pattern)
) => prec('base', buildMember($, $._term, $._pattern))

export const tuple_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) => buildTuple($, 'element', $._pattern, true, false)
) => prec('base', buildTuple($, 'element', $._pattern, true, false))

export const list_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) => buildList($, 'element', $._pattern, true)
) => prec('base', buildList($, 'element', $._pattern, true))

export const binding_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) => buildBindingPattern($, true)
) => prec('base', buildBindingPattern($, true))

export const root_binding_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) => choice(buildBindingPattern($, false))
) => prec('base', choice(buildBindingPattern($, false)))

export const wildcard_pattern = () => '_'

export const tag_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) =>
prec(
Prec.Pattern,
'application',
seq(
field('name', alias($._identifier_without_operators, $.identifier)),
field('pattern', $._pattern),
Expand All @@ -96,8 +113,9 @@ export const tag_pattern = <RuleName extends string>(

export const _literal_pattern = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) => choice($.boolean, $.decimal, $.integer, $.raw_string, $.regex)
) =>
prec('base', choice($.boolean, $.decimal, $.integer, $.raw_string, $.regex))

export const pattern_group = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) => seq('(', field('pattern', $._pattern), ')')
) => prec('base', seq('(', field('pattern', $._pattern), ')'))
37 changes: 37 additions & 0 deletions common/precedences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export enum Operator {
Difference = 'Difference',
Equality = 'Equality',
Exponentiation = 'Exponentiation',
Extends = 'Extends',
Implication = 'Implication',
Mod = 'Mod',
Named = 'Named',
Expand Down Expand Up @@ -59,6 +60,32 @@ export enum Prec {
export const precedences = <RuleName extends string>(
$: GrammarSymbols<RuleName>,
) => [
[
$.argument,
Operator.Pipeline,
'access',
'patternOrTerm',
'application',
$.infix_application,
Operator.Not,
Operator.Exponentiation,
Operator.Product,
Operator.Sum,
Operator.Mod,
Operator.Order,
Operator.Equality,
Operator.And,
Operator.Or,
Operator.Difference,
Operator.Implication,
Operator.Biconditional,
Operator.Extends,
Operator.Other,
Operator.Named,
$._section_identifier,
'base',
$.group,
],
// [
// Operator.Access,
// Operator.Pipeline,
Expand Down Expand Up @@ -119,4 +146,14 @@ export const precedences = <RuleName extends string>(

// _term ( ... binding_pattern ) = :: member
// [$.tuple_pattern, $.application],

// { identifier , ... :: struct
[$.struct, $.binding_pattern],

// _term ? _term ... :: conditional
[$.conditional, $.optional_type],

// type = _term :: binding_pattern
[$.binding_pattern, $.infix_application],
[$.binding_pattern, $.application],
]
Loading

0 comments on commit 59dd452

Please sign in to comment.