2016-03-03 30 views
0

我需要帮助,试图获得一个需要英文单词并将其放入数字的程序。我已经做了所有事情,达到数千(千,百万,亿..... vigintillion)。(SCHEME)英文单词 - >编号

所以我必须使用词法分析器和解析器。 我很确定它与我的解析器功能有关。

#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函数搞砸了,所以我希望有人能帮我解决这个问题。

输入:“两百万的三次432万亿9020000亿8个十亿176640000十二条”应输出:2432902008176640012.

但是我的输出是176。

回答

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