Skip to content

Commit 82c1df9

Browse files
committed
Use raw identifiers in LALRPOP grammar
1 parent a74f45e commit 82c1df9

File tree

8 files changed

+46
-41
lines changed

8 files changed

+46
-41
lines changed

Cargo.lock

Lines changed: 13 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fathom/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ string-interner = "0.14.0"
3232
termsize = "0.1.6"
3333

3434
[build-dependencies]
35-
lalrpop = "0.19.5"
35+
lalrpop = { git = "https://github.com/kmeakin/lalrpop", branch = "raw-identifiers" }
3636

3737
[dev-dependencies]
3838
diff = "0.1.12"

fathom/src/surface.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ pub struct ItemDef<'arena, Range> {
6868
/// Parameter patterns
6969
patterns: &'arena [(Pattern<Range>, Option<&'arena Term<'arena, Range>>)],
7070
/// An optional type annotation for the defined expression
71-
// FIXME: raw identifiers in LALRPOP grammars https://github.com/lalrpop/lalrpop/issues/613
72-
type_: Option<&'arena Term<'arena, Range>>,
71+
r#type: Option<&'arena Term<'arena, Range>>,
7372
/// The defined expression
7473
expr: &'arena Term<'arena, Range>,
7574
}
@@ -347,8 +346,7 @@ pub enum FormatField<'arena, Range> {
347346
/// Label identifying the field
348347
label: (Range, StringId),
349348
/// Optional type annotation
350-
// FIXME: raw identifiers in LALRPOP grammars https://github.com/lalrpop/lalrpop/issues/613
351-
type_: Option<Term<'arena, Range>>,
349+
r#type: Option<Term<'arena, Range>>,
352350
/// The expression that this field compute
353351
expr: Term<'arena, Range>,
354352
},
@@ -360,8 +358,7 @@ pub struct TypeField<'arena, Range> {
360358
/// Label identifying the field
361359
label: (Range, StringId),
362360
/// The type that is expected for this field
363-
// FIXME: raw identifiers in LALRPOP grammars https://github.com/lalrpop/lalrpop/issues/613
364-
type_: Term<'arena, Range>,
361+
r#type: Term<'arena, Range>,
365362
}
366363

367364
/// A field definition in a record literal

fathom/src/surface/distillation.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
113113
range: (),
114114
label: ((), *label),
115115
patterns: &[],
116-
type_: Some(r#type),
116+
r#type: Some(r#type),
117117
expr,
118118
})
119119
}
@@ -551,7 +551,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
551551
self.push_local(Some(*label));
552552
TypeField {
553553
label: ((), *label), // TODO: range from span
554-
type_: r#type,
554+
r#type,
555555
}
556556
}),
557557
);
@@ -737,7 +737,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
737737

738738
FormatField::Computed {
739739
label: ((), label),
740-
type_: Some(r#type),
740+
r#type: Some(r#type),
741741
expr,
742742
}
743743
}

fathom/src/surface/elaboration.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,9 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
456456
});
457457
}
458458

459-
let filtered_fields = (fields.iter().enumerate())
460-
.filter_map(move |(index, field)| (!duplicate_indices.contains(&index)).then_some(field));
459+
let filtered_fields = (fields.iter().enumerate()).filter_map(move |(index, field)| {
460+
(!duplicate_indices.contains(&index)).then_some(field)
461+
});
461462

462463
(labels.into(), filtered_fields)
463464
}
@@ -614,7 +615,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
614615
match item {
615616
Item::Def(item) => {
616617
let (expr, type_value) =
617-
self.synth_fun_lit(item.range, item.patterns, item.expr, item.type_);
618+
self.synth_fun_lit(item.range, item.patterns, item.expr, item.r#type);
618619
let expr_value = self.eval_env().eval(&expr);
619620
let r#type = self.quote_env().quote(self.scope, &type_value);
620621

@@ -1408,7 +1409,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
14081409
let mut types = SliceVec::new(self.scope, labels.len());
14091410

14101411
for type_field in type_fields {
1411-
let r#type = self.check(&type_field.type_, &universe);
1412+
let r#type = self.check(&type_field.r#type, &universe);
14121413
let type_value = self.eval_env().eval(&r#type);
14131414
self.local_env
14141415
.push_param(Some(type_field.label.1), type_value);
@@ -1889,7 +1890,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
18891890
}
18901891
FormatField::Computed {
18911892
label: (label_range, label),
1892-
type_: r#type,
1893+
r#type,
18931894
expr,
18941895
} => {
18951896
let (expr, r#type, type_value) = match r#type {

fathom/src/surface/elaboration/order.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ fn item_dependencies(
149149
Item::Def(item) => {
150150
let initial_locals_names_len = local_names.len();
151151
push_pattern_deps(item.patterns, item_names, local_names, &mut deps);
152-
if let Some(r#type) = item.type_ {
152+
if let Some(r#type) = item.r#type {
153153
term_deps(r#type, item_names, local_names, &mut deps);
154154
}
155155
term_deps(item.expr, item_names, local_names, &mut deps);
@@ -228,7 +228,7 @@ fn term_deps(
228228
Term::RecordType(_, type_fields) => {
229229
let initial_locals_names_len = local_names.len();
230230
for type_field in *type_fields {
231-
term_deps(&type_field.type_, item_names, local_names, deps);
231+
term_deps(&type_field.r#type, item_names, local_names, deps);
232232
local_names.push(type_field.label.1);
233233
}
234234
local_names.truncate(initial_locals_names_len);
@@ -311,10 +311,10 @@ fn field_deps(
311311
}
312312
FormatField::Computed {
313313
label: (_, label),
314-
type_,
314+
r#type,
315315
expr,
316316
} => {
317-
if let Some(r#type) = type_ {
317+
if let Some(r#type) = r#type {
318318
term_deps(r#type, item_names, local_names, deps);
319319
}
320320
term_deps(expr, item_names, local_names, deps);

fathom/src/surface/grammar.lalrpop

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ pub Module: Module<'arena, ByteRange> = {
7373
};
7474

7575
Item: Item<'arena, ByteRange> = {
76-
<start: @L> "def" <label: RangedName> <patterns: AnnPattern*> <type_: (":" <LetTerm>)?> "=" <expr: Term> ";" <end: @R> => {
76+
<start: @L> "def" <label: RangedName> <patterns: AnnPattern*> <r#type: (":" <LetTerm>)?> "=" <expr: Term> ";" <end: @R> => {
7777
Item::Def(ItemDef {
7878
range: ByteRange::new(file_id, start, end),
7979
label,
8080
patterns: scope.to_scope_from_iter(patterns),
81-
type_: type_.map(|type_| scope.to_scope(type_) as &_),
81+
r#type: r#type.map(|r#type| scope.to_scope(r#type) as &_),
8282
expr: scope.to_scope(expr),
8383
})
8484
},
@@ -99,17 +99,16 @@ Pattern: Pattern<ByteRange> = {
9999

100100
AnnPattern: (Pattern<ByteRange>, Option<&'arena Term<'arena, ByteRange>>) = {
101101
<pattern: Pattern> => (pattern, None),
102-
"(" <pattern: Pattern> ":" <type_: LetTerm> ")" => (pattern, Some(scope.to_scope(type_))),
102+
"(" <pattern: Pattern> ":" <r#type: LetTerm> ")" => (pattern, Some(scope.to_scope(r#type))),
103103
};
104104

105105
pub Term: Term<'arena, ByteRange> = {
106106
LetTerm,
107-
// FIXME: LALRPOP does not accept raw identifiers (see: https://github.com/lalrpop/lalrpop/issues/613)
108-
<start: @L> <expr: LetTerm> ":" <type_: LetTerm> <end: @R> => {
107+
<start: @L> <expr: LetTerm> ":" <r#type: LetTerm> <end: @R> => {
109108
Term::Ann(
110109
ByteRange::new(file_id, start, end),
111110
scope.to_scope(expr),
112-
scope.to_scope(type_),
111+
scope.to_scope(r#type),
113112
)
114113
},
115114
};
@@ -247,13 +246,13 @@ FormatField: FormatField<'arena, ByteRange> = {
247246
<label: RangedName> "<-" <format: Term> <pred: ("where" <Term>)?> => {
248247
FormatField::Format { label, format, pred }
249248
},
250-
"let" <label: RangedName> <type_: (":" <Term>)?> "=" <expr: Term> => {
251-
FormatField::Computed { label, type_, expr }
249+
"let" <label: RangedName> <r#type: (":" <Term>)?> "=" <expr: Term> => {
250+
FormatField::Computed { label, r#type, expr }
252251
},
253252
};
254253

255254
TypeField: TypeField<'arena, ByteRange> = {
256-
<label: RangedName> ":" <type_: Term> => TypeField { label, type_ },
255+
<label: RangedName> ":" <r#type: Term> => TypeField { label, r#type },
257256
};
258257

259258
ExprField: ExprField<'arena, ByteRange> = {

fathom/src/surface/pretty.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
5555
.concat([
5656
self.text("def"),
5757
self.space(),
58-
match item.type_ {
58+
match item.r#type {
5959
None => self.concat([
6060
self.string_id(item.label.1),
6161
self.ann_patterns(item.patterns),
@@ -269,7 +269,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
269269
self.space(),
270270
self.text(":"),
271271
self.space(),
272-
self.term_prec(Prec::Top, &field.type_),
272+
self.term_prec(Prec::Top, &field.r#type),
273273
])
274274
}),
275275
self.text(","),
@@ -392,11 +392,15 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
392392
None => self.nil(),
393393
},
394394
]),
395-
FormatField::Computed { label, type_, expr } => self.concat([
395+
FormatField::Computed {
396+
label,
397+
r#type,
398+
expr,
399+
} => self.concat([
396400
self.text("let"),
397401
self.space(),
398402
self.string_id(label.1),
399-
match type_ {
403+
match r#type {
400404
Some(r#type) => self.concat([
401405
self.space(),
402406
self.text(":"),

0 commit comments

Comments
 (0)