traducción traduccion tema sintetizados sintaxis por heredados dirigida compiladores compilacion automatas atributos compiler-construction roman-numerals translation-scheme

compiler construction - traduccion - Convierte enteros a números romanos usando un esquema de traducción dirigido por la sintaxis



tema v traducción dirigida por la sintaxis (3)

Consideraría el análisis de derecha a izquierda.

Primero, mapearía la columna de unidades:

0 -> '''' 1 -> ''I'' 2 -> ''II'' 3 -> ''III'' 4 -> ''IV'' ... 9 -> ''IX''

Entonces, si hubiera una segunda columna (por ejemplo, una segunda columna de la derecha = decenas), la usaría para mapear a

0 -> '''' 1 -> ''X'' 2 -> ''XX'' ... 9 -> ''XC''

Eso tendría que ser antepuesto a la salida inicial.

Repita para las siguientes columnas (cientos, miles) hasta que se quede sin letras.

Verifique dos veces que el número no sea ''0'' o negativo.

The Dragon Book incluye un ejercicio de conversión de números enteros a números romanos mediante un esquema de traducción dirigido por la sintaxis.

¿Cómo se puede completar esto?


Otra forma es almacenar en matriz bidimensional los números romanos para 1, 5, 10, 50, 100, 500, 1000 y así sucesivamente. Ejemplo (en PHP array):

$roman = array( [0] = array( 1=>"I", 5=>"V", 10=>"X" ), [1] = array( 1=>"X", 5=>"L", 10=>"C" ), [2] = array( 1=>"C", 5=>"D", 10=>"M" ), [3] = array( 1=>"M", 5=>"^V", 10=>"^X" ), );

Luego tome cada dígito de derecha a izquierda y aplique la siguiente traducción. Establezca una variable $ level = 0 y aumente su valor en 1 después de cada dígito procesado:

1 => $roman[$level][1] 2 => $roman[$level][1].$roman[$level][1] 3 => $roman[$level][1].$roman[$level][1].$roman[$level][1] 4 => $roman[$level][1].$roman[$level][5] 5 => $roman[$level][5] 6 => $roman[$level][5].$roman[$level][1] 7 => $roman[$level][5].$roman[$level][1].$roman[$level][1] 8 => $roman[$level][5].$roman[$level][1].$roman[$level][1].$roman[$level][1] 9 => $roman[$level][1].$roman[$level][10]

(en PHP a ''.'' concats dos cadenas)

Ejemplo: 1945

5 => $roman[0][5] = "V" 4 => $roman[1][1].$roman[1][5] = "XL" 9 => $roman[2][1].$roman[2][10] = "CM" 1 => $roman[3][1] = "M"

Entonces, el número traducido es "MCMXLV"

Lo siento, es posible que esto no responda completamente a su pregunta, pero espero que ayude de alguna manera ...


Lo siguiente es gramática para representar la traducción dirigida por sintaxis desde el número en formato 1xxx a números romanos.

number = OneThousand digit3 digit2 digit1 | nzdigit3 digit2 digit1 | nzdigit2 digit1 | nzdigit1

OneThousand -> 1 {print (''M'')}

digit3 -> 0 digit3 -> nzdigit3

nzdigit3 -> 1 print (''C'') nzdigit3 -> 2 print (''CC'') nzdigit3 -> 3 print (''CCC'') nzdigit3 -> 4 print (''CCCC'') nzdigit3 -> 5 print (''D'') nzdigit3 -> 6 print (''DC'') nzdigit3 -> 7 print (''DCC'') nzdigit3 -> 8 print (''DCCC'') nzdigit3 -> 9 print (''DCCCc'')

De manera similar escriba definición para dígitos en posición 2 y 1 y tendrá traducción necesaria.