diff --git a/Module1/packages.config b/Module1/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module1/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/Module2/SimpleLangLexer/packages.config b/Module2/SimpleLangLexer/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module2/SimpleLangLexer/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/Module2/SimpleLexerDemo/packages.config b/Module2/SimpleLexerDemo/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module2/SimpleLexerDemo/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/Module3/Gplex.exe b/Module3/Gplex.exe
new file mode 100644
index 0000000000000000000000000000000000000000..51a522e221f5ca52cc934933e08745f1653a98b5
Binary files /dev/null and b/Module3/Gplex.exe differ
diff --git a/Module3/LexerAddon.cs b/Module3/LexerAddon.cs
index c2467796d99e34b2906c362b66cf925504fe57e5..a14d4be6818a7989eb032382794a00cbbbbd4193 100644
--- a/Module3/LexerAddon.cs
+++ b/Module3/LexerAddon.cs
@@ -19,7 +19,7 @@ namespace  GeneratedLexer
         public int sumInt = 0;
         public double sumDouble = 0.0;
         public List<string> idsInComment = new List<string>();
-        
+
 
         public LexerAddon(string programText)
         {
@@ -49,6 +49,16 @@ namespace  GeneratedLexer
                     break;
                 }
             } while (true);
+
+            idCount = myScanner.IdCount;
+            minIdLength = myScanner.MinIdLength;
+            maxIdLength = myScanner.MaxIdLength;
+            var sumIdLength = myScanner.SumIdLength;
+            if (idCount > 0)
+                avgIdLength = (double)sumIdLength / idCount;
+            sumInt = myScanner.IntSum;
+            sumDouble = myScanner.DoubleSum;
+            idsInComment = myScanner.CommentedIds;
         }
     }
 }
diff --git a/Module3/SimpleLex.cs b/Module3/SimpleLex.cs
index d8f9df81a5460e11bf2e732ea49905ce52e6f7fa..1a9bc65778c6b725b07fe308ea8da250081ec867 100644
--- a/Module3/SimpleLex.cs
+++ b/Module3/SimpleLex.cs
@@ -1,14 +1,10 @@
 //
 //  This CSharp output file generated by Gardens Point LEX
-//  Gardens Point LEX (GPLEX) is Copyright (c) John Gough, QUT 2006-2014.
-//  Output produced by GPLEX is the property of the user.
-//  See accompanying file GPLEXcopyright.rtf.
-//
-//  GPLEX Version:  1.2.2
-//  Machine:  MAINHOMEPC2
-//  DateTime: 30.09.2018 17:57:38
-//  UserName: someone
-//  GPLEX input file <SimpleLex.lex - 30.09.2018 17:56:56>
+//  Version:  1.1.3.301
+//  Machine:  DESKTOP-H0VRSS3
+//  DateTime: 25.09.2022 23:49:01
+//  UserName: nikit
+//  GPLEX input file <SimpleLex.lex>
 //  GPLEX frame file <embedded resource>
 //
 //  Option settings: noParser, minimize
@@ -16,8 +12,8 @@
 //
 
 //
-// Revised backup code
-// Version 1.2.1 of 24-June-2013
+// Experimental embedded frame
+// Version 1.1.3 of 18-April-2010
 //
 //
 #define BACKUP
@@ -126,15 +122,24 @@ namespace SimpleScanner
         
         enum Result {accept, noMatch, contextFound};
 
-        const int maxAccept = 20;
-        const int initial = 21;
+        const int maxAccept = 40;
+        const int initial = 41;
         const int eofNum = 0;
         const int goStart = -1;
         const int INITIAL = 0;
+        const int COMMENT = 1;
 
 #region user code
 public int LexValueInt;
   public double LexValueDouble;
+  public string LexValueString;
+  public int IdCount = 0;
+  public int MinIdLength = Int32.MaxValue;
+  public int MaxIdLength = 0;
+  public int IntSum = 0;
+  public double DoubleSum = 0.0;
+  public int SumIdLength = 0;
+  public List<string> CommentedIds = new List<string>();
 #endregion user code
 
         int state;
@@ -166,112 +171,208 @@ public int LexValueInt;
         }
     };
 
-    static int[] startState = new int[] {21, 0};
+    static int[] startState = new int[] {41, 44, 0};
 
-    static Table[] NxS = new Table[23] {
+    static Table[] NxS = new Table[45] {
 /* NxS[   0] */ new Table(0, 0, 0, null),
 /* NxS[   1] */ new Table(0, 0, -1, null),
-/* NxS[   2] */ new Table(46, 12, -1, new sbyte[] {22, -1, 2, 2, 2, 2, 
-          2, 2, 2, 2, 2, 2}),
-/* NxS[   3] */ new Table(61, 1, -1, new sbyte[] {19}),
-/* NxS[   4] */ new Table(0, 0, -1, null),
-/* NxS[   5] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[   6] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 15, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[   7] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 11, 5}),
-/* NxS[   8] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[   9] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 10, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  10] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  11] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 12, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  12] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 13, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  13] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 14, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  14] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  15] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  16] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  17] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  18] */ new Table(48, 75, -1, new sbyte[] {5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, -1, -1, -1, -1, 5, -1, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5}),
-/* NxS[  19] */ new Table(0, 0, -1, null),
-/* NxS[  20] */ new Table(48, 10, -1, new sbyte[] {20, 20, 20, 20, 20, 20, 
-          20, 20, 20, 20}),
-/* NxS[  21] */ new Table(10, 113, 1, new sbyte[] {-1, 1, 1, -1, 1, 1, 
+/* NxS[   2] */ new Table(39, 1, 43, new sbyte[] {25}),
+/* NxS[   3] */ new Table(47, 1, -1, new sbyte[] {24}),
+/* NxS[   4] */ new Table(46, 12, -1, new sbyte[] {42, -1, 4, 4, 4, 4, 
+          4, 4, 4, 4, 4, 4}),
+/* NxS[   5] */ new Table(61, 1, -1, new sbyte[] {22}),
+/* NxS[   6] */ new Table(0, 0, -1, null),
+/* NxS[   7] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[   8] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 18, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[   9] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 14, 7}),
+/* NxS[  10] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 12, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  11] */ new Table(0, 0, -1, null),
+/* NxS[  12] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 13, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  13] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  14] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 15, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  15] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 16, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  16] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 17, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  17] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  18] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  19] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 20, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  20] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 21, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  21] */ new Table(48, 75, -1, new sbyte[] {7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, -1, -1, -1, -1, 7, -1, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7}),
+/* NxS[  22] */ new Table(0, 0, -1, null),
+/* NxS[  23] */ new Table(48, 10, -1, new sbyte[] {23, 23, 23, 23, 23, 23, 
+          23, 23, 23, 23}),
+/* NxS[  24] */ new Table(10, 4, 24, new sbyte[] {-1, 24, 24, -1}),
+/* NxS[  25] */ new Table(0, 0, -1, null),
+/* NxS[  26] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  27] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 37, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  28] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 33, 26}),
+/* NxS[  29] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 31, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  30] */ new Table(0, 0, -1, null),
+/* NxS[  31] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 32, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  32] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  33] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 34, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  34] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 35, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  35] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 36, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  36] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  37] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 38, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  38] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 39, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  39] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 40, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  40] */ new Table(48, 75, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26}),
+/* NxS[  41] */ new Table(10, 114, 1, new sbyte[] {-1, 1, 1, -1, 1, 1, 
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-          -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-          2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 1, 1, 1, 1, 
-          1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 5, 
-          1, 5, 6, 7, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
-          5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}),
-/* NxS[  22] */ new Table(48, 10, -1, new sbyte[] {20, 20, 20, 20, 20, 20, 
-          20, 20, 20, 20}),
+          -1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 
+          4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 1, 1, 1, 1, 
+          1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 
+          1, 7, 8, 9, 7, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+          7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 11}),
+/* NxS[  42] */ new Table(48, 10, -1, new sbyte[] {23, 23, 23, 23, 23, 23, 
+          23, 23, 23, 23}),
+/* NxS[  43] */ new Table(39, 1, 43, new sbyte[] {25}),
+/* NxS[  44] */ new Table(65, 61, -1, new sbyte[] {26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, -1, -1, 26, -1, 26, 27, 28, 26, 29, 26, 
+          26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 
+          26, 26, 26, 26, -1, -1, 30}),
     };
 
 int NextState() {
@@ -356,7 +457,8 @@ int NextState() {
 #if !NOFILES
      public Scanner(Stream file) {
             SetSource(file); // no unicode option
-        }   
+        }
+        
 #endif // !NOFILES
 
      public Scanner() { }
@@ -384,7 +486,7 @@ int NextState() {
                     if (next < 0xDC00 || next > 0xDFFF)
                         code = ScanBuff.UnicodeReplacementChar;
                     else
-                        code = (0x10000 + ((code & 0x3FF) << 10) + (next & 0x3FF));
+                        code = (0x10000 + (code & 0x3FF << 10) + (next & 0x3FF));
                 }
 #endif
                 cCol++;
@@ -437,7 +539,9 @@ int NextState() {
             GetCode();
         }
 
+#if !NOFILES        
         // ================ LineBuffer Initialization ===================
+
         /// <summary>
         /// Create and initialize a LineBuff buffer object for this scanner
         /// </summary>
@@ -451,7 +555,6 @@ int NextState() {
             GetCode();
         }
 
-#if !NOFILES        
         // =============== StreamBuffer Initialization ==================
 
         /// <summary>
@@ -553,12 +656,6 @@ int NextState() {
             }
         }
 
-        /// <summary>
-        /// Discards all but the first "n" codepoints in the recognized pattern.
-        /// Resets the buffer position so that only n codepoints have been consumed;
-        /// yytext is also re-evaluated. 
-        /// </summary>
-        /// <param name="n">The number of codepoints to consume</param>
         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
         void yyless(int n)
         {
@@ -578,10 +675,6 @@ int NextState() {
         //  but it does not seem possible to re-establish
         //  the correct column counts except by going forward.
         //
-        /// <summary>
-        /// Removes the last "n" code points from the pattern.
-        /// </summary>
-        /// <param name="n">The number to remove</param>
         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
         void _yytrunc(int n) { yyless(yyleng - n); }
         
@@ -594,23 +687,18 @@ int NextState() {
         // can't use (tokEPos - tokPos) because of the
         // possibility of surrogate pairs in the token.
         //
-        /// <summary>
-        /// The length of the pattern in codepoints (not the same as 
-        /// string-length if the pattern contains any surrogate pairs).
-        /// </summary>
         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
         [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yyleng")]
         [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yyleng")]
         public int yyleng
         {
             get {
+#if BYTEMODE
+                return tokEPos - tokPos;
+#else   
                 if (tokELin == tokLin)
                     return tokECol - tokCol;
-                else
-#if BYTEMODE
-                    return tokEPos - tokPos;
-#else
-                {
+                else {
                     int ch;
                     int count = 0;
                     int save = buffer.Pos;
@@ -619,7 +707,7 @@ int NextState() {
                         ch = buffer.Read();
                         if (!char.IsHighSurrogate((char)ch)) count++;
                     } while (buffer.Pos < tokEPos && ch != ScanBuff.EndOfFile);
-                    buffer.Pos = save;
+                    buffer.Pos = save; 
                     return count;
                 }
 #endif // BYTEMODE
@@ -644,55 +732,64 @@ int NextState() {
 
         // ============== The main tokenizer code =================
 
-        int Scan() {
-                for (; ; ) {
-                    int next;              // next state to enter
+        int Scan()
+        {
+                for (; ; )
+                {
+                    int next;              // next state to enter                   
+#if BACKUP
+                    Result rslt = Result.noMatch;
+#endif // BACKUP
 #if LEFTANCHORS
-                    for (;;) {
+                    for (;;)
+                    {
                         // Discard characters that do not start any pattern.
                         // Must check the left anchor condition after *every* GetCode!
                         state = ((cCol == 0) ? anchorState[currentScOrd] : currentStart);
-                        if ((next = NextState()) != goStart) break; // LOOP EXIT HERE...
+                        if ((next = NextState()) != goStart) 
+                            break; // LOOP EXIT HERE...
                         GetCode();
                     }
                     
 #else // !LEFTANCHORS
                     state = currentStart;
-                    while ((next = NextState()) == goStart) {
+                    while ((next = NextState()) == goStart)
                         // At this point, the current character has no
                         // transition from the current state.  We discard 
                         // the "no-match" char.   In traditional LEX such 
                         // characters are echoed to the console.
                         GetCode();
-                    }
 #endif // LEFTANCHORS                    
                     // At last, a valid transition ...    
                     MarkToken();
                     state = next;
-                    GetCode();                    
+                    GetCode();
+                    
+                    while ((next = NextState()) > eofNum) // Exit for goStart AND for eofNum
 #if BACKUP
-                    bool contextSaved = false;
-                    while ((next = NextState()) > eofNum) { // Exit for goStart AND for eofNum
-                        if (state <= maxAccept && next > maxAccept) { // need to prepare backup data
-                            // Store data for the *latest* accept state that was found.
-                            SaveStateAndPos( ref ctx );
-                            contextSaved = true;
+                        if (state <= maxAccept && next > maxAccept) // need to prepare backup data
+                        {
+                            // ctx is an object. The fields may be 
+                            // mutated by the call to Recurse2.
+                            // On return the data in ctx is the
+                            // *latest* accept state that was found.
+                            
+                            rslt = Recurse2(ref ctx, next);
+                            if (rslt == Result.noMatch) 
+                                RestoreStateAndPos(ref ctx);
+                            break;
                         }
-                        state = next;
-                        GetCode();
-                    }
-                    if (state > maxAccept && contextSaved)
-                        RestoreStateAndPos( ref ctx );
-#else  // BACKUP
-                    while ((next = NextState()) > eofNum) { // Exit for goStart AND for eofNum
-                         state = next;
-                         GetCode();
-                    }
+                        else
 #endif // BACKUP
-                    if (state <= maxAccept) {
+                        {
+                            state = next;
+                            GetCode();
+                        }
+                    if (state <= maxAccept) 
+                    {
                         MarkEnd();
 #region ActionSwitch
-#pragma warning disable 162, 1522
+#pragma warning disable 162
     switch (state)
     {
         case eofNum:
@@ -700,59 +797,127 @@ int NextState() {
                 return (int)Tokens.EOF;
             break;
         case 1:
+        case 2:
+        case 3:
 LexError();
 	return 0;
             break;
-        case 2:
+        case 4:
 LexValueInt = int.Parse(yytext);
+  IntSum += LexValueInt;
   return (int)Tok.INUM;
             break;
-        case 3:
+        case 5:
 return (int)Tok.COLON;
             break;
-        case 4:
+        case 6:
 return (int)Tok.SEMICOLON;
             break;
-        case 5:
-        case 6:
         case 7:
         case 8:
         case 9:
-        case 11:
+        case 10:
         case 12:
-        case 13:
+        case 14:
         case 15:
         case 16:
-        case 17:
-return (int)Tok.ID;
+        case 18:
+        case 19:
+        case 20:
+IdCount += 1;
+  SumIdLength += yytext.Length;
+  if (yytext.Length > MaxIdLength)
+	  MaxIdLength = yytext.Length;
+  if (yytext.Length < MinIdLength)
+	  MinIdLength = yytext.Length;
+  return (int)Tok.ID;
             break;
-        case 10:
+        case 11:
+BEGIN(COMMENT);
+            break;
+        case 13:
 return (int)Tok.END;
             break;
-        case 14:
+        case 17:
 return (int)Tok.CYCLE;
             break;
-        case 18:
+        case 21:
 return (int)Tok.BEGIN;
             break;
-        case 19:
+        case 22:
 return (int)Tok.ASSIGN;
             break;
-        case 20:
+        case 23:
 LexValueDouble = double.Parse(yytext);
+  DoubleSum += LexValueDouble;
   return (int)Tok.RNUM;
             break;
+        case 24:
+return (int)Tok.COMMENT;
+            break;
+        case 25:
+LexValueString = yytext;
+  return (int)Tok.STRINGAP;
+            break;
+        case 26:
+        case 27:
+        case 28:
+        case 29:
+        case 31:
+        case 33:
+        case 34:
+        case 35:
+        case 37:
+        case 38:
+        case 39:
+CommentedIds.Add(yytext);
+            break;
+        case 30:
+BEGIN(INITIAL);
+  return (int)Tok.LONGCOMMENT;
+            break;
+        case 32:
+{}
+            break;
+        case 36:
+{}
+            break;
+        case 40:
+{}
+            break;
         default:
             break;
     }
-#pragma warning restore 162, 1522
+#pragma warning restore 162
 #endregion
                     }
                 }
         }
 
 #if BACKUP
-        void SaveStateAndPos(ref Context ctx) {
+        Result Recurse2(ref Context ctx, int next)
+        {
+            // Assert: at entry "state" is an accept state AND
+            //         NextState(state, code) != goStart AND
+            //         NextState(state, code) is not an accept state.
+            //
+            SaveStateAndPos(ref ctx);
+            state = next;
+            GetCode();
+
+            while ((next = NextState()) > eofNum)
+            {
+                if (state <= maxAccept && next > maxAccept) // need to update backup data
+                    SaveStateAndPos(ref ctx);
+                state = next;
+                if (state == eofNum) return Result.accept;
+                GetCode(); 
+            }
+            return (state <= maxAccept ? Result.accept : Result.noMatch);
+        }
+
+        void SaveStateAndPos(ref Context ctx)
+        {
             ctx.bPos  = buffer.Pos;
             ctx.rPos  = readPos;
             ctx.cCol  = cCol;
@@ -761,7 +926,8 @@ LexValueDouble = double.Parse(yytext);
             ctx.cChr  = code;
         }
 
-        void RestoreStateAndPos(ref Context ctx) {
+        void RestoreStateAndPos(ref Context ctx)
+        {
             buffer.Pos = ctx.bPos;
             readPos = ctx.rPos;
             cCol  = ctx.cCol;
@@ -769,7 +935,8 @@ LexValueDouble = double.Parse(yytext);
             state = ctx.state;
             code  = ctx.cChr;
         }
-#endif  // BACKUP
+
+#endif // BACKUP
 
         // ============= End of the tokenizer code ================
 
@@ -803,7 +970,7 @@ LexValueDouble = double.Parse(yytext);
 
 public void LexError()
 {
-	Console.WriteLine("({0},{1}): Íåèçâåñòíûé ñèìâîë {2}", yyline, yycol, yytext);
+	Console.WriteLine("({0},{1}): Неизвестный символ {2}", yyline, yycol, yytext);
 }
 
 public string TokToString(Tok tok)
@@ -816,6 +983,8 @@ public string TokToString(Tok tok)
 			return tok + " " + LexValueInt;
 		case Tok.RNUM:
 			return tok + " " + LexValueDouble;
+		case Tok.STRINGAP:
+			return tok + " " + yytext;
 		default:
 			return tok + "";
 	}
@@ -870,7 +1039,6 @@ public string TokToString(Tok tok)
             return new LineBuffer(source);
         }
 
-#if (!NOFILES)
         public static ScanBuff GetBuffer(Stream source)
         {
             return new BuildBuffer(source);
@@ -881,8 +1049,7 @@ public string TokToString(Tok tok)
         {
             return new BuildBuffer(source, fallbackCodePage);
         }
-#endif // !BYTEMODE
-#endif // !NOFILES
+#endif
     }
 
     #region Buffer classes
@@ -1005,7 +1172,7 @@ public string TokToString(Tok tok)
             {
                 ix = lstart = 0;
             }
-            while (ix < numLines)
+            for (; ; )
             {
                 int len = line[ix].Length + 1;
                 if (pos < lstart + len) break;
@@ -1063,8 +1230,7 @@ public string TokToString(Tok tok)
             {
                 cPos = value;
                 findIndex(cPos, out cLine, out curLineStart);
-                // cLine should be the *next* line after curLine.
-                curLine = (cLine < numLines ? line[cLine++] : "");
+                curLine = line[cLine];
                 curLineEnd = curLineStart + curLine.Length;
             }
         }
@@ -1072,7 +1238,7 @@ public string TokToString(Tok tok)
         public override string ToString() { return "LineBuffer"; }
     }
 
-#if (!NOFILES)
+
     // ==============================================================
     // =====     class BuildBuff : for unicode text files    ========
     // ==============================================================
@@ -1313,13 +1479,12 @@ public string TokToString(Tok tok)
         }
 #endif // !BYTEMODE
     }
-#endif // !NOFILES
     #endregion Buffer classes
 
     // ==============================================================
     // ============      class CodePageHandling         =============
     // ==============================================================
-#if (!NOFILES)
+
     public static class CodePageHandling
     {
         public static int GetCodePage(string option)
@@ -1530,7 +1695,6 @@ public string TokToString(Tok tok)
     
 #endif // !BYTEMODE
 #endregion
-#endif // !NOFILES
 
 // End of code copied from embedded resource
 
diff --git a/Module3/SimpleLex.lex b/Module3/SimpleLex.lex
index c0434f09b6e8ca1adf55cd70f9ae3e4b18e41e45..e9a1cfb394386474224f30adc426a06aa30c0a0b 100644
--- a/Module3/SimpleLex.lex
+++ b/Module3/SimpleLex.lex
@@ -6,25 +6,48 @@ Digit   [0-9]
 AlphaDigit {Alpha}|{Digit}
 INTNUM  {Digit}+
 REALNUM {INTNUM}\.{INTNUM}
+STRING \'[^']*\'
 ID {Alpha}{AlphaDigit}* 
+DotChr [^\r\n]
+OneLineCmnt  \/\/{DotChr}*
+%x COMMENT
 
 // Здесь можно делать описания типов, переменных и методов - они попадают в класс Scanner
 %{
   public int LexValueInt;
   public double LexValueDouble;
+  public string LexValueString;
+  public int IdCount = 0;
+  public int MinIdLength = Int32.MaxValue;
+  public int MaxIdLength = 0;
+  public int IntSum = 0;
+  public double DoubleSum = 0.0;
+  public int SumIdLength = 0;
+  public List<string> CommentedIds = new List<string>();
 %}
 
 %%
 {INTNUM} { 
   LexValueInt = int.Parse(yytext);
+  IntSum += LexValueInt;
   return (int)Tok.INUM;
 }
 
 {REALNUM} { 
   LexValueDouble = double.Parse(yytext);
+  DoubleSum += LexValueDouble;
   return (int)Tok.RNUM;
 }
 
+{OneLineCmnt} {
+	return (int)Tok.COMMENT;
+}
+
+{STRING} {
+  LexValueString = yytext;
+  return (int)Tok.STRINGAP;
+}
+
 begin { 
   return (int)Tok.BEGIN;
 }
@@ -38,9 +61,32 @@ cycle {
 }
 
 {ID}  { 
+  IdCount += 1;
+  SumIdLength += yytext.Length;
+  if (yytext.Length > MaxIdLength)
+	  MaxIdLength = yytext.Length;
+  if (yytext.Length < MinIdLength)
+	  MinIdLength = yytext.Length;
   return (int)Tok.ID;
 }
 
+"{" {
+  BEGIN(COMMENT);
+}
+
+<COMMENT> "}" {
+  BEGIN(INITIAL);
+  return (int)Tok.LONGCOMMENT;
+}
+
+<COMMENT> begin {}
+<COMMENT> end {}
+<COMMENT> cycle {}
+
+<COMMENT>{ID} {
+  CommentedIds.Add(yytext);
+}
+
 ":" { 
   return (int)Tok.COLON;
 }
@@ -77,6 +123,8 @@ public string TokToString(Tok tok)
 			return tok + " " + LexValueInt;
 		case Tok.RNUM:
 			return tok + " " + LexValueDouble;
+		case Tok.STRINGAP:
+			return tok + " " + yytext;
 		default:
 			return tok + "";
 	}
diff --git a/Module3/a.txt b/Module3/a.txt
index cda64314589386e33d85b530880ee7a9b74b7e00..925feada5446a977610076ef09fb98ed5ecfbc54 100644
--- a/Module3/a.txt
+++ b/Module3/a.txt
@@ -1,3 +1,9 @@
-begin ggg : ; :+= 7 99.9 5 
-1 
-ppp end
+begin ggg : ; := 7 99.9 5 
+1 tu polasdq 0.2
+ppp end // wooow begin
+cycle  'hi mark'
+{ gvjbh 8 1.5
+begin end
+pa pew
+; : } :=  
+pumpum cycle
diff --git a/Module3/mymain.cs b/Module3/mymain.cs
index 9a33c597556eaecf3a6908bf931d847f7ed6c273..5d1f013e373efb396268d1b42d3e3e2a401810c1 100644
--- a/Module3/mymain.cs
+++ b/Module3/mymain.cs
@@ -33,14 +33,15 @@ namespace GeneratedLexer
                 if (tok == (int)Tok.EOF)
                 {
                     Console.WriteLine();
-                    Console.WriteLine("number of id: {0:D}", cnt_id);
-                    Console.WriteLine("average length of the id: {0:N}", avg_id_len / cnt_id);
-                    Console.WriteLine("min length of the id: {0:D}", min_id_len);
-                    Console.WriteLine("min length of the id: {0:D}", max_id_len);
+                    Console.WriteLine("number of id: {0:D}", scanner.IdCount);
+                    Console.WriteLine("average length of the id: {0:N}", (double)scanner.SumIdLength / scanner.IdCount);
+                    Console.WriteLine("min length of the id: {0:D}", scanner.MinIdLength);
+                    Console.WriteLine("min length of the id: {0:D}", scanner.MaxIdLength);
 
                     Console.WriteLine();
-                    Console.WriteLine("sum of int: {0:D}", sum_int);
-                    Console.WriteLine("sum of double: {0:N}", sum_d);
+                    Console.WriteLine("sum of int: {0:D}", scanner.IntSum);
+                    Console.WriteLine("sum of double: {0:N}", scanner.DoubleSum);
+                    Console.WriteLine(string.Join(" ", scanner.CommentedIds));
 
                     Console.WriteLine();
 
@@ -50,7 +51,7 @@ namespace GeneratedLexer
                 Console.WriteLine(scanner.TokToString((Tok)tok));
             } while (true);
 
-            Console.ReadKey();
+            //Console.ReadKey();
         }
     }
 }
diff --git a/Module3/packages.config b/Module3/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module3/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/Module4/SimpleLangParser/packages.config b/Module4/SimpleLangParser/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module4/SimpleLangParser/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/Module4/SimpleLangParserTest/packages.config b/Module4/SimpleLangParserTest/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module4/SimpleLangParserTest/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/Module5/packages.config b/Module5/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module5/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/Module7/packages.config b/Module7/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module7/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/Module8/packages.config b/Module8/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..71fe2d472a2b3e35380df0a4ca03a9a67dec6a43
--- /dev/null
+++ b/Module8/packages.config
@@ -0,0 +1,10 @@
+п»ї<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="3.13.3" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.15.2" targetFramework="net40" />
+  <package id="NUnit.Extension.NUnitProjectLoader" version="3.7.1" targetFramework="net40" />
+  <package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net40" />
+  <package id="NUnit.Extension.VSProjectLoader" version="3.9.0" targetFramework="net40" />
+  <package id="NUnit3TestAdapter" version="4.3.0-alpha-net7.4" targetFramework="net40" />
+  <package id="Newtonsoft.Json" version="13.0.2-beta2" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/TestGeneratedLexer/Tests.cs b/TestGeneratedLexer/Tests.cs
index 57d7d4cfefec38b435448d0de4ad694d624d177e..43a3db0326413bf8b69bc98a26620c2434582590 100644
--- a/TestGeneratedLexer/Tests.cs
+++ b/TestGeneratedLexer/Tests.cs
@@ -40,7 +40,7 @@ namespace TestGeneratedLexer
         }
         
         [Test]
-        [Ignore("This test is disabled")]
+        //[Ignore("This test is disabled")]
         public void TestString()
         {
             LexerAddon lexer = new LexerAddon(@"3 389 3 'ssfsf ' ");
@@ -50,7 +50,7 @@ namespace TestGeneratedLexer
         }
         
         [Test]
-        [Ignore("This test is disabled")]
+        //[Ignore("This test is disabled")]
         public void TestSingleLineCmt()
         {
             LexerAddon lexer = new LexerAddon(@"i22d1 5.6  // i 32 id3
@@ -63,7 +63,7 @@ namespace TestGeneratedLexer
         }
         
         [Test]
-        [Ignore("This test is disabled")]
+        //[Ignore("This test is disabled")]
         public void TestMultiLineCmt()
         {
             LexerAddon lexer = new LexerAddon(@"i22d1 5.6  { i 32 id3
@@ -76,7 +76,7 @@ namespace TestGeneratedLexer
         }
         
         [Test]
-        [Ignore("This test is disabled")]
+        //[Ignore("This test is disabled")]
         public void TestMultiLineCmtIds()
         {
             LexerAddon lexer = new LexerAddon(@"i22d1 5.6  { i 32 id3