public void Interpretar(CContexto pContexto) { //Si ya no hay elementos que interpretar salimos if (pContexto.Expresion.Length == 0) return; //Verificamos si empieza con nueve if (pContexto.Expresion.StartsWith(Nueve())) { //Agregamos el nuevo por la posicion donde esté 1,10,100 pContexto.Valor += (9 * Factor()); //Eliminamos dos caracteres IX, XC,CM pContexto.Expresion = pContexto.Expresion.Substring(2); } //Verificamos si empieza con Cuatro else if (pContexto.Expresion.StartsWith(Cuatro())) { //Agregamos el nuevo por la posicion donde esté 1,10,100 pContexto.Valor += (4 * Factor()); //Eliminamos dos caracteres pContexto.Expresion = pContexto.Expresion.Substring(2); } //Verificamos si empieza con Cinco else if (pContexto.Expresion.StartsWith(Cinco())) { //Agregamos el nuevo por la posicion donde esté 1,10,100 pContexto.Valor += (5 * Factor()); //Eliminamos dos caracteres pContexto.Expresion = pContexto.Expresion.Substring(1); } //Recorremos las unidades enconctradas I, X, C while (pContexto.Expresion.StartsWith(Unidad())) { pContexto.Valor += (1 * Factor()); pContexto.Expresion = pContexto.Expresion.Substring(1); } }
public static void _Main() { string expresionEvaluar = "MCMXCIX"; CContexto contexto = new CContexto(expresionEvaluar); //Se contruye el arbol de parse //cada clase corresponde a una regla en la gramatica //empezamos por los miles List <CExpresion> Arbol = new List <CExpresion>(); Arbol.Add(new CExpresionMiles()); Arbol.Add(new CExpresionCientos()); Arbol.Add(new CExpresionDecenas()); Arbol.Add(new CExpresionUnidad()); //Interpretamos siguiendo las reglas gramaticales q estan n l arbol foreach (var exp in Arbol) { exp.Interpretar(contexto); } Console.WriteLine("El numero romano {0} es {1} en decimal", expresionEvaluar, contexto.Valor); Console.ReadLine(); }