Parsing (方案)英文单词->;数字

Parsing (方案)英文单词->;数字,parsing,scheme,racket,Parsing,Scheme,Racket,我需要帮助,试图得到一个程序,采取英语单词,并把他们变成数字。我所做的每件事都有上千件(千、百万、十亿………千千万万) 所以我必须使用lexer和parser。 我很确定这与我的解析器函数有关 #lang scheme (define calcp (parser (start start) (end newline EOF) (tokens value-tokens op-tokens) (error (lambda (a b c) (void))) (grammar (start [

我需要帮助,试图得到一个程序,采取英语单词,并把他们变成数字。我所做的每件事都有上千件(千、百万、十亿………千千万万)

所以我必须使用lexer和parser。 我很确定这与我的解析器函数有关

 #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 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)])
)
下面的代码描述了我列出的所有大数字名称

 #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

这是更新后的代码,已完成

(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)])
)
)
)