Proposed exercise
Create a basic Pascal to C# translator. It will accept program such as:
program ejemplo;
var
i: integer;
max: integer;
begin
writeLn('How many times?');
readLn(max);
for i := 1 to max do
writeLn('Hola');
end.
The steps you must follow are:
- Read from beginning to end a text file, whose name will be entered by the user in command line or in an interactive way: up to 2 points.
- Dump the contents to another text file, whose name will be the same, but with ".cs" extension instead of ".pas": up to 4 points.
- Replace "WriteLn" with "Console.WriteLine", " = "with "==", " := " with "=", simple quotes with double quotes, "begin" with "{" and "end;", "end.", "end" (in that order) with "}", : up to 6 points.
- Replace "program x;" with "class x {" followed with "Main", Replace "readln(x)" with "x=Convert.ToInt32(Console.RadLine())" ("x" must be any other identifier): up to 8 points.
- Eliminate "var" and replace "x: integer" with "int x" (but "x" must be any other identifier): up to 9 points.
- Give a proper format to "for": up to 10 points.
- Create a compilable C# source from the previous Pascal source and similar ones: up to 11 points.
Solution
using System; using System.IO; class PascalToCSharp { static void Main() { Console.Write("Enter name file: "); string name = Console.ReadLine(); if (File.Exists(name)) { StreamReader filePascal = File.OpenText(name); StreamWriter fileCSharp = File.CreateText(name.Substring(0, name.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() + ";"; } fileCSharp.WriteLine(line); } } while (line != null); filePascal.Close(); fileCSharp.Close(); } } }