在 Prolog 中解析多位数字
我有以下简单的表达式解析器:
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 位数字。在这种情况下如何解析多位数字?
I have the following simple expression parser:
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".
However this only supports 1-digit numbers. How can I parse numbers with multiple digits in this case?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用累加器变量,并在递归调用中传递这些变量。下面,A和A1是累加器。
请注意,第一个
nat
子句通过使用数字来初始化累加器,因为您不想匹配空字符串。Use accumulator variables, and pass those in recursive calls. In the following, A and A1 are the accumulator.
Note that the first
nat
clause initializes the accumulator by consuming a digit, because you don't want to match the empty string.但你使用了我不知道的语法(请参阅上面我的评论)。
But you use a syntax that I don't know (see my comment above).
您能提供示例输入吗?
我认为这可能有效:
如果失败,请尝试:
!是一个削减,它阻止了统一。您可以在书籍/教程中阅读有关它的内容。
Can you provide a sample input?
I think this might work:
If that fails try:
The ! is a cut it stops the unification. You can read about it in books/tutorials.