Skip to content

Instantly share code, notes, and snippets.

@fersilva16
Last active May 30, 2022 11:29
Show Gist options
  • Save fersilva16/562b879c2cae37e0d27fe82f5f180476 to your computer and use it in GitHub Desktop.
Save fersilva16/562b879c2cae37e0d27fe82f5f180476 to your computer and use it in GitHub Desktop.
Lambda Calculus LR parser

Hoje imagino que os steps do LR parser serão desta maneira:

Action Stack Remaining
Shift ( λx.λy.x y) z
Shift x.λy.x y) z
Shift (λx .λy.x y) z
Shift (λx. λy.x y) z
Shift (λx.λ y.x y) z
Shift (λx.λy .x y) z
Shift (λx.λy. x y) z
Shift (λx.λy.x y) z
Reduce (λx.λy.<Var x>  y) z
Reduce (λx.<Abs y (Var x)>  y) z
Reduce (<Abs x (Abs y (Var x))>  y) z
Shift (<Abs x (Abs y (Var x))>  y) z
Shift (<Abs x (Abs y (Var x))> y ) z
Reduce (<Abs x (Abs y (Var x))> <Var y> ) z
Reduce (<App (Abs x (Abs y (Var x))) (Var y)> ) z
Shift (<App (Abs x (Abs y (Var x))) (Var y)>)  z
Reduce <App (Abs x (Abs y (Var x))) (Var y)>  z
Shift <App (Abs x (Abs y (Var x))) (Var y)>  z
Reduce <(App (Abs x (Abs y (Var x))) (Var y))> <Var z>
Reduce <App (App (Abs x (Abs y (Var x))) (Var y)) (Var z)>

O que ainda está confuso para mim é os detalhes da implementação, como eu faria para determinar a ordem de precedencia dessas expressões?

Cheguei a pesquisar um pouco e vi que teria que fazer um parser de precedência de operadores (um LR parser com lookahead de 1, ou LR(1)) pelo que entendi, mas não tenho certeza. https://en.wikipedia.org/wiki/Operator-precedence_parser

Não tenho certeza como fazer um parser desses, me pergunto o que ele faria em casos como (λx.λy.x, se existiria lookahead até achar y ou ), reduziria o y primeiro antes de reduzir a Application (<Var x> <Var y>) e etc.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment