Skip to content

Commit becdd22

Browse files
authored
Merge pull request #8 from Deric-W/grammar
refactor grammar
2 parents da21165 + 5ba1d6a commit becdd22

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

src/lambda_repl/grammar.lark

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ VARIABLE: /[^\s().λ\\]+/
44

55
abstraction: ("\\" | "λ") VARIABLE "." term
66

7-
application: ( abstraction | VARIABLE | brackets ) ( _WHITESPACE ( abstraction | VARIABLE | brackets ) )+
7+
application: _application_term _WHITESPACE (abstraction | _simple_term)
88

9-
?brackets: "(" term ")"
9+
?term: abstraction | _application_term
1010

11-
?term: abstraction | application | VARIABLE | brackets
11+
_application_term: application | _simple_term
12+
13+
_simple_term: VARIABLE | "(" term ")"

src/lambda_repl/parsing.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from __future__ import annotations
66
from collections import deque
7-
from collections.abc import Iterator, Sequence
7+
from collections.abc import Iterator
88
from itertools import chain
99
from lambda_calculus.terms import Abstraction, Application, Term, Variable
1010
from lark import Lark, Token
@@ -63,6 +63,10 @@ def __default__(self, data: object, children: object, meta: object) -> Term[str]
6363
"""handle unknown nodes"""
6464
raise UnexpectedInput(f"unknown node: {data}")
6565

66+
def __default_token__(self, token: Token) -> Token:
67+
"""handle unknown tokens"""
68+
raise UnexpectedInput(f"unknown token: {token}")
69+
6670
def VARIABLE(self, name: Token) -> Variable[str]:
6771
"""transform a variable node"""
6872
return Variable(name.value)
@@ -72,9 +76,10 @@ def abstraction(self, variable: Variable[str], body: Term[str]) -> Abstraction[s
7276
"""transform an abstraction"""
7377
return Abstraction(variable.name, body)
7478

75-
def application(self, children: Sequence[Term[str]]) -> Application[str]:
79+
@v_args(inline=True)
80+
def application(self, abstraction: Term[str], argument: Term[str]) -> Application[str]:
7681
"""transform an application"""
77-
return Application.with_arguments(children[0], children[1:])
82+
return Application(abstraction, argument)
7883

7984

8085
PARSER = Lark.open_from_package(

tests/test_parsing.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ def test_abstraction(self) -> None:
7373
.apply_to(Variable("b"), Variable("c"))
7474
.abstract("a", "b")
7575
)
76+
self.assertEqual(
77+
self.transformer.transform_string("a λa.a b c"),
78+
Variable("a").apply_to(Variable("a").apply_to(Variable("b"), Variable("c")).abstract("a"))
79+
)
7680

7781
def test_brackets(self) -> None:
7882
"""test bracket parsing"""

0 commit comments

Comments
 (0)