Я пытаюсь внедрить исчисление лямбда внутри Rascal, но у меня возникают проблемы с получением приоритета и синтаксического анализа, чтобы работать так, как хотелось бы. В настоящее время у меня есть грамматики, которая выглядит примерно так:Анализ и внедрение исчисления лямбда в Rascal
keyword Keywords= "if" | "then" | "else" | "end" | "fun";
lexical Ident = [a-zA-Z] !>> [a-zA-Z]+ !>> [a-zA-Z0-9] \ Keywords;
lexical Natural = [0-9]+ !>> [0-9];
lexical LAYOUT = [\t-\n\r\ ];
layout LAYOUTLIST = LAYOUT* !>> [\t-\n\r\ ];
start syntax Prog = prog: Exp LAYOUTLIST;
syntax Exp =
var: Ident
| nat: Natural
| bracket "(" Exp ")"
> left app: Exp Exp
> right func: "fun" Ident "-\>" Exp
Когда я анализирую программу формы:
(fun x -> fun y -> x) 1 2
Полученное дерево является:
prog(app(
app(
func(
"x",
func(
"y",
var("x")
nat(1),
nat(2))))))
Где на самом деле я Я ищу что-то вроде этого (я думаю):
prog(app(
func(
"x",
app(
func(
"y",
var("x")),
nat(2))),
nat(1)))
Я пробовал ряд вариантов приоритета в грамматике, я пробовал обернуть правило приложения в круглых скобках и ряд других вариантов. Кажется, что-то происходит здесь, я не понимаю. Любая помощь будет оценена по достоинству. Благодарю.
Я думаю, что вы получаете то, что должны получить, и то, что вы считаете нужным, - нет. Лямбда принимает аргумент и возвращает лямбду, которая затем применяется ко второму аргументу. Другими словами, второй применяет работы по результату первого применения, поэтому я ожидал бы, что дерево будет appy (apply (...), 2) – rici