我正在用Prolog编写Commodore BASIC解释器,并编写一些DCG来解析它。除了variable
之外,我已经验证了下面的DCG可以工作。我的目标是:对于不是布尔值、整数、浮点数或字符串的任何东西都是变量。然而,无论我通过phrase
给它什么,都只能得到no
。
bool --> [true].
bool --> [false].
integer --> [1]. % how to match nums?
float --> [0.1].
string --> [Str], {atom_chars(Str, ['"' | Chars]), last(Chars, '"')}.
literal --> bool; integer; float; string.
variable --> \+ literal.
我用
gprolog
跑了这样一个堆栈跟踪。main :- trace, phrase(variable, [bar]).
看着这个,我无法理解为什么variable
会失败,因为它在literal
的每种情况下都失败了。我猜想错误可能很简单,但我仍然感到困惑,所以有谁擅长Prolog能够知道我做错了什么吗?
| ?- main.
The debugger will first creep -- showing everything (trace)
1 1 Call: phrase(variable,[bar]) ?
2 2 Call: variable([bar],_321) ?
3 3 Call: \+literal([bar],_348) ?
4 4 Call: literal([bar],_348) ?
5 5 Call: bool([bar],_348) ?
5 5 Fail: bool([bar],_348) ?
5 5 Call: integer([bar],_348) ?
5 5 Fail: integer([bar],_348) ?
5 5 Call: float([bar],_348) ?
5 5 Fail: float([bar],_348) ?
5 5 Call: string([bar],_348) ?
6 6 Call: atom_chars(bar,['"'|_418]) ?
6 6 Fail: atom_chars(bar,['"'|_418]) ?
5 5 Fail: string([bar],_348) ?
4 4 Fail: literal([bar],_348) ?
3 3 Exit: \+literal([bar],_348) ?
2 2 Exit: variable([bar],[bar]) ?
1 1 Fail: phrase(variable,[bar]) ?
(2 ms) no
{trace}