首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语法分析器

语法分析器
EN

Stack Overflow用户
提问于 2014-11-18 01:11:23
回答 2查看 201关注 0票数 1

当涉及到prolog时,我是一个非常绿色的人,但本质上,我要做的是实现递归来解析语法规则。我所拥有的似乎在逻辑上是正确的,但显然不是因为我没有得到预期的结果。

下面是我要解析的规则:

代码语言:javascript
复制
S -> X Y Z
X -> a X | a
Y -> b Y | b
Z -> c Y | c

下面是prolog代码:

代码语言:javascript
复制
match(X, [X|T], T).

xs(X0, X):- match(a, X0, X).
xs(X0, X):- xs(X0, X).
ys(X0, X):- match(b, X0, X).
ys(X0, X):- ys(X0, X).
zs(X0, X):- match(c, X0, X).
zs(X0, X):- zs(X0, X).

s(X0, X):- xs(X0, X1), ys(X1, X2), zs(X2, X).

任何帮助,以了解我所做的错事,将不胜感激。

干杯。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-18 08:34:34

也许语法翻译必须完成,比如

代码语言:javascript
复制
xs(X0, X):- match(a, X0, X).
xs(X0, X):- match(a, X0, X1), xs(X1, X).
...

我建议看看DCG必须提供的翻译:

代码语言:javascript
复制
s --> x,y,z.
x --> [a], x | [a].
y --> [b], y | [b].
z --> [c], y | [c].

查阅并列出结果

代码语言:javascript
复制
z(A, C) :-
    (   A=[c|B],
        y(B, C)
    ;   A=[c|C]
    ).

y(A, C) :-
    (   A=[b|B],
        y(B, C)
    ;   A=[b|C]
    ).

x(A, C) :-
    (   A=[a|B],
        x(B, C)
    ;   A=[a|C]
    ).

s(A, D) :-
    x(A, B),
    y(B, C),
    z(C, D).
票数 1
EN

Stack Overflow用户

发布于 2014-11-18 02:25:30

在每个XS、YS、ZS方法中,递归调用时都需要再次调用match。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26984952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档