【问题标题】:writing a parser in prolog在 prolog 中编写解析器
【发布时间】:2014-11-16 00:32:56
【问题描述】:

语法如下:

<S>-><X><Y><Z>
<X>->a<X>|a
<Y>->b<Y>|b
<Z>->c<Z>|c

我需要用这个语法写一个解析器。

当测试 S([a,a,b,c,c,c],[])。 它应该返回 true。 在我的代码中,我定义了匹配规则来检查列表元素。


match(H,[H|T],T).
na(X0,X1):-match(a,X0,X2). 
nb(X0,X1):-match(b,X0,X2). 
nc(X0,X1):-match(c,X0,X2).
ns(X0,X1):-na(X0,X2),nb(X2,X3),nc(X3,X1).

这段代码有什么问题?它给出了真实的但是当你追踪时。它不起作用。

【问题讨论】:

标签: parsing prolog context-free-grammar dcg


【解决方案1】:
:- set_prolog_flag(double_quotes, chars).

s --> x, y, z.
x --> "a",x|"a".
y --> "b",y|"b".
z --> "c",z|"c".

在这里,按长度排序:

?- length(Xs,N),phrase(s, Xs).
Xs = [a, b, c],
N = 3 ;
Xs = [a, a, b, c],
N = 4 ;
Xs = [a, b, b, c],
N = 4 ;
Xs = [a, b, c, c],
N = 4 ;
Xs = [a, a, a, b, c],
N = 5 ;
Xs = [a, a, b, b, 

【讨论】:

  • 你能解释一下这对我有什么帮助吗?我要为 set_prolog_flag 定义一个规则吗?
  • @user127518:只需将文本复制粘贴到文件中,然后查阅[file].
  • 我现在明白了,是的,它正在工作。我不是那么简单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多