【发布时间】:2014-10-25 14:54:17
【问题描述】:
我面临一个问题,即遍历 prolog 环境中使用的 CFG,使其以后序方式遍历。以下是使用的语法 -
list_ast(Ls, AST) :- phrase(expression(AST), Ls).
expression(E) --> term(T), expression_r(T, E).
expression_r(E0, E) --> [+], term(T), expression_r(E0+T, E).
expression_r(E0, E) --> [-], term(T), expression_r(E0-T, E).
expression_r(E, E) --> [].
term(T) --> power(P), term_r(P, T).
term_r(T0, T) --> [*], power(P), term_r(T0*P, T).
term_r(T0, T) --> [/], power(P), term_r(T0/P, T).
term_r(T, T) --> [].
power(P) --> factor(F), power_r(F, P).
power_r(P0, P0^P) --> [^], factor(P1), power_r(P1, P).
power_r(P, P) --> [].
factor(N) --> [N], { number(N) }.
factor(E) --> ['('], expression(E), [')'].
当执行此语法时,会产生以下输出 -
?- list_ast([2,+,4,*,3], X).
X = 2+4*3 .
我如何更改语法以便可以在 POST-ORDER 中遍历它,以接受诸如 - ?- list_ast([2,4,3,*,+], X)。
【问题讨论】:
-
这可能比您预期的要容易。在 post-fix 中,您不必处理运算符优先级,因此您也不必处理括号。您需要一个在遇到运算符时弹出其顶部元素的堆栈。如果您似乎无法使其发挥作用,您至少应该自己尝试解决方案并将其添加到问题中。请参阅:stackoverflow.com/questions/15946926/… 以获取类似问题的解决方案。
标签: prolog dcg postfix-notation