在 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] },
...
我在 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] },
...