Convertidor De Pascal A C#

Este programa es un traductor básico de Pascal a C#. Acepta un archivo fuente de Pascal y lo convierte en un programa equivalente en C#. El programa lee un archivo Pascal proporcionado por el usuario (ya sea mediante la línea de comandos o de forma interactiva), procesa el contenido y genera un archivo fuente de C# con los cambios de sintaxis adecuados. En concreto, el programa:

- Reemplaza las palabras clave específicas de Pascal, como WriteLn, readLn, begin y end, por sus equivalentes en C#.
- Traduce la estructura del programa, las declaraciones de variables y los bucles para que sea compatible con C#.
- Crea un código fuente de C# totalmente compilable a partir de un archivo fuente de Pascal.



Grupo

Manejo de archivos en C#

Objectivo

1. El usuario introducirá el nombre del archivo Pascal que se traducirá.
2. El programa leerá el archivo Pascal y generará su contenido en un nuevo archivo con la extensión .cs.
3. El programa reemplazará las palabras clave específicas de Pascal con sus equivalentes en C#, como:

- WriteLn -> Console.WriteLine
- := -> =
- begin -> {
- end -> }
- program x; -> class x { seguido del método Main.
- readLn(x) -> x = Convert.ToInt32(Console.ReadLine()).

4. Se eliminará la palabra clave var y se reemplazarán las declaraciones de tipo, como entero, por int.
5. El archivo C# resultante debe tener el formato correcto y ser compilable.

Crear un traductor básico de Pascal a C#.

Ejemplo de ejercicio en C#

 Copiar código C#
using System;
using System.IO;

class PascalToCSharpTranslator
{
    // Method to translate the Pascal code to C#
    public void Translate(string inputFileName)
    {
        // Output file name by changing ".pas" to ".cs"
        string outputFileName = Path.ChangeExtension(inputFileName, ".cs");

        // Read the entire content of the Pascal file
        string[] pascalCode = File.ReadAllLines(inputFileName);
        using (StreamWriter writer = new StreamWriter(outputFileName))
        {
            bool isFirstLine = true;

            // Process each line of the Pascal code
            foreach (string line in pascalCode)
            {
                string translatedLine = line;

                // Replace Pascal specific keywords with C# equivalents
                translatedLine = translatedLine.Replace("WriteLn", "Console.WriteLine");
                translatedLine = translatedLine.Replace(":=", "=");
                translatedLine = translatedLine.Replace("'", "\"");
                translatedLine = translatedLine.Replace("begin", "{");
                translatedLine = translatedLine.Replace("end;", "}");
                translatedLine = translatedLine.Replace("end.", "}");

                // Replace program declaration with C# class
                if (translatedLine.StartsWith("program"))
                {
                    translatedLine = translatedLine.Replace("program", "class") + " {";
                    writer.WriteLine("using System;");
                    writer.WriteLine("\nclass Program\n{");
                    writer.WriteLine("    static void Main(string[] args)\n    {");
                }

                // Replace readLn with C# equivalent
                if (translatedLine.Contains("readLn"))
                {
                    int startIdx = translatedLine.IndexOf("readLn") + 7; // skip "readLn"
                    string varName = translatedLine.Substring(startIdx).Trim('(', ')');
                    translatedLine = $"{varName} = Convert.ToInt32(Console.ReadLine());";
                }

                // Remove the "var" declaration and replace types with C#
                if (translatedLine.Contains(": integer"))
                {
                    translatedLine = translatedLine.Replace(": integer", "int");
                }

                // Properly format the "for" loop
                if (translatedLine.Contains("for"))
                {
                    translatedLine = translatedLine.Replace("for", "for") + " {";
                }

                // If it's the first line, don't add a newline yet
                if (!isFirstLine)
                    writer.WriteLine(translatedLine);
                else
                    isFirstLine = false;
            }

            // Close the C# class structure
            writer.WriteLine("    }\n}");
        }

        Console.WriteLine("Translation completed! The output file is: " + outputFileName);
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Ask the user for the Pascal file name
        Console.WriteLine("Enter the Pascal file name (with .pas extension): ");
        string inputFileName = Console.ReadLine();

        // Create an instance of the translator
        PascalToCSharpTranslator translator = new PascalToCSharpTranslator();

        // Translate the Pascal code to C#
        translator.Translate(inputFileName);
    }
}

 Output

// Assume the Pascal code example.pas contains:
program example;

var
i: integer;
max: integer;

begin
writeLn("How many times?");
readLn(max);
for i := 1 to max do
writeLn("Hola");
end.

//After running the program, the output in the example.cs file will be:
using System;

class Program
{
    static void Main(string[] args)
    {
        int i;
        int max;

        Console.WriteLine("How many times?");
        max = Convert.ToInt32(Console.ReadLine());

        for (i = 1; i <= max; i++)
        {
            Console.WriteLine("Hola");
        }
    }
}

Comparte este ejercicio de C#

Practica más ejercicios C# de Manejo de archivos en C#

¡Explora nuestro conjunto de ejercicios de práctica de C#! Diseñados específicamente para principiantes, estos ejercicios te ayudarán a desarrollar una sólida comprensión de los fundamentos de C#. Desde variables y tipos de datos hasta estructuras de control y funciones simples, cada ejercicio está diseñado para desafiarte gradualmente a medida que adquieres confianza en la programación en C#..