Ich habe ein kleines Problem mit der linken Rekursion in dieser Grammatik. Ich versuche es in Prolog zu schreiben, aber ich weiß nicht, wie ich die linke Rekursion entfernen kann.Entfernen der linken Rekursion in DCG - Prolog
<expression> -> <simple_expression>
<simple_expression> -> <simple_expression> <binary_operator> <simple_expression>
<simple_expression> -> <function>
<function> -> <function> <atom>
<function> -> <atom>
<atom> -> <number> | <variable>
<binary_operator> -> + | - | * |/
expression(Expr) --> simple_expression(SExpr), { Expr = SExpr }.
simple_expression(SExpr) --> simple_expression(SExpr1), binary_operator(Op), simple_expression(SExpr2), { SExpr =.. [Op, SExpr1, SExpr2] }.
simple_expression(SExpr) --> function(Func), { SExpr = Func }.
function(Func) --> function(Func2), atom(At), { Func = [Func2, atom(At)] }.
function(Func) --> atom(At), { Func = At }.
Ich habe so etwas geschrieben, aber es wird überhaupt nicht funktionieren. Wie kann ich es ändern, damit dieses Programm funktioniert?
Yeah, klassischer Ansatz zur Beseitigung der linken Rekursion durch Änderung der Grammatik und Verwendung eines Akkumulators. Ich habe ein paar Jahre gebraucht, um Ihrem "hier" -Link zu folgen. –