所以我有這樣的語法:前綴解析使用的Prolog
expr(op(T,B,E)) => [term(T), binop(B), expr(E)].
expr(T) => [term(T)].
term(N) => [num(N)].
term(L) => [lvalue(L)].
term(pre(O,L)) => [incrop(O), lvalue(L)].
term(post(L,O)) => [lvalue(L), incrop(O)].
term(E) => ['(', expr(E), ')'].
lvalue($(E)) => [$, expr(E)].
incrop(++) => [++].
incrop(--) => [--].
binop(+) => [+].
binop(-) => [-].
num(0) => [0].
num(1) => [1].
num(2) => [2].
num(3) => [3].
num(4) => [4].
num(5) => [5].
num(6) => [6].
num(7) => [7].
num(8) => [8].
num(9) => [9].
,目標是根據規則來解析輸入,並分離剩餘的後綴。例如,
| ?- parse_prefix(expr(E), [$,1,+,2], S).
E = op($(1),+,2)
S = [] ? ;
E = $(op(1,+,2))
S = [] ? ;
E = $(1)
S = [+,2] ? ;
no
和
| ?- parse_prefix(expr(E), [9], S).
E = 9
S = [] ? ;
no
| ?- parse_prefix(expr(E), [9,+,$,1,+], S).
E = op(9,+,$(1))
S = [+] ? ;
E = 9
S = [+,$,1,+] ? ;
我寫了下面的謂詞:
%Base Case: No Token, No Suffix
parse_prefix(_,[],[]).
%Direct Matching: ex) parse_prefix(num(9),[9],S)
parse_prefix(NT,[Head|Tail],S):-
NT =>[Head],
write('two '),
parse_prefix(expr(E),Tail,S).
%General Matching: ex) parse_prefix(expr(E),_,S)
parse_prefix(NT,[Head|Tail],S):-
NT => [Head1|Tail1],
%write(Head1),
%write('one\n'),
parse_prefix(Head1,[Head|Tail],S).
,我有很多與遞歸和回溯混亂..
我會永遠愛誰可以幫助我這個人。
預先感謝您。
請描述輸出應該是什麼樣子。 –
我想他所描述的「目標是根據規則解析輸入,並分離剩餘的後綴」。是DCG中兩個額外參數的常見行爲。由於他沒有在語法規則中使用cut或some,所以[$,1,+,2]可以用一個空的後綴,即op($(1),+,2)得到兩個完整的解析。和$(op(1,+,2)),正如他典型的要求。 –