prolog - 在 Prolog 中解析多位数的数字

标签 prolog grammar dcg

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

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 位数字。在这种情况下,如何解析多位数的数字?

最佳答案

使用累加器变量,并在递归调用中传递这些变量。下面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子句通过使用一个数字来初始化累加器,因为您不想匹配空字符串。

关于prolog - 在 Prolog 中解析多位数的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3279822/

相关文章:

Prolog 解析树生成失败

IPv4地址的Prolog定语从句语法程序

string - 检测prolog中字符串的所有k个长度的单词

prolog - 设置gui元素的大小和位置

序言统一决议

prolog - Prolog 中的谓词逻辑是如何表示的?

token - 无法为非组合语法中的字符串文字创建隐式标记

string - Prolog获取字符串的头部和尾部

regex - Raku:捕获标记的效果丢失 "higher up"

javaCC 插入不需要的语句