;;; Mode: LISP; Base: 10 ;;;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;;; ;;; Fichero: Numeros.gra ;;; ;;; Version: 2.0 ;;; ;;; Autor: Irene Rodriguez ;;; para Rank Xerox Espa¤ola. ;;; ;;; Fecha: 31-ENE-89 ;;; ;;; Contenido: ;;; Esta gramatica es una segundaa implementacion para traducir numeros ;;; escritos en letras en numeros escritos en digitos. ;;; ;;; Se han implementado los numeros del 0 al 999.999.999.999. ;;; ;;; La implementacion de BILLONES es relativamente sencilla, en funcion ;;; de los MILLONES (es homologo a la implementacion de MILLONES en funcion ;;; de MILES). ;;; ;;; Un numero puede ser simple o compuesto. Los numeros simples son ;;; aquellos que estan escritos en una sola palabra y los compuestos son ;;; los que se escriben combinando varias palabras simples. ;;; ;;; Se ha utilizado el separador "!!" para indicar que si una equiparacion ;;; es correcta no se continua el proceso por esa rama. ;;; ;;; Por esta razon es muy importante el orden de los consecuentes. ;;; ;;; Siempre sera del mas complejo al mas simple. ;;; ;;; Por ultimo, queda indicar que la utilizacion de (%f ...) tiene ;;; argumentos que no permiten equiparacion con variables, ;;; solo admite simbolos terminales o no terminales. ;;; ;;; ;;; ;;; Revision: (nombre y fecha). ;;; ;;; moisés 24-1-2001 Adaptarlo para los números en inglés y para números negativos ;;;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -> ( (&i (%f - !num) (minus !! %dash) (!num := ( !! ))) !! ( !! ) ) -> ( !! !! ) -> ( ; [1.000.000-999.999.999] \ {1.000.000, 2.000.000, ... 999.999.000.000} &i (%f + (!part-mill !part-sum )) (!part-mill := ()) ? (!part-sum := ()) ) -> ( ; [1.000.000-999.999.000.000] &i (%f * (!part-multip !millon)) (!part-multip:= ()) ? (!millon := ()) ) -> ( !! !! ) -> ( ; [1000-999.9999] \ {1000, 2000, ... 999.000} &i (%f + (!part-millar !part-centenas)) (!part-millar := ()) ? (!part-centenas := ()) ) ->( ; {1000, 2000 ... 999000} (&i (%f * (!part-mult !mil)) (!part-mult := ()) ? (!mil := ())) ) -> ( !! !! ) -> ( ; [100-999] \ {100, 200, ... 900} &i (%f + (!part-cent !part-decim)) (!part-cent := ()) (!part-decim := ()) ) -> ( ; {100, 200 ... 900} &i (%f * (!part-cent !cien)) (!part-cent := ) (!cien := ) ) -> ( !! !! !! ) -> ( ; [20-99] \ {20, 30, ... 90} &i (%f + (!part-dec !part-uni)) (!part-dec := ()) (!part-uni := ( !! )) ) -> ( ; {20, 30, ... 90} !! !! !! !! !! !! !! ) -> ( ; [10-19] !! !! !! !! !! !! !! !! !! ) -> ( ; [1-9] !! !! !! !! !! !! !! !! ) -> (&i 0 zero) -> (&i 1 (one !! a)) -> (&i 2 two) -> (&i 3 three) -> (&i 4 four) -> (&i 5 five) -> (&i 6 six) -> (&i 7 seven) -> (&i 8 eight) -> (&i 9 nine) -> (&i 10 ten) -> (&i 11 eleven) -> (&i 12 twelve) -> (&i 13 thirteen) -> (&i 14 fourteen) -> (&i 15 fifteen) -> (&i 16 sixteen) -> (&i 17 seventeen) -> (&i 18 eighteen) -> (&i 19 nineteen) -> (&i 20 twenty) -> (&i 30 thirty) -> (&i 40 forty) -> (&i 50 fifty) -> (&i 60 sixty) -> (&i 70 seventy) -> (&i 80 eighty) -> (&i 90 ninety) -> (&i 100 hundred) -> (&i 1000 (thousand !! kilo !! k)) -> (&i 1000000 (million !! mega !! M)) -> (%dash) -> (? and ?) ; -> (!num := ) ;() => (msg !num)