【发布时间】:2021-04-05 17:24:42
【问题描述】:
我正在 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}
【问题讨论】:
标签: parsing prolog grammar dcg