diff --git a/Module2/SimpleLangLexer/SimpleLexer.cs b/Module2/SimpleLangLexer/SimpleLexer.cs
index aedad81bbc501130a3644f3b3cd1619cba6f7338..6116e89a4ceeb77b754eee49649a0c8496097c11 100644
--- a/Module2/SimpleLangLexer/SimpleLexer.cs
+++ b/Module2/SimpleLangLexer/SimpleLexer.cs
@@ -106,9 +106,19 @@ namespace SimpleLexer
 			keywordsMap["and"] = Tok.AND;
 			keywordsMap["or"] = Tok.OR;
 			keywordsMap["not"] = Tok.NOT;
-		}
+            // РґРѕР±. RecursiveDescnetParser
+            keywordsMap["while"] = Tok.WHILE;
+            keywordsMap["do"] = Tok.DO;
+            keywordsMap["for"] = Tok.FOR;
+            keywordsMap["to"] = Tok.TO;
+            keywordsMap["if"] = Tok.IF;
+            keywordsMap["then"] = Tok.THEN;
+            keywordsMap["else"] = Tok.ELSE;
+            //keywordsMap["("] = Tok.LEFT_BRACKET;
+            //keywordsMap[")"] = Tok.RIGHT_BRACKET;
+        }
 
-		public string FinishCurrentLine()
+        public string FinishCurrentLine()
         {
             return CurrentLineText + inputReader.ReadLine();
         }
@@ -279,7 +289,19 @@ namespace SimpleLexer
 				NextCh();
 				LexKind = Tok.EQ;
 			}
-			else if (currentCh == '{')
+            // РґРѕР±. DescentParser
+            else if (currentCh == '(')
+            {
+                NextCh();
+                LexKind = Tok.LEFT_BRACKET;
+            }
+            else if (currentCh == ')')
+            {
+                NextCh();
+                LexKind = Tok.RIGHT_BRACKET;
+            }
+            // -----
+            else if (currentCh == '{')
 			{
 				while (currentCh != '}')
 				{
@@ -290,7 +312,7 @@ namespace SimpleLexer
 				NextCh();
 				NextLexem();
 			}
-			else if (char.IsLetter(currentCh))
+            else if (char.IsLetter(currentCh))
             {
                 while (char.IsLetterOrDigit(currentCh))
                 {
diff --git a/Module4/SimpleLangParser/SimpleLangParser.cs b/Module4/SimpleLangParser/SimpleLangParser.cs
index 246db0b398caf6b3e0ecd83364d3832a912b8882..9cb9109f725b79b7a98073cd699adbfccb2e6e06 100644
--- a/Module4/SimpleLangParser/SimpleLangParser.cs
+++ b/Module4/SimpleLangParser/SimpleLangParser.cs
@@ -29,14 +29,12 @@ namespace SimpleLangParser
 
         public void Expr() 
         {
-            if (l.LexKind == Tok.ID || l.LexKind == Tok.INUM)
-            {
-                l.NextLexem();
-            }
+            if (l.LexKind == Tok.ID || l.LexKind == Tok.INUM || l.LexKind == Tok.PLUS || l.LexKind == Tok.MINUS || l.LexKind == Tok.MULT || l.LexKind == Tok.DIVISION || l.LexKind == Tok.RIGHT_BRACKET || l.LexKind == Tok.LEFT_BRACKET)
+                while (l.LexKind == Tok.ID || l.LexKind == Tok.INUM || l.LexKind == Tok.PLUS || l.LexKind == Tok.MINUS || l.LexKind == Tok.MULT || l.LexKind == Tok.DIVISION || l.LexKind == Tok.RIGHT_BRACKET || l.LexKind == Tok.LEFT_BRACKET)
+                    l.NextLexem();
+            //if (l.LexKind != Tok.ID && l.LexKind != Tok.INUM && l.LexKind != Tok.PLUS && l.LexKind != Tok.MINUS && l.LexKind != Tok.MULT && l.LexKind != Tok.DIVISION && l.LexKind != Tok.RIGHT_BRACKET && l.LexKind != Tok.LEFT_BRACKET)
             else
-            {
                 SyntaxError("expression expected");
-            }
         }
 
         public void Assign() 
@@ -46,7 +44,8 @@ namespace SimpleLangParser
             {
                 l.NextLexem();
             }
-            else {
+            else 
+            {
                 SyntaxError(":= expected");
             }
             Expr();
@@ -81,6 +80,21 @@ namespace SimpleLangParser
                         Assign();
                         break;
                     }
+                case Tok.WHILE:
+                    {
+                        While();
+                        break;
+                    }
+                case Tok.FOR:
+                    {
+                        For();
+                        break;
+                    }
+                case Tok.IF:
+                    {
+                        If();
+                        break;
+                    }
                 default:
                     {
                         SyntaxError("Operator expected");
@@ -111,6 +125,70 @@ namespace SimpleLangParser
             Statement();
         }
 
+        // РґРѕР±. WHILE
+        public void While()
+        {
+            l.NextLexem();
+            Expr();
+
+            if (l.LexKind == Tok.DO)
+            {
+                l.NextLexem();
+                Statement();
+            }
+            else SyntaxError("DO expected");
+        }
+
+        // РґРѕР±. FOR
+        public void For()
+        {
+            l.NextLexem();
+            if (l.LexKind == Tok.ID)
+            {
+                l.NextLexem();
+                if (l.LexKind == Tok.ASSIGN)
+                {
+                    l.NextLexem();
+                    Expr();
+                    if (l.LexKind == Tok.TO)
+                    {
+                        l.NextLexem();
+                        Expr();
+                        if (l.LexKind == Tok.DO)
+                        {
+                            l.NextLexem();
+                            Statement();
+                        }
+                        else SyntaxError("DO expected");
+                    }
+                    else SyntaxError("TO expected");
+                }
+                else SyntaxError("ASSIGN expected");
+            }
+            else SyntaxError("ID expected");
+        }
+
+        // РґРѕР±. IF 
+        public void If()
+        {
+            l.NextLexem();
+            Expr();
+
+            if (l.LexKind == Tok.THEN)
+            {
+                l.NextLexem();
+                Statement();
+
+                if (l.LexKind == Tok.ELSE)
+                {
+                    l.NextLexem();
+                    Statement();
+                }
+            }
+            else SyntaxError("THEN expected");            
+        }
+
+
         public void SyntaxError(string message) 
         {
             var errorMessage = "Syntax error in line " + l.LexRow.ToString() + ":\n";
diff --git a/TestDescentParser/Tests.cs b/TestDescentParser/Tests.cs
index 2d3de166342e860cdab066c290870eeded581a44..e523ebdcfd052b9918adee764cc2c2a39fc22587 100644
--- a/TestDescentParser/Tests.cs
+++ b/TestDescentParser/Tests.cs
@@ -26,7 +26,7 @@ namespace TestDescentParser
         }
         
         [Test]
-        [Ignore("This test is disabled")]
+        //[Ignore("This test is disabled")]
         public void TestWhile()
         {
             Assert.IsTrue(Parse(@"begin while 5 do a:=2 end"));
@@ -75,7 +75,7 @@ namespace TestDescentParser
         }
         
         [Test]
-        [Ignore("This test is disabled")]
+        //[Ignore("This test is disabled")]
         public void TestIf()
         {
             Assert.IsTrue(Parse(@"begin 
@@ -101,7 +101,7 @@ namespace TestDescentParser
         }
         
         [Test]
-        [Ignore("This test is disabled")]
+        //[Ignore("This test is disabled")]
         public void TestExpr()
         {
             Assert.IsTrue(Parse(@"begin