Traductor de Pascal a C# Curso de Programación C# Sharp

Lección:

Administración de Archivos


Ejercicio:

Traductor de Pascal a C# 59


Objetivo:

Cree un traductor básico de Pascal a C#. Aceptará programas como:

programa de ejemplo;

Var
i: entero;
máx.: entero;

empezar
writeLn("¿Cuántas veces?");
readLn(máx.);
para i := 1 a max do
writeLn("Hola");
fin.

Los pasos que debes seguir son:
Lee de principio a fin un archivo de texto, cuyo nombre será introducido por el usuario en línea de comandos o de forma interactiva: hasta 2 puntos.

Volcar el contenido a otro archivo de texto, cuyo nombre será el mismo, pero con la extensión ".cs" en lugar de ".pas": hasta 4 puntos.

Reemplace "WriteLn" por "Console.WriteLine", " = "con "==", " := " con "=", comillas simples con comillas dobles, "begin" con "{" y "end;", "end.", "end" (en ese orden) con "}", : hasta 6 puntos.

Reemplace "programa x;" por "clase x {" seguido de "Principal", reemplace "readln(x)" por "x=Convert.ToInt32(Console.RadLine())" ("x" debe ser cualquier otro identificador): hasta 8 puntos.

Elimine "var" y reemplace "x: integer" por "int x" (pero "x" debe ser cualquier otro identificador): hasta 9 puntos. Dar un formato adecuado a "para": hasta 10 puntos.

Cree una fuente de C# compilable a partir de la fuente Pascal anterior y otras similares: hasta 11 puntos.


Código:

using System;
using System.IO;
namespace PascalToCSharp
{
    class Program
    {
        static void Main()
        {
            Console.Write("Enter name file: ");
            string fileName = Console.ReadLine();


            if (File.Exists(fileName))
            {
                StreamReader filePascal = File.OpenText(fileName);
                StreamWriter fileCSharp = File.CreateText(fileName.Substring(0, fileName.Length - 3) + "cs");
                string line;
                do
                {
                    line = filePascal.ReadLine();
                    if (line != null)
                    {
                        line = line.Replace("writeLn", "Console.WriteLine");
                        line = line.Replace(" = ", "==");
                        line = line.Replace(" :=", "=");
                        line = line.Replace("'", "\"");
                        line = line.Replace("begin", "{");
                        line = line.Replace("end;", "}");
                        line = line.Replace("end.", "}");
                        line = line.Replace("end", "}");

                        if ((line.Contains("program ")) &&
                             (line.Substring(line.Length - 1) == ";"))
                        {
                            line = line.Replace("program ", "class ");
                            line = line.Replace(";", "\n{\n static void Main()\n{");
                        }

                        if (line.Contains("readLn("))
                        {
                            line = line.Replace("readLn(", "");
                            line = line.Replace(");", "");
                            line += " = Convert.ToInt32(Console.RadLine());";
                        }

                        line = line.Replace("var", "");
                        if (line.Contains(": integer;"))
                        {
                            line = line.Replace(": integer;", "");
                            line = "int " + line.Trim() + ";";
                        }

                        /* if ((line.Contains("for ")) &&
                            (line.Contains(" to ")) && 
                            (line.Contains(" do ")))
                         {
                             line = line.Replace("for ", "for (");
                             line = line.Replace(" to", "");
                             line = "int " + line.Trim() + ";";
                         }
                 */

                        fileCSharp.WriteLine(line);
                    }
                }
                while (line != null);
                filePascal.Close();
                fileCSharp.Close();
            }
        }
    }
}