【发布时间】:2020-12-18 15:38:59
【问题描述】:
我对 Prolog 作为解析器很好奇,所以我正在做一个小的 Lisp 前端。我已经做了一个分词器,你可以在这里看到:
base_tokenize([], Buffer, [Buffer]).
base_tokenize([Char | Chars], Buffer, Tokens) :-
(Char = '(' ; Char = ')') ->
base_tokenize(Chars, '', Tail_Tokens),
Tokens = [Buffer, Char | Tail_Tokens];
Char = ' ' ->
base_tokenize(Chars, '', Tail_Tokens),
Tokens = [Buffer | Tail_Tokens];
atom_concat(Buffer, Char, New_Buffer),
base_tokenize(Chars, New_Buffer, Tokens).
filter_empty_blank([], []).
filter_empty_blank([Head | Tail], Result) :-
filter_empty_blank(Tail, Tail_Result),
((Head = [] ; Head = '') ->
Result = Tail_Result;
Result = [Head | Tail_Result]).
tokenize(Expr, Tokens) :-
atom_chars(Expr, Chars),
base_tokenize(Chars, '', Dirty_Tokens),
filter_empty_blank(Dirty_Tokens, Tokens).
我现在有一个新的挑战:从这里构造一个解析树。首先,我试着做一个没有语法的,但结果真的很乱。所以我正在使用DCG。 it 上的维基百科页面不是很清楚 - 尤其是 Parsing with DCGs 部分。也许有人可以让我更清楚地了解如何构建一棵树?我很高兴知道 Prolog 的列表是无类型的,所以现在不需要 sum 类型就容易多了。我只是对 sentence(s(NP,VP)) 或 verb(v(eats))(在 Wiki 上)等语法子句的输入感到非常困惑,为什么这些参数有如此深奥的名称,以及我如何能够轻松地开始使用我的解析器。
expr --> [foo].
expr --> list.
seq --> expr, seq.
seq --> expr.
list --> ['('], seq, [')'].
【问题讨论】:
-
一个不错的 dcg 介绍,metalevel.at/prolog/dcg。它有一个很好的树构造示例。
-
是的,维基百科页面不像习惯那样优秀。
标签: parsing prolog grammar dcg parse-tree