From d08189fe607f18e4da96c5c467857ed05e4bd026 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=20=D0=93=D1=83=D1=80=D0=B8=D0=BD?=
 <igurin@sfedu.ru>
Date: Mon, 21 Nov 2022 13:31:58 +0300
Subject: [PATCH] 7 8 done

---
 Module7/ParserVistors.csproj                  | 12 ++--
 Module7/Visitors/ChangeVarIdVisitor.cs        |  2 +-
 Module7/Visitors/CommonlyUsedVarVisitor.cs    | 26 ++++---
 Module7/Visitors/ExprComplexityVisitor.cs     | 67 +++++++++----------
 Module7/app.config                            |  2 +-
 Module7/packages.config                       |  4 +-
 Module8/ParserGenerator.csproj                | 12 ++--
 Module8/SimpleYacc.y                          |  2 +-
 .../GenCodeVisitors/GenCodeVisitor.cs         | 44 ++++++++++++
 Module8/app.config                            |  2 +-
 Module8/packages.config                       |  4 +-
 11 files changed, 116 insertions(+), 61 deletions(-)

diff --git a/Module7/ParserVistors.csproj b/Module7/ParserVistors.csproj
index 8d2fb0c..7702ede 100644
--- a/Module7/ParserVistors.csproj
+++ b/Module7/ParserVistors.csproj
@@ -1,6 +1,6 @@
 п»ї<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="..\packages\NUnit3TestAdapter.4.3.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.4.3.0\build\net35\NUnit3TestAdapter.props')" />
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\packages\NUnit3TestAdapter.4.3.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.4.3.1\build\net35\NUnit3TestAdapter.props')" />
   <Import Project="..\packages\NUnit.3.13.3\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.13.3\build\NUnit.props')" />
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -12,7 +12,7 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>SimpleLang</RootNamespace>
     <AssemblyName>SimpleLang</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
     <TargetFrameworkProfile>
     </TargetFrameworkProfile>
     <FileAlignment>512</FileAlignment>
@@ -28,6 +28,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
     <PlatformTarget>x86</PlatformTarget>
@@ -37,6 +38,7 @@
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
     <DebugSymbols>true</DebugSymbols>
@@ -46,6 +48,7 @@
     <PlatformTarget>AnyCPU</PlatformTarget>
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
     <OutputPath>bin\Release\</OutputPath>
@@ -55,6 +58,7 @@
     <PlatformTarget>AnyCPU</PlatformTarget>
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -104,7 +108,7 @@
       <ErrorText>Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их.  Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}.</ErrorText>
     </PropertyGroup>
     <Error Condition="!Exists('..\packages\NUnit.3.13.3\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.13.3\build\NUnit.props'))" />
-    <Error Condition="!Exists('..\packages\NUnit3TestAdapter.4.3.0\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.4.3.0\build\net35\NUnit3TestAdapter.props'))" />
+    <Error Condition="!Exists('..\packages\NUnit3TestAdapter.4.3.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.4.3.1\build\net35\NUnit3TestAdapter.props'))" />
   </Target>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/Module7/Visitors/ChangeVarIdVisitor.cs b/Module7/Visitors/ChangeVarIdVisitor.cs
index 2512e3b..8baa804 100644
--- a/Module7/Visitors/ChangeVarIdVisitor.cs
+++ b/Module7/Visitors/ChangeVarIdVisitor.cs
@@ -20,7 +20,7 @@ namespace SimpleLang.Visitors
         {
             if (id.Name == from)
                 id.Name = to;
-            base.VisitIdNode(id);
+            //base.VisitIdNode(id);
         }
 
 
diff --git a/Module7/Visitors/CommonlyUsedVarVisitor.cs b/Module7/Visitors/CommonlyUsedVarVisitor.cs
index bf0e397..59b52e9 100644
--- a/Module7/Visitors/CommonlyUsedVarVisitor.cs
+++ b/Module7/Visitors/CommonlyUsedVarVisitor.cs
@@ -8,19 +8,29 @@ namespace SimpleLang.Visitors
 {
     public class CommonlyUsedVarVisitor : AutoVisitor
     {
-        public Dictionary<string, int> VarCount = new Dictionary<string, int>();
+        
+        public Dictionary<string, int> varUsageCount = new Dictionary<string, int>();
         public string mostCommonlyUsedVar()
         {
-            //throw new NotImplementedException();
-            var max = VarCount.Values.Max();
-            return VarCount.Where(x => x.Value == max).First().Key;
+            int maxCount = 0;
+            string mostCommonVar = "";
+            foreach (var kv in varUsageCount)
+            {
+                if (kv.Value > maxCount)
+                {
+                    mostCommonVar = kv.Key;
+                    maxCount = kv.Value;
+                }
+            }
+            return mostCommonVar;
+
+
         }
         public override void VisitIdNode(IdNode id)
         {
-            if (VarCount.ContainsKey(id.Name))
-                VarCount[id.Name]++;
-            else
-                VarCount[id.Name] = 1;
+            if (!varUsageCount.ContainsKey(id.Name))
+                varUsageCount[id.Name] = 0;
+            varUsageCount[id.Name]++;
         }
 
     }
diff --git a/Module7/Visitors/ExprComplexityVisitor.cs b/Module7/Visitors/ExprComplexityVisitor.cs
index 5c55027..29371ec 100644
--- a/Module7/Visitors/ExprComplexityVisitor.cs
+++ b/Module7/Visitors/ExprComplexityVisitor.cs
@@ -8,58 +8,51 @@ namespace SimpleLang.Visitors
 {
     public class ExprComplexityVisitor : AutoVisitor
     {
-        private List<int> Complexity = new List<int>();
-        private bool entered = false;
+        List<int> complexityList = new List<int>();
+        int lastExprComplexity = 0;
 
-        // список должен содержать сложность каждого выражения, встреченного при обычном порядке обхода AST
-        public List<int> getComplexityList()
+        public override void VisitAssignNode(AssignNode a)
+        {
+            a.Expr.Visit(this);
+            complexityList.Add(lastExprComplexity);
+            lastExprComplexity = 0;
+        }
+
+        public override void VisitCycleNode(CycleNode c)
         {
-            return Complexity;
+            c.Expr.Visit(this);
+            complexityList.Add(lastExprComplexity);
+            lastExprComplexity = 0;
+            c.Stat.Visit(this);
         }
 
-        public override void VisitIntNumNode(IntNumNode num)
+        public override void VisitWriteNode(WriteNode w)
         {
-            if (!entered)
-                Complexity.Add(0);
-            base.VisitIntNumNode(num);
+            w.Expr.Visit(this);
+            complexityList.Add(lastExprComplexity);
+            lastExprComplexity = 0;
         }
-		public override void VisitIdNode(IdNode num)
-		{
-			if (!entered)
-				Complexity.Add(0);
-			base.VisitIdNode(num);
-		}
 
-		public override void VisitWriteNode(WriteNode num)
-		{
-			if (!entered)
-				Complexity.Add(0);
-			base.VisitWriteNode(num);
-		}
+        public List<int> getComplexityList()
+        {
+            return complexityList;
+        }
 
-		public override void VisitBinOpNode(BinOpNode binop)
+        public override void VisitBinOpNode(BinOpNode binop)
         {
-            if (entered)
+            binop.Left.Visit(this);
+            if (binop.Op == '+' || binop.Op == '-')
             {
-                if (binop.Op == '+' || binop.Op == '-')
-                    Complexity[Complexity.Count - 1]++;
-                else if (binop.Op == '*' || binop.Op == '/')
-                    Complexity[Complexity.Count - 1] += 3;
-                base.VisitBinOpNode(binop);
+                lastExprComplexity += 1;
             }
-            else
+            if (binop.Op == '*' || binop.Op == '/')
             {
-                entered = true;
-                Complexity.Add(0);
-                if (binop.Op == '+' || binop.Op == '-')
-                    Complexity[Complexity.Count - 1]++;
-                else if (binop.Op == '*' || binop.Op == '/')
-                    Complexity[Complexity.Count - 1] += 3;
-                base.VisitBinOpNode(binop);
-                entered = false;
+                lastExprComplexity += 3;
             }
+            binop.Right.Visit(this);
         }
 
 
+
     }
 }
diff --git a/Module7/app.config b/Module7/app.config
index fcd0c93..3e0e37c 100644
--- a/Module7/app.config
+++ b/Module7/app.config
@@ -1,3 +1,3 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>
diff --git a/Module7/packages.config b/Module7/packages.config
index 23cecd6..014c166 100644
--- a/Module7/packages.config
+++ b/Module7/packages.config
@@ -1,6 +1,6 @@
 п»ї<?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="NUnit3TestAdapter" version="4.3.0" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.16.0" targetFramework="net48" />
+  <package id="NUnit3TestAdapter" version="4.3.1" targetFramework="net48" />
 </packages>
\ No newline at end of file
diff --git a/Module8/ParserGenerator.csproj b/Module8/ParserGenerator.csproj
index 4cf5eb4..c10db2f 100644
--- a/Module8/ParserGenerator.csproj
+++ b/Module8/ParserGenerator.csproj
@@ -1,6 +1,6 @@
 п»ї<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="..\packages\NUnit3TestAdapter.4.3.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.4.3.0\build\net35\NUnit3TestAdapter.props')" />
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\packages\NUnit3TestAdapter.4.3.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.4.3.1\build\net35\NUnit3TestAdapter.props')" />
   <Import Project="..\packages\NUnit.3.13.3\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.13.3\build\NUnit.props')" />
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -12,7 +12,7 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>SimpleLang</RootNamespace>
     <AssemblyName>SimpleLang</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
     <TargetFrameworkProfile>
     </TargetFrameworkProfile>
     <FileAlignment>512</FileAlignment>
@@ -28,6 +28,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
     <PlatformTarget>x86</PlatformTarget>
@@ -37,6 +38,7 @@
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
     <DebugSymbols>true</DebugSymbols>
@@ -46,6 +48,7 @@
     <PlatformTarget>AnyCPU</PlatformTarget>
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
     <OutputPath>bin\Release\</OutputPath>
@@ -55,6 +58,7 @@
     <PlatformTarget>AnyCPU</PlatformTarget>
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -101,7 +105,7 @@
       <ErrorText>Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их.  Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}.</ErrorText>
     </PropertyGroup>
     <Error Condition="!Exists('..\packages\NUnit.3.13.3\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.13.3\build\NUnit.props'))" />
-    <Error Condition="!Exists('..\packages\NUnit3TestAdapter.4.3.0\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.4.3.0\build\net35\NUnit3TestAdapter.props'))" />
+    <Error Condition="!Exists('..\packages\NUnit3TestAdapter.4.3.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.4.3.1\build\net35\NUnit3TestAdapter.props'))" />
   </Target>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/Module8/SimpleYacc.y b/Module8/SimpleYacc.y
index 028e210..303266b 100644
--- a/Module8/SimpleYacc.y
+++ b/Module8/SimpleYacc.y
@@ -122,7 +122,7 @@ varlist	: ident
 while   : WHILE expr DO statement { $$ = new WhileNode($2, $4); }
 		;
 
-repeat : REPEAT stlist UNTIL expr { $$ = new RepeatNode($2, $4); }
+repeat : REPEAT stlist UNTIL expr { $$ = new RepeatNode($4, $2); }
 		;
 
 if 		: IF expr THEN statement { $$ = new IfNode($2, $4); } %prec IFX
diff --git a/Module8/Visitors/GenCodeVisitors/GenCodeVisitor.cs b/Module8/Visitors/GenCodeVisitors/GenCodeVisitor.cs
index bdef845..d953ab0 100644
--- a/Module8/Visitors/GenCodeVisitors/GenCodeVisitor.cs
+++ b/Module8/Visitors/GenCodeVisitors/GenCodeVisitor.cs
@@ -112,5 +112,49 @@ namespace SimpleLang.Visitors
             foreach (var s in genc.commands)
                 Console.WriteLine(s);
         }
+
+        public override void VisitIfNode(IfNode i)
+        {
+            i.expr.Visit(this);
+            Label elseLabel = genc.DefineLabel();
+            Label endIfLabel = genc.DefineLabel();
+            genc.Emit(OpCodes.Brfalse, elseLabel);
+            i.ifTrue.Visit(this);
+            genc.Emit(OpCodes.Br, endIfLabel);
+            genc.MarkLabel(elseLabel);
+            if (i.ifFalse != null)
+                i.ifFalse.Visit(this);
+            genc.MarkLabel(endIfLabel);
+        }
+
+        public override void VisitWhileNode(WhileNode whileNode)
+        {
+            var loopLabel = genc.DefineLabel();
+            var endLabel = genc.DefineLabel();
+
+            genc.MarkLabel(loopLabel);
+            whileNode.Expr.Visit(this);
+            genc.Emit(OpCodes.Ldc_I4_0);
+            genc.Emit(OpCodes.Beq, endLabel);
+            whileNode.Stat.Visit(this);
+            genc.Emit(OpCodes.Br, loopLabel);
+            genc.MarkLabel(endLabel);
+        }
+
+        public override void VisitRepeatNode(RepeatNode repeatNode)
+        {
+            var loopLabel = genc.DefineLabel();
+            var endLabel = genc.DefineLabel();
+
+            genc.MarkLabel(loopLabel);
+            foreach (var st in repeatNode.StList)
+                st.Visit(this);
+            repeatNode.Expr.Visit(this);
+            genc.Emit(OpCodes.Ldc_I4_0);
+            genc.Emit(OpCodes.Beq, endLabel);
+            genc.Emit(OpCodes.Br, loopLabel);
+            genc.MarkLabel(endLabel);
+        }
+
     }
 }
diff --git a/Module8/app.config b/Module8/app.config
index fcd0c93..3e0e37c 100644
--- a/Module8/app.config
+++ b/Module8/app.config
@@ -1,3 +1,3 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>
diff --git a/Module8/packages.config b/Module8/packages.config
index 23cecd6..014c166 100644
--- a/Module8/packages.config
+++ b/Module8/packages.config
@@ -1,6 +1,6 @@
 п»ї<?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="NUnit3TestAdapter" version="4.3.0" targetFramework="net40" />
+  <package id="NUnit.ConsoleRunner" version="3.16.0" targetFramework="net48" />
+  <package id="NUnit3TestAdapter" version="4.3.1" targetFramework="net48" />
 </packages>
\ No newline at end of file
-- 
GitLab