fork download
  1. using System;
  2. using System.Reflection;
  3. using System.Text.RegularExpressions;
  4.  
  5. namespace Q526265_MyAnswer2
  6. {
  7. class Program
  8. {
  9. static void RunProgram(string pascalProgram)
  10. {
  11. string className = "Program";
  12. Func<string, string> pascalType2SharpType = pascalType =>
  13. {
  14. switch (pascalType)
  15. {
  16. case "integer":
  17. return "int";
  18. }
  19. return "object";
  20. };
  21. var sharpProgram = Regex.Replace(pascalProgram, @"program (\w+);", m => { className = m.Groups[1].Value; return m.Result(@"
  22. using System;
  23. class $1 {
  24. static void readln(ref int variable) {
  25. variable = int.Parse(Console.ReadLine());
  26. }
  27. static void writeln(int value) {
  28. Console.WriteLine(value);
  29. }
  30. "); });
  31. sharpProgram = Regex.Replace(sharpProgram, @"var (.*): (\w+);", m => m.Result("static " + pascalType2SharpType(m.Groups[2].Value) + " $1;"));
  32. sharpProgram = Regex.Replace(sharpProgram, @"readln\((\w+)\)", "readln(ref $1)");
  33. sharpProgram = sharpProgram.Replace("begin", "static void Main() {").Replace("end.", "}}").Replace(":=", "=");
  34.  
  35. object programObject = new Microsoft.CSharp.CSharpCodeProvider()
  36. .CompileAssemblyFromSource(new System.CodeDom.Compiler.CompilerParameters(), sharpProgram)
  37. .CompiledAssembly.CreateInstance(className);
  38. programObject.GetType().GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null);
  39. }
  40.  
  41. static void Main(string[] args)
  42. {
  43. RunProgram(@"
  44. program test;
  45. var a, b, c: integer;
  46. begin
  47. readln(a);
  48. readln(b);
  49. c := a + b;
  50. writeln(c);
  51. end.
  52. ");
  53. RunProgram(@"
  54. program MyProgram;
  55. var a, b, c, d: integer;
  56. begin
  57. readln(a);
  58. readln(b);
  59. readln(d);
  60. c := (a + b) / d;
  61. writeln(c);
  62. end.
  63. ");
  64. }
  65. }
  66. }
Success #stdin #stdout 1.7s 38280KB
stdin
44
44
100
100
2
stdout
88
100