Traductor de Pascal a Visual Basic Curso de Programación Visual Basic

Lección:

Administración de Archivos


Ejercicio:

Traductor de Pascal a Visual Basic 48


Objetivo:

Cree un traductor básico de Pascal a Visual Basic. 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 Visual Basic compilable a partir de la fuente Pascal anterior y otras similares: hasta 11 puntos.


Código:

Imports System
Imports System.IO
Namespace PascalToCSharp
    Class Program
        Private Shared Sub Main()
            Console.Write("Enter name file: ")
            Dim fileName As String = Console.ReadLine()

            If File.Exists(fileName) Then
                Dim filePascal As StreamReader = File.OpenText(fileName)
                Dim fileCSharp As StreamWriter = File.CreateText(fileName.Substring(0, fileName.Length - 3) & "cs")
                Dim line As String

                Do
                    line = filePascal.ReadLine()

                    If line IsNot Nothing Then
                        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 ")) AndAlso (line.Substring(line.Length - 1) = ";") Then
                            line = line.Replace("program ", "class ")
                            line = line.Replace(";", vbLf & "{" & vbLf & " static void Main()" & vbLf & "{")
                        End If

                        If line.Contains("readLn(") Then
                            line = line.Replace("readLn(", "")
                            line = line.Replace(");", "")
                            line += " = Convert.ToInt32(Console.RadLine());"
                        End If

                        line = line.Replace("var", "")

                        If line.Contains(": integer;") Then
                            line = line.Replace(": integer;", "")
                            line = "int " & line.Trim() & ";"
                        End If

                        fileCSharp.WriteLine(line)
                    End If
                Loop While line IsNot Nothing

                filePascal.Close()
                fileCSharp.Close()
            End If
        End Sub
    End Class
End Namespace