diff --git a/lib/parser/recursiveDescentBuffer.ts b/lib/parser/recursiveDescentBuffer.ts index 823977b..4d004ba 100644 --- a/lib/parser/recursiveDescentBuffer.ts +++ b/lib/parser/recursiveDescentBuffer.ts @@ -58,8 +58,4 @@ export class RecursiveDescentBuffer { this.consume() return next } - - peelRemaining (): RecursiveDescentBuffer { - return new RecursiveDescentBuffer(this.buf.slice(this.idx)) - } } diff --git a/lib/parser/typed.ts b/lib/parser/typed.ts index 6446ef4..389370d 100644 --- a/lib/parser/typed.ts +++ b/lib/parser/typed.ts @@ -63,17 +63,6 @@ function parseTypeInternal (rdb: RecursiveDescentBuffer): [string, Type] { } } } -function parseLambdaInternal (rdb: RecursiveDescentBuffer): -[string, TypedLambda] { - rdb.matchCh('λ') - const varLit = rdb.parseVariable() - rdb.matchCh(':') - const [typeLit, ty] = parseTypeInternal(rdb) - rdb.matchCh('.') - const [bodyLit, term] = parseTypedLambdaInternal(rdb.peelRemaining()) - rdb.consumeN(bodyLit.length) - return [`λ${varLit}:${typeLit}.${bodyLit}`, mkTypedAbs(varLit, ty, term)] -} function parseTypedLambdaInternal (rdb: RecursiveDescentBuffer): [string, TypedLambda] { @@ -84,7 +73,16 @@ function parseTypedLambdaInternal (rdb: RecursiveDescentBuffer): let nextTerm: TypedLambda if (rdb.peek() === 'λ') { - const [lambdaLit, lambdaTerm] = parseLambdaInternal(rdb) + rdb.matchCh('λ') + const varLit = rdb.parseVariable() + rdb.matchCh(':') + const [typeLit, ty] = parseTypeInternal(rdb) + rdb.matchCh('.') + const [bodyLit, term] = parseTypedLambdaInternal(rdb) + const [lambdaLit, lambdaTerm] = [ + `λ${varLit}:${typeLit}.${bodyLit}`, + mkTypedAbs(varLit, ty, term) + ] nextTerm = lambdaTerm resultStr += lambdaLit } else { diff --git a/lib/parser/untyped.ts b/lib/parser/untyped.ts index 8e751b8..eebd0e8 100644 --- a/lib/parser/untyped.ts +++ b/lib/parser/untyped.ts @@ -17,9 +17,12 @@ function parseUntypedLambdaInternal (rdb: RecursiveDescentBuffer): let nextTerm: UntypedLambda | undefined if (rdb.peek() === 'λ') { - const [lambdaLit, lambdaTerm] = parseUntypedLambda(rdb) - resultStr += lambdaLit - nextTerm = lambdaTerm + rdb.matchCh('λ') + const varLit = rdb.parseVariable() + rdb.matchCh('.') + const [bodyLit, term] = parseUntypedLambdaInternal(rdb) + resultStr += `λ${varLit}.${bodyLit}` + nextTerm = mkUntypedAbs(varLit, term) } else if (rdb.peek() === '(') { rdb.matchLP() const [lit1, t1] = parseUntypedLambdaInternal(rdb) @@ -49,13 +52,3 @@ function parseUntypedLambdaInternal (rdb: RecursiveDescentBuffer): return [resultStr, resultExpr] } - -function parseUntypedLambda (rdb: RecursiveDescentBuffer): -[string, UntypedLambda] { - rdb.matchCh('λ') - const varLit = rdb.parseVariable() - rdb.matchCh('.') - const [bodyLit, term] = parseLambda(rdb.peelRemaining().buf) - rdb.consumeN(bodyLit.length) - return [`λ${varLit}.${bodyLit}`, mkUntypedAbs(varLit, term)] -}