diff --git a/Module7/ParserVistors.csproj b/Module7/ParserVistors.csproj index 8d2fb0c108a132b221c54a9261e58911d0e8b6b0..7702ededf985b555ab49ecb0de83777510c63888 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 2512e3bed9118a8d696f474cc5225095bdd2961d..8baa804dbc9d87a17dc3530464d334b54a069ece 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 bf0e397e3c2a2f447c5c85c2c37c6c2e720c94f8..59b52e97d19921f8c567201fdd67a7cd3f88b586 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 5c550273f3753b14e027f241f3cec127a8e5f3d7..29371ec9b609e698aa06c9490bde6924a739a625 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 fcd0c9373599da3670c1db785b6d1ccafa462e53..3e0e37cfc8c7a59ae349f3d930cc162ccb3f4d50 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 23cecd6aea26171f30219d4cfc64b187a7fd4b62..014c1663d4d6aa4714a8f527a2c09ab71e83a929 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 4cf5eb428755095d56e794e8c5557f0b84e5e797..c10db2f6f8d61351f7a09b2db7a54842378d4c0e 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 028e210734bba55753bbed81a56968bfc159d8f4..303266bc0551992e4ae50a2d5512a96d448bf81b 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 bdef845317716b588b00eada6c01c8f8287066b0..d953ab080e8cda53196a76431a6d6d0a36d5e4d7 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 fcd0c9373599da3670c1db785b6d1ccafa462e53..3e0e37cfc8c7a59ae349f3d930cc162ccb3f4d50 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 23cecd6aea26171f30219d4cfc64b187a7fd4b62..014c1663d4d6aa4714a8f527a2c09ab71e83a929 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