11

我有以下简单的表达式解析器:

expr(+(T,E))-->term(T),"+",expr(E).
expr(T)-->term(T).

term(*(F,T))-->factor(F),"*",term(T).
term(F)-->factor(F).

factor(N)-->nat(N).
factor(E)-->"(",expr(E),")".

nat(0)-->"0".
nat(1)-->"1".
nat(2)-->"2".
nat(3)-->"3".
nat(4)-->"4".
nat(5)-->"5".
nat(6)-->"6".
nat(7)-->"7".
nat(8)-->"8".
nat(9)-->"9".

但是,这只支持 1 位数字。在这种情况下,如何解析具有多个数字的数字?

4

3 回答 3

10

使用累加器变量,并在递归调用中传递这些变量。下面,A 和 A1 是累加器。

digit(0) --> "0".
digit(1) --> "1".
% ...
digit(9) --> "9".

nat(N)   --> digit(D), nat(D,N).
nat(N,N) --> [].
nat(A,N) --> digit(D), { A1 is A*10 + D }, nat(A1,N).

请注意,第一个nat子句通过使用一个数字来初始化累加器,因为您不想匹配空字符串。

于 2010-07-19T11:54:21.107 回答
-1
nat(0). 
nat(N):-nat(N-1).

但是您使用了我不知道的语法(请参阅我上面的评论)。

于 2010-07-19T11:52:40.297 回答
-3

你能提供一个样本输入吗?

我认为这可能有效:

nat(N)-->number(N).

如果失败尝试:

nat(N)-->number(N),!.

这 !是一个削减它停止统一。您可以在书籍/教程中阅读它。

于 2010-07-19T10:39:51.880 回答