我需要帮助尝试获取一个程序,该程序需要英语单词并将它们放入数字中。我已经完成了数以千计(千万,百万,十亿......警戒)的所有事情。
所以我必须使用词法分析器和解析器。 我很确定它与我的解析器功能有关。
#lang scheme
(define calcp
(parser
(start start)
(end newline EOF)
(tokens value-tokens op-tokens)
(error (lambda (a b c) (void)))
(grammar
(start [() #f]
;; If there is an error, ignore everything before the error
;; and try to start over right after the error
[(error start) $2]
[(S) $1])
(S [(zero) $1]
[(L) $1])
(zero [(ZERO) 0])
(L [(T) $1]
[(T D) (expt 10 (thousands-number $1))]
[(T D L) $1])
(T [(H) $1]
[(A HUNDRED H) (+ (* $1 100) $3)]
[(A HUNDRED) (* $1 100)])
(H [(B) $1]
[(C) $1]
[(C B) (+ $1 $2)])
(A [(UNDERTEN) (undertwenty-number $1)])
(B [(UNDERTWENTY) (undertwenty-number $1)]
[(A) $1])
(C [(TENS) (tens-number $1)])
(D [(THOUSANDS) (thousands-number $1)])
)
) )
在这个解析器计算器中,L是我定义的语法的一部分。 在这种情况下,L-> T | TD | TDL。 D是我的千万功能。
下一个代码描述了我所有大数字名称的列表。
#lang scheme
(define (thousands-number name)
(cadr
(assoc
name
'((thousand 3) (million 6) (billion 9) (trillion 12) (quadrillion 15) (quintillion 18) (sextillion 21) (septillion 24) (octillion 27) (nonillion 30) (decillion 33) (undecillion 36) (duodecillion 39)
(tredecillion 42) (quattuordecillion 45) (quindecillion 48) (sexdecillion 51) (septendecillion 54) (octodecillion 57) (novemdecillion 60) (vigintillion 63)))))
我在这里尝试做的是使用指数函数作为具有许多零的数字,因为我不觉得难以编码大量的10 ^ 33甚至10 ^ 63个零。 我可能在解析器中搞砸了expt函数本身,所以我希望有人可以帮我解决这个问题。
输入:“两个五十四亿二千亿九十二亿八十亿一亿七千六百万六十四万十二”应该输出:2432902008176640012。但是我的输出是176。
答案 0 :(得分:0)
以下是更新后的代码,已完成:
(S [(zero) $1]
[(L) $1])
(zero [(ZERO) 0])
** (L [(T) $1]
[(T D) (* (expt 10 $2) $1)]
[(T D L) (+ (* (expt 10 $2) $1) $3) ]) **
(T [(H) $1]
[(A HUNDRED H) (+ (* $1 100) $3)]
[(A HUNDRED) (* $1 100)])
(H [(B) $1]
[(C) $1]
[(C B) (+ $1 $2)])
(A [(UNDERTEN) (undertwenty-number $1)])
(B [(UNDERTWENTY) (undertwenty-number $1)]
[(A) $1])
(C [(TENS) (tens-number $1)])
(D [(THOUSANDS) (thousands-number $1)])
)
)
)