parsing - 如何在 Prolog 中创建与另一个相反的 DCG 规则?
问题描述
我正在 Prolog 中编写 Commodore BASIC 解释器,并且正在编写一些 DCG 来解析它。我已经验证了下面的 DCG 可以工作,除了variable
一个。我的目标是:对于任何不是布尔值、整数、浮点数或字符串的东西,它都是一个变量。但是,我通过它提供的任何东西都会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}
解决方案
您可以像这样检测一串整数(我添加了一个参数来收集数字):
integer([H|T]) --> digit(H), integer(T).
integer([]) --> [].
digit(0) --> "0".
digit(1) --> "1".
...
digit(9) --> "9".
至于variable
- 它需要使用文本,因此您需要类似于integer
上面的内容,但更改digit(H)
为识别作为“变量”一部分的字符的内容。
如果您想要进一步的线索(尽管有时使用稍微高级的技巧):https ://www.swi-prolog.org/pldoc/man?section=basics ,代码在这里:https ://github.com/SWI-Prolog /swipl-devel/blob/master/library/dcg/basics.pl
推荐阅读
- google-apps-script - 使用应用程序脚本将图像插入 Google Doc 时显示无效的图像数据
- r - 点的 R 多边形向量
- python - 是否有等效的 for__getattr__ 来拦截对 python 类的静态属性的访问?
- reactjs - 使用 useMemo 代替 React.memo 语法问题
- loops - 带有隐式游标的过程正在编译但未打印
- neural-network - 我可以使用神经网络对 ivector 进行分类以进行语言识别吗?
- rxjs - vue-rx:如何从数组中观察对象的值不再改变?
- bash - 如何找出在一个单词中重复一个字符超过两次的单词(例如“aa,aaxx”)
- reactjs - 多次使用 useEffect 获取数据
- firebase - Cloud Firestore CollectionReference 查询字段