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 に答える