我在这个语法中遇到了一个左递归的小问题。我试图在Prolog中编写它,但我不知道如何去除左递归。删除DCG中的左递归 - 序言
<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 }.
我写过类似的东西,但它根本不起作用。如何改变它来获得这个程序的工作?
是的,通过改变语法和使用累加器来消除左递归的经典方法。花了我几年时间来跟随你的“这里”链接。 –