Ejercicio
Traductor de Pascal a C#
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 de Ejemplo
// Importing necessary namespaces for basic operations
using System; // For basic Console operations
using System.IO; // For file handling
using System.Text.RegularExpressions; // For using regular expressions
public class PascalToCSharpTranslator
{
// Method to translate Pascal code to C# code
public static string TranslatePascalToCSharp(string pascalCode)
{
// Replacing "WriteLn" with "Console.WriteLine"
pascalCode = pascalCode.Replace("WriteLn", "Console.WriteLine");
// Replacing " = " with "=="
pascalCode = pascalCode.Replace(" = ", "==");
// Replacing " := " with "="
pascalCode = pascalCode.Replace(" := ", "=");
// Replacing single quotes with double quotes
pascalCode = pascalCode.Replace("'", "\"");
// Replacing "begin" with "{"
pascalCode = pascalCode.Replace("begin", "{");
// Replacing "end;" and "end." with "}"
pascalCode = pascalCode.Replace("end;", "}");
pascalCode = pascalCode.Replace("end.", "}");
// Replacing "program x;" with "class x {"
pascalCode = Regex.Replace(pascalCode, @"program\s+(\w+);", "class $1 {");
// Replacing "readln(x)" with "x = Convert.ToInt32(Console.ReadLine())"
pascalCode = Regex.Replace(pascalCode, @"readln\((\w+)\)", "$1 = Convert.ToInt32(Console.ReadLine())");
// Replacing "var" and "x: integer" with "int x"
pascalCode = Regex.Replace(pascalCode, @"var", "");
pascalCode = Regex.Replace(pascalCode, @"(\w+):\s*integer", "int $1");
// Formatting "for" loops to C# style
pascalCode = Regex.Replace(pascalCode, @"for\s+(\w+)\s*:=\s*(\d+)\s+to\s*(\d+)\s*do", "for(int $1 = $2; $1 <= $3; $1++)");
return pascalCode;
}
// Method to process the Pascal code file and generate the C# code file
public static void ProcessFile(string inputFileName)
{
// Reading the Pascal code from the input file
string pascalCode = File.ReadAllText(inputFileName);
// Translating Pascal code to C#
string cSharpCode = TranslatePascalToCSharp(pascalCode);
// Creating the output file name by changing the extension from .pas to .cs
string outputFileName = Path.ChangeExtension(inputFileName, ".cs");
// Writing the translated C# code to the output file
File.WriteAllText(outputFileName, cSharpCode);
Console.WriteLine($"Translation complete. The C# code has been saved to {outputFileName}");
}
}
class Program
{
static void Main(string[] args)
{
// Asking user for the Pascal file name
Console.Write("Enter the Pascal file name (with .pas extension): ");
string inputFileName = Console.ReadLine();
// Calling the ProcessFile method to handle the translation
PascalToCSharpTranslator.ProcessFile(inputFileName);
}
}