在 Prolog 中解析字符串文字

Parsing string literals in Prolog

我在 Prolog 中使用定子句语法解析字符串文字,但此语法规则只能解析包含字母字符的字符串文字:

string_literal(S) --> "\"", symbol(S), "\"".
symbol([L|Ls]) --> letter(L), symbol_r(Ls).
symbol_r([L|Ls]) --> letter(L), symbol_r(Ls).
symbol_r([])     --> [].
letter(Let)     --> [Let], { code_type(Let, alpha) }.

是否可以编写一个可以用其他类型的符号解析字符串文字的 DCG 规则?

在 SWI-Prolog 中,库 (dcg/basics) 有几个随时可用的非终端。代码值得研究...

否则,为了概括一点,您可以将代码类型传递给匹配项,然后随意组合原语:

char(Type, C) --> [C], { code_type(C, Type) }.

letter(L) --> char(alpha, L).
digit(D) --> char(digit, D).
lower_or_num(C) --> char(lower, C) | digit(C).
...

一种可能性,可以跳过不需要的字符(仅换行符或单引号)

string_literal(S) --> "\"", string_inner(S).

string_inner([]) --> "\"".
string_inner(Cs) --> [C],
    { ( C == 0'\n ; C == 0'' ) -> Cs = Rs ; Cs = [C|Rs] },
    string_inner(Rs).

编辑

prevent it from matching strings that contain double quotes

如果我们省略 else 分支,构造 if -> then ; else 将失败,并且 if 为假,因此尝试可以是:

...
{ ( C == 0'\n ; C == 0'' ) -> Cs = Rs ; C \== 0'" -> Cs = [C|Rs] },
...