Skip to content

Commit f6d3afd

Browse files
author
Rick Button
committed
Improved pair parsing
1 parent fa1e338 commit f6d3afd

2 files changed

Lines changed: 12 additions & 13 deletions

File tree

src/Scheme.NET/Parser/Visitors/SchemeVisitor.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,27 @@ public override object VisitIdentifier([NotNull] SchemeParser.IdentifierContext
3737

3838
public override object VisitList([NotNull] SchemeParser.ListContext context)
3939
{
40-
var elements = context.datumOrPair();
40+
var elements = context.datum();
4141

4242
return CreateList(elements);
4343
}
4444

45-
private object CreateList(SchemeParser.DatumOrPairContext[] elements)
45+
public override object VisitPair([NotNull] SchemeParser.PairContext context)
46+
{
47+
var elements = context.datum();
48+
return CreatePair(elements);
49+
}
50+
51+
private object CreateList(SchemeParser.DatumContext[] elements)
4652
{
4753
if (elements.Length == 0)
4854
return AtomHelper.Nil;
4955

50-
if (elements.First().datum() == null)
51-
return CreatePair(elements.First().pair());
52-
5356
return AtomHelper.CreateCons((ISExpression)Visit(elements.First()), (ISExpression)CreateList(elements.Skip(1).ToArray()));
5457
}
5558

56-
private object CreatePair(SchemeParser.PairContext context)
59+
private object CreatePair(SchemeParser.DatumContext[] elements)
5760
{
58-
var elements = context.datum().ToArray();
5961
return AtomHelper.CreateCons((ISExpression)Visit(elements[0]), (ISExpression)Visit(elements[1]));
6062
}
6163

src/Scheme.NET/Scheme.g4

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ options {
99

1010
// Parser rules
1111

12-
datumOrPair : pair
13-
| datum;
14-
15-
1612
datum : simpleDatum
1713
| compoundDatum
1814
;
@@ -25,14 +21,15 @@ simpleDatum : bool
2521
;
2622

2723
compoundDatum : list
24+
| pair
2825
| vector
2926
| quote
3027
| abbreviation
3128
;
3229

33-
list : '(' datumOrPair* ')';
30+
list : '(' datum* ')';
3431

35-
pair : datum '.' datum;
32+
pair : '(' datum '.' datum ')';
3633

3734
bool : TRUE # True
3835
| FALSE # False

0 commit comments

Comments
 (0)