【问题标题】:(SCHEME) english words -> numbers(SCHEME) 英文单词 -> 数字
【发布时间】:2016-03-03 23:16:31
【问题描述】:

我需要帮助来尝试获取一个将英语单词转换为数字的程序。我所做的一切都达到了数千(千,百万,十亿...... vigintillion)。

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

 #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。

【问题讨论】:

    标签: parsing scheme racket


    【解决方案1】:

    这是更新后的代码,完成

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多