Skip to content

Commit fb72033

Browse files
authored
Merge pull request #437 from Kmeakin/lalrpop-raw-identifiers
Use raw identifiers in LALRPOP grammar
2 parents a49dfd5 + 82c1df9 commit fb72033

File tree

8 files changed

+43
-39
lines changed

8 files changed

+43
-39
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
@@ -108,7 +108,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
108108
range: (),
109109
label: ((), *label),
110110
patterns: &[],
111-
type_: Some(r#type),
111+
r#type: Some(r#type),
112112
expr,
113113
})
114114
}
@@ -546,7 +546,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
546546
self.push_local(Some(*label));
547547
TypeField {
548548
label: ((), *label), // TODO: range from span
549-
type_: r#type,
549+
r#type,
550550
}
551551
}),
552552
);
@@ -732,7 +732,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
732732

733733
FormatField::Computed {
734734
label: ((), label),
735-
type_: Some(r#type),
735+
r#type: Some(r#type),
736736
expr,
737737
}
738738
}

fathom/src/surface/elaboration.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
615615
match item {
616616
Item::Def(item) => {
617617
let (expr, type_value) =
618-
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);
619619
let expr_value = self.eval_env().eval(&expr);
620620
let r#type = self.quote_env().quote(self.scope, &type_value);
621621

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

14111411
for type_field in type_fields {
1412-
let r#type = self.check(&type_field.type_, &universe);
1412+
let r#type = self.check(&type_field.r#type, &universe);
14131413
let type_value = self.eval_env().eval(&r#type);
14141414
self.local_env
14151415
.push_param(Some(type_field.label.1), type_value);
@@ -1890,7 +1890,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
18901890
}
18911891
FormatField::Computed {
18921892
label: (label_range, label),
1893-
type_: r#type,
1893+
r#type,
18941894
expr,
18951895
} => {
18961896
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)