从Prolog中删除字符串中的空格

时间:2013-01-16 19:17:22

标签: string parsing prolog whitespace dcg

我在Prolog中编写了解析器。我还没有完成。它是代码的一部分。下一步是杀死字符串中的所有空格。

parse(Source, Tree) :-  kill_whitespace(Source, CleanInput), % remove whitespaces
                        actual_parse(CleanInput, Tree).

actual_parse(CleanInput, Tree):- phrase(expr(Tree),CleanInput).

expr(Ast) --> term(Ast1), expr_(Ast1,Ast).
expr_(Acc,Ast) --> " + ", !, term(Ast2), expr_(plus(Acc,Ast2), Ast).
expr_(Acc,Ast) --> " - ", !, term(Ast2), expr_(minus(Acc,Ast2), Ast).
expr_(Acc,Acc) --> [].

term(Ast) --> factor(Ast1), term_(Ast1,Ast).
term_(Acc,Ast) --> " * ", !, factor(Ast2), term_(mul(Acc,Ast2),Ast).
term_(Acc,Ast) --> " ** ", !, factor(Ast2), term_(pol(Acc,Ast2),Ast).
term_(Acc,Acc) --> [].

factor(Ast) --> "(", !, expr(Ast), ")".
factor(D)--> [X], { X >= 48 , X=<57 , D is X-48 }.
factor(id(N,E)) --> "x", factor(N), ":=", expr(E), ";".

例如:

?- parse("x2:=4",T).
    T = id(2, 4)

真!但是,当我写道:

?- parse("x2 := 4",T).
false.

它也必须是真的,它应该是一个过滤器:kill_whitespace(Source, CleanInput)

不同的解决方案效率低下。 我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

嗯,简单的方法是解析字符串并删除空格/仅使用filter predicate保留非空格。但这需要第二次解析。

另一种解决方法是使用你自己的谓词“获取”字符,
foo --> "a".变为foo --> get("a").,其中get//1类似于:

get(X) --> [X].
get(X) --> whitespace, get(X).

答案 1 :(得分:1)

我通常会在可能出现空间的地方放置一个“跳过”非终端。这种跳过通常会丢弃评论以及任何其他“无趣”的文本。

尽可能简化:

% discard any number of spaces
s --> "" ; " ", s.

我更喜欢短名称,以保持语法清晰。放弃换行等等。

s --> "" ; (" ";"\t";"\n";"\r"), s.

'样式'注释:而不是

parse(Source, Tree) :-
   expr(Tree, Source, []).
你可以考虑

parse(Source, Tree) :-
   phrase(expr(Tree), Source).

答案 2 :(得分:0)

编写解析器的常用方法是分两个阶段编写它:

第一阶段进行词法分析并生成令牌流。此时丢弃空格和其他对解析不重要的“标记”(例如注释)。

第二阶段进行解析本身,检查词法分析器产生的令牌列表。

相关问题