我正在编写一些序言来确定给定的查询是否与语法匹配。
S → F |T N T |ε
F → 如果 B 则 { S } |如果 B 则 { S } 否则 { S }
B → (T E T)
T → x|y|0
E → > | <
N ⇒ +| - | =
现在我写下我的终端和我的规则。对我来说,这似乎应该有效,但事实并非如此。
t(x).
t(y).
t(0).
e(>).
e(<).
n(+).
n(-).
n(=).
% Non Terminals
s([]).
s([T1, N, T2]) :-
t(T1), n(N), t(T2).
s(S) :-
f(S).
b(['(', T1, E, T2, ')']) :-
t(T1), e(E), t(T2).
f([if, B, then, '{', S, '}']) :-
write(B),
b([B]),
s(S).
f([if, B, then, '{', S, '}', else, '{', S2, '}']):-
b([B]),
s(S),
s(S2).
parse(E1) :-
s(E1).
当我尝试用类似的东西测试它时:
?-parse([if, '(', x, '>', y, ')', then, '{', x, '-', y, '}']).
我得到的是假的而不是真的。 有人可以解释一下并指出我正确的方向吗,谢谢!
将规则转换为 DCG(定句语法)的简单/简单方法:
s --> f.
s --> t, n, t.
s --> [].
f --> [if], b, [then, '{'], s, ['}'].
f --> [if], b, [then, '{'], s, ['}', else, '{'], s, ['}'].
b --> ['('], t, e, t, [')'].
t --> [x] | [y] | [z].
e --> [>] | [<].
n --> [+] | [-] | [=].
注意 DCG 规则定义中使用的是
-->
而不是 :-
。另请注意如何将终端放入规则定义中的显式列表中。
当我加载它并运行你的示例时,我得到:
?- phrase(s, [if, '(', x, '>', y, ')', then, '{', x, '-', y, '}']).
true .
如果你想获得实际的解析树,你必须做的比这更多。