From fff8354eb840fa2bed74444ff308f1b0fabb23a4 Mon Sep 17 00:00:00 2001 From: ericvergnaud Date: Tue, 25 Nov 2014 00:06:14 +0000 Subject: [PATCH] visual studio support --- runtime/CSharp/.nuget/NuGet.Config | 6 - runtime/CSharp/.nuget/NuGet.VS2008.targets | 101 -- runtime/CSharp/.nuget/NuGet.exe | Bin 1655808 -> 0 bytes runtime/CSharp/.nuget/NuGet.targets | 151 -- .../Antlr4.Runtime.Test.net20.csproj | 127 -- .../Antlr4.Runtime.Test.net30.csproj | 127 -- .../Antlr4.Runtime.Test.net35-client.csproj | 127 -- .../Antlr4.Runtime.Test.net40-client.csproj | 128 -- .../Antlr4.Runtime.Test.net45.csproj | 128 -- .../Antlr4.Runtime.Test.portable-net40.csproj | 128 -- .../Antlr4.Runtime.Test.portable-net45.csproj | 128 -- .../CSharp/Antlr4.Runtime.Test/BaseTest.cs | 1213 --------------- runtime/CSharp/Antlr4.Runtime.Test/Java-LR.g4 | 1293 ---------------- runtime/CSharp/Antlr4.Runtime.Test/Java.g4 | 1377 ----------------- .../JavaUnicodeInputStream.cs | 272 ---- .../Properties/AssemblyInfo.cs | 68 - .../Antlr4.Runtime.Test/Sharpen/CRC32.cs | 415 ----- .../Antlr4.Runtime.Test/Sharpen/Checksum.cs | 16 - .../TaskSchedulers/QueuedTaskScheduler.cs | 612 -------- .../CSharp/Antlr4.Runtime.Test/TestBitSet.cs | 54 - .../Antlr4.Runtime.Test/TestGraphNodes.cs | 1046 ------------- .../Antlr4.Runtime.Test/TestIntervalSet.cs | 508 ------ .../Antlr4.Runtime.Test/TestPerformance.cs | 1198 -------------- .../CSharp/Antlr4.Runtime.Test/TestingKey.snk | Bin 596 -> 0 bytes .../packages.Antlr4.Runtime.Test.net20.config | 5 - .../packages.Antlr4.Runtime.Test.net30.config | 5 - ...es.Antlr4.Runtime.Test.net35-client.config | 5 - ...es.Antlr4.Runtime.Test.net40-client.config | 5 - .../packages.Antlr4.Runtime.Test.net45.config | 5 - ....Antlr4.Runtime.Test.portable-net40.config | 5 - ....Antlr4.Runtime.Test.portable-net45.config | 5 - .../Antlr4.Runtime.net30.csproj | 276 ---- .../Antlr4.Runtime.net35-cf.csproj | 293 ---- .../Antlr4.Runtime.net35-client.csproj | 276 ---- .../Antlr4.Runtime.net40-client.csproj | 270 ---- .../Antlr4.Runtime.net45.csproj | 269 ---- .../Antlr4.Runtime.netcore45.csproj | 261 ---- .../Antlr4.Runtime.portable-net40.csproj | 267 ---- .../Antlr4.Runtime.portable-net45.csproj | 267 ---- ...20.csproj => Antlr4.Runtime.vs2013.csproj} | 39 +- .../Antlr4.Runtime/Atn/ATNSerializer.cs | 720 --------- .../CSharp/Antlr4.Runtime/Atn/DecisionInfo.cs | 22 +- .../CSharp/Antlr4.Runtime/Atn/ParseInfo.cs | 29 +- .../Antlr4.Runtime/Atn/ParserATNSimulator.cs | 3 +- .../Atn/ProfilingATNSimulator.cs | 9 - .../Antlr4.Runtime/BufferedTokenStream.cs | 2 +- runtime/CSharp/Antlr4.Runtime/CommonToken.cs | 4 +- runtime/CSharp/Antlr4.Runtime/Dfa/DFA.cs | 2 + .../Antlr4.Runtime/Misc/Array2DHashSet`1.cs | 689 --------- .../Antlr4.Runtime/Misc/DoubleKeyMap`3.cs | 106 -- .../Antlr4.Runtime/Misc/OrderedHashSet`1.cs | 166 -- .../Misc/RuleDependencyProcessor.cs | 789 ---------- runtime/CSharp/Antlr4.Runtime/Misc/TestRig.cs | 335 ---- runtime/CSharp/Antlr4.Runtime/Parser.cs | 3 +- .../Antlr4.Runtime/Sharpen/Collections.cs | 2 + .../Antlr4.Runtime/Tree/Xpath/XPathLexer.cs | 1 - .../packages.Antlr4.Runtime.net20.config | 5 - .../packages.Antlr4.Runtime.net30.config | 5 - .../packages.Antlr4.Runtime.net35-cf.config | 5 - ...ackages.Antlr4.Runtime.net35-client.config | 5 - ...ackages.Antlr4.Runtime.net40-client.config | 5 - .../packages.Antlr4.Runtime.net45.config | 5 - .../packages.Antlr4.Runtime.netcore45.config | 5 - ...kages.Antlr4.Runtime.portable-net40.config | 5 - ...kages.Antlr4.Runtime.portable-net45.config | 5 - .../CSharp/Antlr4.Test.mono/AssemblyInfo.cs | 28 - runtime/CSharp/Antlr4.Test.mono/T.g4 | 13 - runtime/CSharp/Antlr4.Test.mono/T.tokens | 5 - .../CSharp/Antlr4.Test.mono/TBaseListener.cs | 84 - .../CSharp/Antlr4.Test.mono/TBaseVisitor.cs | 64 - runtime/CSharp/Antlr4.Test.mono/TLexer.cs | 92 -- runtime/CSharp/Antlr4.Test.mono/TLexer.tokens | 5 - runtime/CSharp/Antlr4.Test.mono/TListener.cs | 61 - runtime/CSharp/Antlr4.Test.mono/TParser.cs | 257 --- runtime/CSharp/Antlr4.Test.mono/TVisitor.cs | 50 - runtime/CSharp/Antlr4.Test.mono/Test.cs | 32 - runtime/CSharp/Antlr4.Test.mono/input | 1 - runtime/CSharp/Antlr4.VS2008.sln | 20 - runtime/CSharp/Antlr4.sln | 145 -- runtime/CSharp/Antlr4.vs2013.sln | 24 + ...tlr4.userprefs => Antlr4.vs2013.userprefs} | 0 .../Antlr4BuildTasks/Antlr4.net35.props | 9 - .../Antlr4BuildTasks/Antlr4.net35.targets | 188 --- .../Antlr4BuildTasks/Antlr4.net40.props | 9 - .../Antlr4BuildTasks/Antlr4.net40.targets | 182 --- .../Antlr4BuildTasks.net35.csproj | 83 - .../Antlr4BuildTasks.net40.csproj | 84 - .../Antlr4ClassGenerationTask.cs | 367 ----- .../Antlr4ClassGenerationTaskInternal.cs | 428 ----- .../CSharp/Antlr4BuildTasks/BuildMessage.cs | 120 -- .../Antlr4BuildTasks/GlobalSuppressions.cs | Bin 4012 -> 0 bytes .../Properties/AssemblyInfo.cs | 75 - .../CSharp/build/CodeAnalysisDictionary.xsd | 57 - runtime/CSharp/build/CustomDictionary.xml | 9 - runtime/CSharp/build/KeyReporting.targets | 18 - .../test/rt/csharp/Antlr4.Test.vs2013.csproj | 11 +- .../org/antlr/v4/test/rt/csharp/BaseTest.java | 29 +- 97 files changed, 60 insertions(+), 16893 deletions(-) delete mode 100644 runtime/CSharp/.nuget/NuGet.Config delete mode 100644 runtime/CSharp/.nuget/NuGet.VS2008.targets delete mode 100644 runtime/CSharp/.nuget/NuGet.exe delete mode 100644 runtime/CSharp/.nuget/NuGet.targets delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net20.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net30.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net35-client.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net40-client.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net45.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.portable-net40.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.portable-net45.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/BaseTest.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Java-LR.g4 delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Java.g4 delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/JavaUnicodeInputStream.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Properties/AssemblyInfo.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Sharpen/CRC32.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/Sharpen/Checksum.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/TaskSchedulers/QueuedTaskScheduler.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/TestBitSet.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/TestGraphNodes.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/TestIntervalSet.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/TestPerformance.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/TestingKey.snk delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net20.config delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net30.config delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net35-client.config delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net40-client.config delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net45.config delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.portable-net40.config delete mode 100644 runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.portable-net45.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net30.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net35-cf.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net35-client.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net40-client.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net45.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.netcore45.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.portable-net40.csproj delete mode 100644 runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.portable-net45.csproj rename runtime/CSharp/Antlr4.Runtime/{Antlr4.Runtime.net20.csproj => Antlr4.Runtime.vs2013.csproj} (83%) delete mode 100644 runtime/CSharp/Antlr4.Runtime/Atn/ATNSerializer.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime/Misc/Array2DHashSet`1.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime/Misc/DoubleKeyMap`3.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime/Misc/OrderedHashSet`1.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime/Misc/RuleDependencyProcessor.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime/Misc/TestRig.cs delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net20.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net30.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net35-cf.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net35-client.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net40-client.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net45.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.netcore45.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.portable-net40.config delete mode 100644 runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.portable-net45.config delete mode 100644 runtime/CSharp/Antlr4.Test.mono/AssemblyInfo.cs delete mode 100644 runtime/CSharp/Antlr4.Test.mono/T.g4 delete mode 100644 runtime/CSharp/Antlr4.Test.mono/T.tokens delete mode 100644 runtime/CSharp/Antlr4.Test.mono/TBaseListener.cs delete mode 100644 runtime/CSharp/Antlr4.Test.mono/TBaseVisitor.cs delete mode 100644 runtime/CSharp/Antlr4.Test.mono/TLexer.cs delete mode 100644 runtime/CSharp/Antlr4.Test.mono/TLexer.tokens delete mode 100644 runtime/CSharp/Antlr4.Test.mono/TListener.cs delete mode 100644 runtime/CSharp/Antlr4.Test.mono/TParser.cs delete mode 100644 runtime/CSharp/Antlr4.Test.mono/TVisitor.cs delete mode 100644 runtime/CSharp/Antlr4.Test.mono/Test.cs delete mode 100644 runtime/CSharp/Antlr4.Test.mono/input delete mode 100644 runtime/CSharp/Antlr4.VS2008.sln delete mode 100644 runtime/CSharp/Antlr4.sln create mode 100644 runtime/CSharp/Antlr4.vs2013.sln rename runtime/CSharp/{Antlr4.userprefs => Antlr4.vs2013.userprefs} (100%) delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Antlr4.net35.props delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Antlr4.net35.targets delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Antlr4.net40.props delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Antlr4.net40.targets delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Antlr4BuildTasks.net35.csproj delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Antlr4BuildTasks.net40.csproj delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTask.cs delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTaskInternal.cs delete mode 100644 runtime/CSharp/Antlr4BuildTasks/BuildMessage.cs delete mode 100644 runtime/CSharp/Antlr4BuildTasks/GlobalSuppressions.cs delete mode 100644 runtime/CSharp/Antlr4BuildTasks/Properties/AssemblyInfo.cs delete mode 100644 runtime/CSharp/build/CodeAnalysisDictionary.xsd delete mode 100644 runtime/CSharp/build/CustomDictionary.xml delete mode 100644 runtime/CSharp/build/KeyReporting.targets rename runtime/CSharp/Antlr4.Test.mono/Antlr4.Test.mono.csproj => tool/test/org/antlr/v4/test/rt/csharp/Antlr4.Test.vs2013.csproj (80%) diff --git a/runtime/CSharp/.nuget/NuGet.Config b/runtime/CSharp/.nuget/NuGet.Config deleted file mode 100644 index 67f8ea046..000000000 --- a/runtime/CSharp/.nuget/NuGet.Config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/.nuget/NuGet.VS2008.targets b/runtime/CSharp/.nuget/NuGet.VS2008.targets deleted file mode 100644 index a50c8a66d..000000000 --- a/runtime/CSharp/.nuget/NuGet.VS2008.targets +++ /dev/null @@ -1,101 +0,0 @@ - - - - $(MSBuildProjectDirectory)\..\ - - - false - - - false - - - true - - - - - - - - - - - $(SolutionDir).nuget - - - - - $(SolutionDir).nuget - - - - packages.$(MSBuildProjectName).config - - - - - - $(PackagesProjectConfig) - - - - - packages.config - - - - - - - $(NuGetToolsPath)\NuGet.exe - @(PackageSource) - - "$(NuGetExePath)" - mono --runtime=v4.0.30319 $(NuGetExePath) - - $(TargetDir.Trim('\\')) - - -RequireConsent - -NonInteractive - - "$(SolutionDir) " - "$(SolutionDir)" - - - $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir) - $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols - - - - RestorePackages; - $(BuildDependsOn); - - - - - $(BuildDependsOn); - BuildPackage; - - - - - - - - - - - - - - - - diff --git a/runtime/CSharp/.nuget/NuGet.exe b/runtime/CSharp/.nuget/NuGet.exe deleted file mode 100644 index 9cba6edbfc43ef7cc1ee121d6bafe5b37cd98f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1655808 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%0DA8VrI&xWQv!Qc51vpt7i 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℞FEE;i+~j;ta3&cdJ+e;5C3btpq&hFnsZ9rfvt zf&-ww#QT$)&5nXr-;-81(ZGz0YOMGH^^Di?pjWA#4eV{L4f5eR1Gy`c?~cm)+3zgWZ`0>^S3Q`D$2D9<&#MvKs70xO!(YCW$pB z3CFhO$H(tfz8Q{mX*i;kTY6O&e13FfH_~o0!jNV|P`23nj-YMQxC`TX`$T=deq}77~1VYr!W8$UF>kUQ0AS2~4*o`hK%!QtvjH{ooLz?Y56;9)7%cyS?XFuJ56BsE%!?Jn*+z%q*0x zhg7ysRBIw?Q;&FmiXeG3Q+Z_9>YnVIe9I&5kWlfko7xK3zh!o%&qLDr*5y9n+K=Dh<^6u=nVtn)3ttCe80ga zJ*tH9TAuN5K&v?me%fL`ER2E*0-tg6V+JpgJ?jk zHO2aSWeGhb?cHF^qBF1e(l;`Dvt-Hu`5dFea&!ottmiV;b&M;c_;?1!e&@)f8yA>c zw6R+`0CUx1+LX3HgGc>^1>0A9*t;2ExC)KzfW6Ox_#hM-p^L=#-!jAAyX^gL#jW>3 z{qr_r_CiPY!9J>rWqz%mRBe8@2ZUBhNK^iuqo z7x?E=%r5c8g)LN<=iMyd1Jgo9$c#x_&8}iKYq#+ei9SlN=4@7w4{iD7G~u95_xuh| z`AvBAOBsbMHr*vJil2lZQy7zSs4}C*ac`CVACi9dS&ZGqZ?yImsNnanFJ))$*pDEV zD9u0SxBh4H0{2hkzMDt<2P6{vS`qFM;g1kH%YLgqBax_~@Sj>u?pETbEPBILb4HI7 z|2|5~=r_Qju!GfdzhqB42D-_Nwet|*4^iHR-+r#84s=m%PUqUuIaR_ln*wBXAc; z;4gUXX(y?t6SFt*=6(syxc*E_q>Buzb|#Mkq59AFQn$Gb?wVf2s@eo^gYT{R!LQ8? zekE-76-wO`Ds?syDXOvJr$IJ;#>1;PY@U(v#`p0%>AS8n#D^}}7u@G%n@$8uy6NQj zw$we>@+H}TqLQ4XLEom$knvJvglj$uesmkF5F*aGxr=DS2AdzFp5ooooY^k$_4#S( zBt6t2+YcGo1*d=-IVl@$f!eP9P5vjm{Dlw_WB*!&O3b0ygb2~Pk1AH`jdgjFZjA6g zj7umzabF+GJjqS*HB(x1&qxm#t@hA5<`GJ{xX@%c5tOTmuAbgxWC}uK5IPTe@0^he_f!4TNP-Pjgp#*y6vF zHVxEcdQFR)wL)o|$;Zl5_H1+LfIf?A zHEEA=Rmy&)3i~Htaa1Oy>%o$55K^wC6y52M0hED5A+y7&SzV|GgUsI? zLYVrd)`uvK?W9~^^C9wpVaKKt5H&v0%Is;;B zt>rlqRL%NW%^D?ZeG(gFihm<#hkc{18^f%=`@`-B7JY>t;FrxeoWkS6;<4Z8CmpA?n+?>%ls_A-ROFLNb+f-vm}g~$ zSyW?LVXiVWZBsZ?igLBh)-t$={VtU>-xieGt$?O_sXb6rpt6`2JbhoOqru@S7mJc| zu{U`TwU6ziA8b7BYrpMdFXflX+P@K;Z|k;c^{~nTAr|4czz{!6IfbyD2oH+D=U9Y6 z5groZFA$n@3n|`2DSjB%xTwa8|LTi-Qm0C`H~t9exfnTuem}3!FTFzBOS%nk{zky~ z?-ttE$F@KX&`QGEofy?N+Dlr>^#si7M--6x!IAh$rjm4aH>rkeuJnz26(9ETxY*hw zEBjMTP88ecmm{x__}aOiUU4SN^~roqWSetdfgjzUtjzIC^JzKqXEKh0AFjF9t1vTB zL91%cX_>|cWHVg|hIt!Q37U94T47t1!Rs+sk+w6o;BN)dN`94nKt@VSkWtw*IJ^}? z%TtP9iRep2PgAe1AtuvON``Ma7=@!hZZu-!=CHbm>;SbpuvBQ9^9tpmC#wOX8p~EO z>9V%@JxpP9e!>6j%)h9{@|}&Of%SRf&&eGFCNz$e4?hsIlObV}$F|a*L23u#mE#8Y zgmOJ?6MBM0w5O|(RbOJ|k(#nU1+o@;xWb#|LUW*y?q2z^5rnA5@*{|UA+y`> z^l7W{>3TI1>pP&RdVtZ`0chI8zNdEgIPr}gXs;DspU~^ecNSwGjVx%eT|M&xnA=@Unl%jVAJYk7LVWG&)}4AFy*yF zKs`w+;ukPHV* zm3fmH?IRk9mYSOv;HhN@i)t)Gc#|2J4$IEsfRAa?#SXtcMqTp#>=1Ejz z#q2y|ayJg;cgup``SNQcA5o1}XpBm8S7^6Y*xafRWI#clkq)97D=tay)&)&&OhZOvZVEXNk!DnTN{2hWvEQ zmyX>weAk{b`sntT9Nhe^`jp=z%HsR&yx0HYBT+dc-oGl|za{ae?|9$B((mV z`N01_6#n@Q{A(RsRiL&jc-q^7LJ)b{x%K!QsY0^JP}{2q^+l-cJnOIvb?mkQcO7{(d=Vbm_&h0#&WQUTmBo_#JZY=0+ZsY= z=&s?Vzw91HrJ7mHx7FlzFav*`8($I4tLm@2JJ_6Ap&888j{f4`GtP*&MlA}^0A~y| zCx5ERX9f=P|0RM{{>+(PzUqf|f4&BJ^_SQ;D;zt7FAiPsL-o@(c9?$FN4w~g^=|Sf zYKU*CiFc4z={H1cO0SiiT@yKndpSpV0lVb_#3%?LoMa5J#wuN2hYWujhYIVy25Oyj z=pQ1gu65eSJ89eFqMn311MZV-MR%DSC3M2Rv2W<2r zc`A015ABzhw!g{R3&W*5IE0|57xZRkm3ek6QSq0jRna5JV5scAOiHaenuJ_3hreUc zy*$OI)5`Aa|4;FNp1Yn1(te3QZ}kRbFrMBkDG5iZ2&C!JnXI|!|3>fUz{JlheQ7z- zy!!G`wsE18KJylSfFSWw(z=c=4)ej-)}5{@<#mYbO6RE#4KSyo7DazUs*9n!jB>nA z^M{K{{m0Tnu`bB^`BoPhMDxul)t3DVg?)W#4>~sqdKsS0;2UIZk+NCo;XOcByghp9 zoik%~n)j491E($SiN|+T?}PK3i)lb*PqncGN7CbJZZD$FwTUSIS{vJ!-!n*mGJVw1 zmyTOY_2qnVu*?5uqPL}x$gS14lHGZf-gsA)Cl?YQSActCr^1wP`W90C);b$1qj4$H z+<`~B0Jb~SI_9LS(6P?K9!-iV^`>JLciuxy!UB#pgOz|+UPcDx^`}A zcF=Boud|4N#^ds8{z;^Cn%_haDc(FBH^82==Zjum*-3` zXU`V&dJFm&TF~!mLH}0^`r_L3`W)VZeqjsxbuH+Rw4m?VKYhFxwxHkJg1+E&G9 zf__&EdTHMDat>}me@hGc4K3&owV?OUpFZBbThLEwLBF^K{n-}uc>~kOJKTc)rWW)M zwxIvG1^uxW^np#M*XO7f^s`&guWCWRrv-hR&8Cm{q!#pdx1itMf?nEudimS6pr6`; zet8S}y)Ee73#O0v@D}tBwxB=Kg1+;@>E*wr1^tsP=#R9ZcW*Jh{9{|t-`|4%Pz(BI zTTUwV>~|&Ghkp zyaoN)7W91=O)ux{7WAuH(ATw~&)ar-`A4;&kF}tGrUm_x7W8f7>Ek`L1^weK=+CvF z@4Vgg^6M?=Uu{8uss(+w!Rh6{zXkp77WDGs>E#^Xf__O0`j=YJA8A1!*nawW4{bqz zQw#bvE$DZ(pg-AyzRi;9^*Ou+{rnd6yIRm+Y(d{{hw0-zy9NE;4e0}%cljUYf=202 zW9R8*jEl5>|0)JVrQ~A5HLME{ba&VW*-D4wUYBaP<}yqn+CsY~mY{Zh9Yk6NY^|a9DGNE1FnOq zj*Dt6=4SR|Zf15R{uWHlp>((xa1Ec1jGl^Z`_+U^PeEmZ^EKF{VQ)=1Ez9nvizeOV=C>ReZpH ziHzlf`}p4*?6m}^KhZTeuqCut@UQUt8(3Bg9^|*KF=@%qAzaHl?ipJ6x*E4X6LJDt z<)=_&x5oLaQT(x4KX@;@2ib|k%37IlmANbSktiG1*W!~AP&`a)vqgSX&l!gj$*^&~ zW*|5pECG=Gd{-hNpBT{Ujc$wa2N(tuDI9rXip-=KK9gt7lDU*~gP9klwt8+2X0G+_ zfn}R%og+BY%4%O{{SZnUwh_ioq0m&?$Noo!wz57tG%bWSciG+1+_{kHH<3a=cPXl| znlCBvZx-L?E=4t#pS#?p;OQ25dV#zj7qzK}pS#?(;OSO*vbjr9n|j#XrCAMFK^Xa0XLrULxBRX1UT(N_n;E%a;(=Q+#dYVE^#8%8|0)asm>ErAVaJ zv4eWi(Qnm}qHZ&v)xO@&`jL3l4Ud(v*Am0fsg%B+E{p`fic#>`>lA5MLqEQ*?ho6? zTxkgO=5B>#-=<_+g%#CUNnoqBm2+P$IaYJKlLU49>iZ1JR~ljutBGhUo1F@hak!Gf z3MbPF&7ne6-&0gv3soH#)mU+r*-*|7^?%A7X z)}6ZTwYtqGsfK0D zB}Wu0wA!QkA!MA7jG;H+C^?qGt9H7-#gWHKii{xLpe2u*FXA1=AJuxTjriO`nSwIE?DxcSuoel zLyK{NZTTS^emaMt{1+~Q<88#3oVoP7@wIq8dH^MIlNn~rr(`cl>!kg;rO`t>(w*xg z8Ugt3=d}nfu3K5JbMz<`?Ny}q9M&0@OA!L7Y|M}EH%)XFgjOJUyXkQsG}#WAkKWTB z0||UvR}Q-Sd|Q`>f5)Wo1OIh+;jSgn3ltth9i~8AjK%i!e!R9|ANcwU8%jYT`F5W| z{0qX^-mLm&L_1i=)?an7KwV(eg?jq5>sz)r@-8IKwL4&h-wFjggM5*);x_swkRu1_ z4AJxHi*Hw9Q(Z3i^|__IT*FbT8604PBs^ssRC@{DsdTJ48De&I657< z58$FHfa;BVPFke1yG8ALvT4w}G{v|Q9E9w5A-jH@>S0~du*KkIl}*^#>#3RRG%N^R zAMMNoQ&#|~^2e*nYVU%u*c89)mYBPBpkU_SdRZE0o9#=!Na?A6gy_)uU4)yySY+jb ztl`@@K4Bad(S8eI@LHVu@^To(7#SbgnOSRQCw<|F%ifq3b#o-Z! z=Jzp^;@h;2;H89{Al!n@FJXt*4D6}Y7HsZ5M`PI;)yhq-&dx@#j}x%I6;Y0hYOHt@ z$`+?Y)|+t#FOxwwGA~hD<3~*w`_VEqR$HoZPoYip>z$V>{`K`!lpE|HeiPVRz4r2| z!Ml<7Zpm|;u&fSi`L^Vpy*NYnaj?LK9M9d=^3?_xsv7w8NQU{qg3d?RbPWm#l3*#U3ZywKn?9WO)*tNPgt2<% zzUloUCB~2ZW!d3sE=VZa3rg;9vNob*wvyh9F17esl{1W;#*_~>eQ^l%Keq?7g02By zx3r$F{`KXP-XE=5@cwD!mEy(7P5T37+dKaO{M9G)agO@j zrTj)UcZq&Nw>_T8BkzBJI=(YtF2E4nHMtgVZL! z7T*KxGM%etH~b@n8@-Be%D8IM=yh_bo{iolmyXPi9zcy5*WuOC-R07;+0nbj z)tT4P`{g=Bu1DlLRIY!^b(mb6EyH!VTzkoNgj{vGR^nR7mm%oyuhnY$((||Q=J;A# z%Q`1ntK&!FBR`d;ik+UyQWf^@xmLfuyM6`8j=!8x`3VhM?st39j5sFMs^hPKo0b`G zQ|Y6^-E1ngQExr()=3?oycX&rs>}bC4WpN2fG%K$C6O z9h6r7!dPuZVrEAc?&zEA#~=7KrrEo*bAL(Q(HZ(a{M5a=)?ZUuzEbIM$C5}cU|~pk z#(Wz@`2!pMjz$5-f~7W?a$I~|jXBnv)t~m@0AzejGUleEvIR@8jQW$IS#F$CNxZZmw`ynC_?oac_>*LNGWJ!04{2F7^j*;5TheSa zsCbj1pdX(kV}@?K>+lmHM)*n9F~W>)AAX$Sa#X&z=#M7Hl?eAf{hbH7iKI zJzkyfSKgq|3=Y_KXnQH>7@cN9~h*OlCNJ|9abC_7|D`1twGJ zg>S{XCrjlp=`&KC<4(*ZGDUbZpY>stzMeMj19Lk=wlT)49@w z`9kI$68m1SqF_f@{JK^YY2G|hMV;-8=10wT^JFMJ?X%0~iMcdQL-w}!^;XKWJK~oR z`7ou5eXJ@5^OviYE!XCoLY?Kg3zoTE@X|SYdKjEhcDv$^XVcy3EHlS{93e*3Xe26i zDy)w=*QI$9@%L7|7dwSv`AGeE&Wa*UeloGv9?vFkBj!Qd>kNFX4~n{~tMvPVtChzE zm_IC-dv?r5FbkIGa9MJe`6C-L7Z#Ww-GG^w;l&hsl@Vq$UxV7|O2_spa~jExi)t(z z)B1DMADS$#+X$7xKGq0i=tDw*o zlNHLo_cMdjk)%I{nha&DQ~EEC%Wiy@hHkx_`UZ!|R&LwC%}AZup&@HKycc!2ie5q! zQvZ&5WHux1XQ`BZQhCTc-W>EF*#d&^BE1HM{U@82B22qSb{;0(PdXl<5?^+nItV-{?GCG)>3eQG7tM)^QJI+LR6?B`PE5UWk9auFccq^gBtsZRcPSJyhF z`6eUstrV7p%Q0j4s@cQsDFe}>Q{j2IKKlS@{K0pFBDDv{Q4t_!Yep>nKZf0gIIeL5qNebO9nkw7R zoVOa!I^V3v=GZ`Fs^{RKc z+vtfcvd>Xv^aMQkTLUUyoLwfc$m^K^wnp;Y^J+Bz7AVuh+5`|A|R`*5p+gJKR&eF!(+*wf1g@>1dX%$S~_cR2fv>K^K1^(%=siE0yC|Xj0nuE zk9W^At32M#jK$EKkx{N#!)5*2d?|oi)73h5*mL{{Dy{7ycsQ9Z?sNB$we%Suk7Px7B7|lReT7T|9xvI)XI#tJ>bDCYq0fa0<4g0 z3|X@CL7yj$oDYg9EE1Qrd6nSR`2GSszfO_$8P zRkAZg73-zN*DGOK9BgB%P6_W{WocVku}dI)ed!FgrCt0YajH98-;1)+Rf_3pEgn(% zZL@_nTIEW5RL?STYz6*w7P22@>iejavHYi#h4Vz1@>t0-of-oy-b>vf zlEE@4I}b*bv$8gAi^xQ}6~0XxeOt-%tIII97UM{yG6S;Be-v4g$i9_5?P-6b+vZZB zQWw5Qr3#%sK)!EMi{DP)#`kc%yZ&vM*|(_8=1;x^=GL~*VR0`<3Cl`GhnYV=*LN-c znCo-NT;Dm9=lV*4J{{Lt{?*UG4|lbVor|ARyoeMHYi6;O8KQWT=3m)Jp-0aPukuE_%8Wo zSkCxQ_%`X>PhbsB$({r1VR}aYVDo?SwlQ$85IUOiLXI^>GaN@eeBmx9jn)|ij;~gl zG8=c?^+cHKNs|wjxBRt1Pw}lO(`kvqKC!zJs-Zv(v~pas=dr67z6g2sag%?1 zAum}`-_Xk{U-nDZJI|O<)z2^4^H_8<9Tp-xIyNikl|Y}Y|3wG(p^YYGc+ASMVY5Hn zVt%oKNs}QJ_XJpHWxHM|+uKs~wMb`8U>Uz11|hjFBz+woShjWW0~!s60i<1MCZ(aD zD@gQOwofhA7MR}laXHRj@g1PWub)Y5z2%{kkR3~C)3oY|{5}-s1J|T_ zsoNb(GhM`y=q5PWoguAy$_<4#xBq5qEZxz+syo@XvE&1OPsijv8^vml?(Jqb zPTO%Et9obl%v`Y3aY?3l9;8!~J!Crs%`XNLOkd;&!PlDp+@x&De;nG^$nW}_NxD`} z#!1%(`CS=N6;Vp`H$IpYv-QziQn(DNtaxdt8Z{({)11^zTk*(KF!#9C$BHyq@t)#; zk~SOI7u277+^MSv^C*)sOUdqHz7c&joWztGA9k7WJ-)Q^R!LK87&WiS^ik+^c=c$enb(HrjtS6ek`W z;QeKK*CX-oHh6F7{cHc4k@Dp%zAMix=acZt)8e~E8^!nYCGRJ>JUNT+7mBY(BJYD6 zynkHpdL;ZC^{z+qewW_$NZ#+)yB_|1TvLxZ;GN~sC*?s8^H3grPVbq5< zi3MeW58UAcSB#W+;Y(AqAl?i6OeMII$RAg?&j!|YHiO#E&Cz2>aQzyxZ1j@U<=9$T z?dcqSDkV&1ZS|5g)Ul~64fUOrF#4C&m9k#GOB(9D)RnTnloCd#uzsDf+ILODC!xkQ zcaXGYvgtiSWA{zkqhvZ?gEQLoPR3?#4c#Pv*M*iOkEZ|ONvZYh$eo3cOjf(eB5ya4 zHKH!!1l`~bWN`;5t(J9H`vxP|&1*rH`qm6ldg|xccd;~fKA*GDeVrKDwb9Ur?@<;w z<9(9-n7)5ovb~{9#P-zBO~SoZ;o_K14&lb84W~Wrhs_9r?ZX^5b3uv&&{cxf76$%dEP%epan`W3zIVE8_G`oE@&Oot@3M zgzhw0@nVH%9~u>A=yUSa7N4#+>dKlO+0da{GOVwx*M~ma3Vqe77{lj4rPf>w6hm*6 zyM4{E8r5t6wI=$K5S4f@g`hSJA1GgJypH#UGNSCaw>@}UM5$+Kv^t``xoQAl+aR{T zmr7z=L7^%xI!5|I(KpEd!P%jMw)Hi3H73(ZHg05AB4p-tiV)A`p+1%g^^57=&z@J7B=^G1i_eLJoA@xNtXMtP$e9jO<1(b_>)tiPifkMgN z)L%~Bn_6c_O0}EomlSZ62UxFFGTU5TZ}984jraOlJmT%iQ8?P=0=i|7wPs%Q)@Es5G_;a;Z*xpXJ&q?avpd|I2|nz*phV){ zA`P?wOD{^HuLAKBBIvDl^i-$B>Mu_m**fdWPCgpZfpL4u$@L7AK5AdE^8tQsKV#NDudCyt8Y|uz;f$fP`q??8@o(AcXBXyUR6ntYO2$@gS*oLAAB%WDT11<=VVjao zSSI(m-9B}59;-dtGeNBhgH^$PSEhS?DrSeAxvif1g$c&*%)xEQZ4I+E%Q5g%XC6t* zCs@8ySRSIU*`Yl0@)ZS#lY~2jQG75-CK#DkU9%G{Fw-hknDN{B=qE;yh=+MeR(ao{ z&USntAwu2`&~M3C)k?fSZ+>hqo8#{yh;fKiW0XS?`F+b1`wVb~W-&Vhi1(r_UcZsE zJfb#6UtvX7kW=2qNe@qV7voIRGq9{XU|bOV0QpI{r0sBZTAEI4Ps{F1YeFM0QtelT zePxQI%~F))j&DyV?aNHsp-cF#`<>pClb7UM-lp_o=Sg+rPD^hFEIJ*B3La#SJ9GXM zC=yFFa4X0C%y1`il zA!rMM!cI1^&*S%prspMM?V_??EDZjp5r3J5*T{AvjP6EXYp|Ti14G+9;LbLP<6V)$ zVrvIWF+s3kp{=PdV5fG!S1dZ-rfB&Nv2~%o#5zO1Pg4mr+oZqHRyzFGkt=Wv2LGmc zOI10poRG$s^00Y!Zp9?_lCOJOGO&TQ8?` z9*yn^o_&kk+}~-unB|sL&j1Zk!kC$z?tuLPW#b6M&`oqfvc~oF5K>@qppdL zE68*oCdjIckxO(RF@~+pkS{r2AB7HHS1Kyo(z6-xC)X5E(1tB^eVF z1@6Z1y4&z#M{tJM#}E-V6isAL_i>yauTL0DaYUxAy9(!2yw(b@=az;yWw7Kj-PHui z@yaE-Pa0z?UY~*vUe_op!%GC=Wt0@Jds^Wo-xHS>5V@gS|CHgC%XFV7NRC%7(S5-fQ}OyD zbnyC;qB6Wh5MD+}@%niIuX~D!$oB-hh_f2^Sdl9k6Yni>H-^`}h8H_{v+{Kwlqx*H;yl z;U$9bGD?cqFAI3h+O5!j$@c_1k2AbBD{>`cg8jxBcVl?{%J5?6afa8|5D_*MO=M4Z zBTkRk*Nvq(BGcA=1Lst{el5J(&iK`78D6{@XBSnTM3fml}mKD8DlD5--8Zbw<{{cO9bI%loYRZ1-wow zA|l@t?8eRzIlIV}jERpFxEm{9zcIW%TEOcLM1&1R6WP;!AE(Fb2gXtyk!kDh#5onO z-wLk}m2TKN!z-8Ren^lUuUw+L%NSGf`Vn;S`mv%iyhIRQMoIB{uz=SGi-^eg1iP0r zyuMK6O2!2Hk~8kc@OsGbV#je-zJ7v;u%T$Ue}$*Jn}^41t+5nGWZJrWa8AYRVc~W3 zHuv3};g!pDKP5r#dULpuDqojB}Qo!r>A|moV!7k_wk)IX0 zk}+{rfx9uh9yPq!;hN#~3q*tsMHAW6{Sv3g>sQ879Fb}3evNY~UXKZ{t(J{Hl;M@j zboUV?$19iU?l;C%ydHoKUh5Q<;U$9bGD?cq;|08)Dk37^6YT!X@Y->x@HLQ(iBA={ z8^h}f!|R#?UcW&^*ibZ)J>73{db}Pqmg0y^TlWyosd)WPc%6LeBj3&N%4NET36kTL zOLUJIV=7*cLIjmiG^>0OGc!?mq zjFRH@=K@|26%mo|33hR1h-@`nXul+5;>!i@#_;-!;l<9U46pTw2pftfvZs3yr^hR( zh^06pd%77ArsDNi;q{@<-}&AQuUw`J36kTLOLQe;OvS5Bk+zMsD=NcF1mR_r6tBM( z@Y=12hs~>z~4F_l|Gf zo8gtqbh8PP7QBu7A)e0~9o?u5yhR9__yd-0SeI*%p zV|cw_czv^gR}B$iL(xR`bp1FzUUQA5I3m;5&BHkruYU`#r%N|{Cc`V2>E;t8$19iU z28=NkuT7zY*Jg^!@Df3I870MQeJi}=d*WLKM6N61B^eW}FaOtgy=Zu`vYge&%@Gkc z6isALw*aTdYoW0eM`YT%EpSf7D`*3+TYlbkdWKgn(``wR9IsrW+sYVI@!A?Xcx|Jo z3@;Icmr+u@nETD`cg0hPq!nFsdz=g>-?b~?VI71%XB*tB*!b4=yo>7RJ>jS9lUl?REC!b!pkTrUgcJJ z$@c^+kQpM|juiS6k}<)WUdG)RUKPWO)w&F?T@evB6isALw;N867e~WjDUQgVjwQ%x z@ahm==RDv3>kO}4rep1;fLAWj?QV>zc z8D6x}30CbgL@q0GC1ZlM zrHs2Vyk;6+tP*8-?T?7Cp=cs|x&v@}ybd&$;)qOJ_cEMQ@tP&PmiC?7li`)ibO#Y6 z$19iU4mQSAybgg5UWY0w!%GC=Wt0@JO$vBjUqnQ{Cs?t{5V@(ym5d42mNM?f@ai$V zSS8BvIt&qEL(y@Cs?t{5P7l4m5d42mNM?f@Z#EFzK^UD zWq2Kph_In(B73@HaC*E}8B1|QrmZ^`=TyAr2(R`n2WuH#xlDH)L2|ruiSBq~OvUS! z(822jMP+!2AiRu{;#Di)HR<~(-xI7@Wr$3wkCHLL+ET{d7+%~J3SO)dWq6&4h_In( zB73@%aC*F6Wh})JnYQj^oKx}QHqM@fn}<8k&G5=)x>pk<$19iUPBF$*y#5C|c%7=K z3@;Icmr+u@<`wW-uzTSPDBlyTSY?QuQshd;1ZztfcVl>QQzUq?N|fRC8bpK*MHAW6 zy%wj(>vhIb9Fb}3PQy7BFK%J%S@_$(T#&<(%XF&=k~4CN?sQ{J#q0IZ!Rrl*%J33F zco`+di;D`g`gm~>5&52A#VSMOsv=i1CRkg_xEsTZD-FTx{sLZaL`2w7G?6`>!|Cxl z!&r(VGHuwDDRDu=KYq1wB1xoiV>qYg{noOL0V|t$PQ~sd#NGygq;aJMPZ#%4NC>2$JKK zOLP|+V=7+ngbrTsQdEYQ2*S%KDPD0AuRRKFv3yUkLX{!1Rgo(h6Rb65+>PP2o#Dkw zQHIw=hzJ{sCbFly7^lZ;!dQwUGHu-@IH%$@D7PP2z2U`5QHIxh5fL^N zO=M4ZIZlt)`;4VHBGcBrALmrOmI$xYF8}mvv+|Y8bRQr{j#n#l}BnA12= zl+f-d#h+%|qu(^!P=xVo5nHkgG&v=nO1U%(p?#mTf{^nETb-#k-(^ zY@sfJW~Y3;1)n!Uo@C^3Ez4a4W;xYiIJcVG^f{;&MCU{W<|k2mWC+<_&Y_tcOm;=? zWCgAC7yO&BikYvidtuEFv6It%3OPFRc@4kA+hy`zjy!Ld#SEGx5;>ED!HcRF(2?A} z`C-JYk=EDfF*v(@{Tw-DQo!)mzVS~Xn9C?Q2kl{VpC-D_p*mztMSO;ru8O+|ActQC zsp2MZaz=!w+4Crw9S-*~Vv?>Lh^P*$+mhm`&9EI+Gp^*}*nhJ6T-i|6oG3p_luO?3 z57W$8Ut_&5Ic?%?4TizY;DYz@;P29~f9%^TZvA85@ju_yPy9JVup#wZyif+)1D#pr z0*0QjA(Hz%Y#E}&#*vxpF)VgUm|uXY@~FEBk5eT44Jj3&`y#AG>?lG;X%EQ^oqW&P z`O(CK1mi)vwC!QX>r)R&s1;R(@*dWEW4bE$*G>+vM3goRZ$!eZFDv)ubF-Q#Xy_x&Pl!RPS_*A4Gh+=V!sHzU1xx8hYa zmupu}d$*#zn*XE>&u`uW#qL%#$IE*nm1^tN@ z^n>@EUe4!Q&^uo`z5f$h(7)e;zIeas<&3qUKh%PL!2Z+A`A7@;^DXGd9x%O}FSVeT z4xHZqsV(TYwV=;?+4OQ6E$H{QpznLo^l~n1LBDrHy6np9Tn{(i^n?qxcW3b>nzNz@ zia-8~t=`ZM{zij!j#y%Mr(i&H`^12zyO!3hykPtIO|%`|9q}kX9jVQZE<2aT{W92v zLjX35FjDPS;Ow^B)H~chxG~=}qUNxtt#fD=zh!?R1YfrU(WtY6qmEPzHkp+p%(rY! zsJ>2bnPQ2*O})d8d?ZFG%ES8XBpx}%g7?UshOpgBqGM`L?WsRM)e{_Xa(aHMBhYz5 zE~)9MRfjav437xMi)i0vMSLdr6ja{t6U?mQEy$2ulFO!=1Ea;t4 zL!7c3;l+#)g^k;gYX|T>&n<^#N8x?m$`;L~#K(mNJ*Ck(2ZtE9T?9_mQfD-xZ)~Yn z@@A~Obwl%Fr>D4b*c7^+*y+}}ukc%OH}G6kasSIt_Yhr789@1}alU5H8+p2~oAVny zyE~Tr#>?+*^JktgaN;d@r2Vs=;QNT#1O3!L`yRYT)lqWa#ZCB|_*rse)(KUkzk~H#d8QN(hk7+B91;0+8$QzHJuyx4 zutkKA?xDR1*Wo@$nLBeg9nfyW&b+%Fmb-(;h@GN0*i*79bLywxqDd|`|AWYueRxUz4`AEpBIwI0t6p7qC(-vWUjwm!aw&W%q^uNL z0ib2piAEnVsgpWP9;TEWVI{lPy>1~tY014|nv&bk5T8$0@;z7(9CMae^{~?DfHiD8 zQs9z1Aez4UFsnErgMf2^bWDwlr!yXC3#83nN?SYzmosz%0!wVBe#vz)>dkEW$&R9M zTajb&L$Gjn@u&{T9vs$#e#8qW`+X@?qRL(C6bY;!!&>ryPZZXC*!GvSHhqJ-9wht5 z?XZ_m6LtlxTr7flR%l=4F|~nV{U=BoQw{Oc5%52qPE5od6hph%W9<9#5H|Ev*8phj z2e|O7@6Tz(x3{H3M6CD^<6&4Q7yYTlT4&f0$3~G|l?7X_(ATg`LF|kw$)Ja8D>@)n z?pd&W=X=Uae!_d71e}Mc?vBXDQEm+{9R{I|KX(n|w?PTxyGa7NJni-Kr#wwnw-!#= z=e0K-5~ithk7rs+29}iq9VphH7rV|XPyACnsSUO>*Fn(P8HmoEYsqJ&)>i)+UhD*P zss3}E@r5XbIzbaZG8@6<%)PmnUu0h18^*ung%hKf@mU`GArJwve(Jx1K6WQA$+<6d zzvg}33K{eY-F>)+tT{FE+}$I{bu4mlfschQx%VP(@c%`)uaV!f$>jTo`&gbzA9uNW z7A0@isv*7H{b-SZnZ3IQAabM9h#(q03X?XPS(1Q~dmj?eNn>NpFT4aF`y#)j%bQfD z>9px`u&#;?lT89u*t&&wWs~n9{koqTD;bQhE!uU&D2&qg-z4w5dVb0M))N?G%Rd*$ zxd%nb_z!u0_Wtk`|Bp=a|ETBhpUIoq<{tC36BC`3K|a~;1Imb0x5vG=OxGup_bl$; zc|z*{$%H?W#^ru*l+6DhyoW;C{wT`oB=YwYc^b6cJvBM((>`n(*E9Y#D9HMgNGV?h zP&j9CKkEs(ZhtmH#{Y}wZyDC&Pbc+(HfV1A8UOO(q>X7CyNhfIOZ_MHub(mYBXiF^ zX)f*`Uu5$!GqbD+cKoM%dD-j~rN$o!cDe^iIH(9Cp8*ti>~yHBxu@*p-KDuIk) zywuA1J@Ts0To_-EFZWjxP#sd65cysWUrmf2bgfhWDlw|^*g7>*k@Zxt_N$7Rj6}kQ z>#X3D+}i2~@`kFr_*+n@Nn{MW$DZ+l7P`;h41+Y3LJ{t7#pKa9@f-sVTa>C zRsOi#r_7V3KDj4BKDWty*5cRYK4qmWfr5UnrL@oE**6)_ZxJRL=Wy#>@Xo7)p81V_HscasleH2-CEjK9kRyW%|QLtk00&n=+aNuXrz3N0?{6+3Qg@`x*xsmec~@ zT-o%!RoU5Gui&1{`cWOO=Klm$5ClZXtil*C3h#X zQpWl6T=BH}VZ5AUcx)N=XWuUEE!mrR^vCf~GT66?jh|b&QE}T{-59b}?lB`LFY)c7 zD2xxO_Q&H{_zrx4lRO%?pM?oh!QE9N)oc!|f0C~iw4hZRAV)TfM zp{;K7D9~7sQ#2S|Dev+T|W*IQdBFRSM622wu!Ud2w}}#(x^^K13M15Km=9f4#jyhuTk#u^00Ga!Zp! zPJ?9_-$nRje%AYcMGOCiXBht|^-ms3sP-&8tY3}MWoPIp3on>`U24c_A8>2BY!0ug z8)trvq^?TDCxs4J)V)sQH9jQFV_TZixdy1g@Nm$nG^KGI{eO>x>l*&MIE0&~R*z8} zV6Mc)j29QvQVVqK7T5PiSZZ(lyrAS*n8(6k^um>NIW06~OK?eibhY?txfs1aI2sWqL zIkXybIiJ&{?FeBu``Q6erlYLS#@c=f>d>BeuDCXwqubH;IIhX7GO;eAzSKE!QYbY8 zl|C2YIk7BusSPU1(+nz@)x#TB8a2~~p~;Hg+P%i~+B$e$1i8xZk_Y|V5XL7tZkWss zm0Tw*8`<XL`-_Qf7QzA^im(iVG{^ir4SNL&F7<@Gt{H>pF3WI+J+if*NbD)e5s`TXiA6JDE!6KhMd}Z|Jy3i`g8}5Mh zsG>N@~CrT zVRcM_{SdEn=xDqZGui5Mx6iZ%Beptb+eY@v^HNsT9lc(ry*1_=J)F3^!-k|{)o&BU z)x#sn(5r38=reT6d^QR`3I@4aUJOZ3zL5t7ultJcGpY~5jvM<6tsa^E#tl=*_|_UI zgLXD*m@K|o7c?IgW}4d`t)uaRxpfY|RL4a%79M+-%?mz*hvUJRt2Dy+F_bGgj=2d} z&aPF5&xaj3j(Jr_?-k}8>8g5;8p|o1UNq<|yFPyUS8R=sa?Q=*#c{C9U-M%J7Uwz^)y%y4pg;V!)s75f4f1_QgqjwV!j*OrQK@u<<=x8U*M>WZ+hswv{}mG^ zN7x4_{ylPz^j++v57B93h+-?K>vS5-pp0qm zkZJSa1l7@aPy5JtJH2UTUw}5;(5pp(a#B$>Pp-*$ek4QnemV2iPvbMJjs1?|$+sX1 z_+HvySXzT!)fr=t!w4ICrt=eWySe1<*puRw;(55I@iJdt9+Q_ud{TzWww8LLbT63* zmJs6sJo~|UsXmTMV^0vU)L-8ex;Fhh18tpj4;$hnlcI9Ew<-mF7QnAoMm8gz%_nyR zi(lfes8JbtGcryh?$Vm`0D{llG6-C(MLcWBIVPXH8fCY+^tU9kOf7!=Cn;tr3L9dS z>I>w@Ao2htSjdlWHayv7SR{R>a_}RfeHD6e6|29F`a2Nj*}c>BqHElqWH(DMD%UPs z_zbKS8vmF3FI)I6y{O4A&%JEnO?pue$S(QzrkE9CeddV}FJ_(=qHcBQWxUIi(M=Mb zEQCqg!aVs#u>E!N&$Fai(+Wp6l{hlykhYhsn9y|62y_NhIW-Ed2GsYsY{zsRe zAnEgrJ}+#;D7?>g)<>%O7;0X0*@ufP+yfea*w|^4VB({Gt0;4>%ICiIGgwlgAku%5 z3WIO;bhFi6a2f;q@5Kb(9*QQ_6C1>!(3$_>G!$kbMAqjF*5oNLBMoP|Tv5 zwWgMmqSn+9UyQw`H)QtEmbm46+Wnb7tLx8p!xQpA7uYCQV=qy)J0AN^*w8;%42%3i zhL!VII;CG1`HjxtA#_|K$LQ2+qLqWS|A`*AaSZ%Neuf(bM!L}X^B{e6M`2J zAXq^-A%$2EVtNMD2uII_eU62hnl)Cw7`&?F1uSFbBaZMo3@1Pf^DW^=9pMEGCqN7H zEo&ppf~--SH5hu@-xd^8o9D0L&Y)FqS+_sTQTflB`~5rmS|Gw_Qass?_TTmDwZujAYm zzcX|n;to=A^ATD+2!6M5IRpc1bsN(YDb+}A)&-u-05< zh28)uNsaaxO@&hZEnb;6!2Ht{0My3smHf5le7r82x4VT8B^_oW4P;>b@V51vB{3Ly zoZr3xA?`BH${6T5`eYoBc{7o&HIC0{lqTQ$9irmkbM%O$UxZf?JDtjp={src^c=wb z%{d2$Aqg=Z;8yIRxnZ_xI?Q}jC!5*8!-u|DI9j5f3m-~H)koD29IDcWm6pUW1cq!h zQ!C@3Pzw<0`@&rl?ksYz>K^x#=fiD)hGLT4E%J%E;a0R>&|{9m(0Euj;BG*N3BG(w z@g`qD`n(=lTu%1l3+Go^%Fgm*E5(QQ*jppNS#A8vHZ*)CPVGQ&V~?IhMoB~Gz~D`V zp2F&d+`8xSH+-(T%I_vs*Ud>`R(rQS0RZzNW+zis-%P3Hh1{W(kv(aoX&4&9jSmwtRFw|rLGZPp-ZggUrYQzx(-)h_jL z%VZ8NRTGi@1M@2c*dJ!w#y{0!DHKhFWwZc~ZUb9Jta{WR8|uV_+u>FAR_V=e6Q`>wkbQ7o+O6Nj_==T7hO6_&{64Y++X;cX^;9`kHYIixLqV$ita0P4}|Qur%Z>P1dBC(xhGBzO#oA?_R{q!v0~U zPjAYA5LAmr9N zQp2p80eS90u_eeHfreJD=U`Q4=tsn3R*~!e3HUWQ=Sp2<8+RRk`KRfHNLQvH)oHA{ zHjvYf>dTp|n8BaXzcJBUGh{riqzT|;q}WRzYAWrBRnIidxRmlU>dCvVyqn;yH^xhq zDaPe~wLe$^;g3&{o|W=9V0eOZvktRy>IG zy$&9T!`ka0qLIB0glb{FG1U(8;xuLV8DwYfbs&P|74p^S#@+@ue$BlN1X*(jbgR7$ zL{MmjF0KJyDY;i=!99ETQUCO&fU3CSlyxX~b1o~XJqb60i|9AV&EtDFpct_6!EJ7L zkabNpiDk)vZT1|{xF2b_<4f4_I7d>=?4)k^ze);4!5k^F!ghR1YLa5R2WY9KFEp}F zw$&=E#jUDW@vb3=_yBm7qQjt(N?go_NtH!$XK_-t#qH>HM~Hz96)Z}uS}{a3>VqHO zSM1-Q@e_nhg^;NbG9ywZdNbhdQT+q4d39VhuaOR_j5Wy1i2pS&tOEZ#Udm0ygXaiKJTL4z5vMts*w?XAz>WdG_$hy>M zdIiQYkKPIegf1BEdb;ZqAdQ3^&1%Z|I#x`h1PLVv9!IEGR;jUjK#V8ngcFT6c*_JZ zCVW`MbPP9q!KCZ8VXDT;e1DSKV1c>*B$*txj$LLXs2)#Rf=@M>!5WB|mLSJEo#!^Y zMXQp0(=Ty8zETEbWu7=yivz{C@uO7I{S;y1b3wpx>Uee6%j?w|xs~@GT2_{h@rGH2 z)$%mtVTI#6Bdk!EAINmwj@(5=K4(Y4_b^qNOPK|LiB?s$0JQyj1H91VRuWaID3~W$ z7de*5@?Cm#*=Y}~^zjW8{aMql*GBuGFHoKy+VDFun3Jv-z8&WdT~97?mJ>se?~rS^ z-Vp#zt?EXSXc^*VT203OkwgFrXM;9p{r??H_9>D;bWW_l7H0ft|BW6Q>?3`I5jQ$d zMvqMOohwWhj)m`dy)9J99lQ+kP$?Mg1aOrAgc1Q*)6_NQ7IOj_jYVu|i9+=D3tdAMzD%bpC-z^0J0C@B&@;$@gs~Pg zB6)D(N=kXtZQKS;)57AshU}VQ%%~YAPKKfUnZ^oJNEZUdJ-j1TSoJvw*haq`ad#VL zocXwq6Cp)v|70wZaV^u#j1UU)uwi+wXX0SaSx5a5=0)W<*b^Eg>zU?GRL-%Og9|QQ zVK80|q+~%W*FaL{8by}SkeNPn46(_vNfl#tYL>ZztBLH2Y9akl2N07*NPOaSIFeQ? zWn9HH`H29SB&tR0s1}hE0&74GOV9QqGJ3l*l_;NLdjfg#*?U) zNANxEM13%+;oN}`NR~Z(`Zb`EmK>sy8G&su!rC4%k2cj;d?oELnZb7rA?mmcd}Ld7 z+f&TtZdV+7TpC*DlH06l&CgwTwuo!UeH@zWbJyedP+N$z%=PI6wf0@C^b3_zDF^22 zsf%vW11JE$N%j)rjAHqRvk_GMG)V~Ke&Ye~iarzJSoInJRg2`%tqM+L=hpiYNtKd5 z0Pa9dn?i67B(3^$n68jQo$rx7f70l1h&l*SzCsKac32=~y&uVCsx&htxjl*<<9>u# z^U1QevCwsG$d#({U+B7JyiD6+kGMO;y-E6Az&G<)4$`BMN43e$9((x$Z4u%eGQdp-?;&p#ZRA z7i1(9v4O%zk8?VihN74T0f4$u0D3J197wb$j#pKnJ<70%n|lRp2tCMSh}hKpcZCOQ3pWX(%Fr!;&(=>MFk=uqVRlq z7l8ChczKMj^6rMWQK*WHNNxl59|s6Wpv@9|4wV2SHbH5JSq5r=}+vS8u> z41HYTOckpTk2ms_J`6I$IGv@OJSJ6B0=Z6dHQ@ZyblNY>Q^N^ESPl>7ltvJCK4Hp@ z5H`xty0a6kB{Z2A%I*$C8c*3d=wj|j(N(e8IGAhe`a_`VQ|t7ws(B0%B&azzz%^LOe{@ZSGQ6dQoNB)|G6#sxI4l5?E!t`u`TMfdq2hSx2rWBCl?1T{Z;(kBq32 zk=S6 z%s8?IDXXQ5G_cA@s(cGvVZ@n?IBJu)Is>EW%MnL^7{p`2Jb9w&ix@ar0=b1>Rt#`M zgPaji2SAL@$aQV&h(pB)Qw?>(fqh(9sRf7Z7%cYG}<(K0c4EMBuOXD>}R$IJvI@O*zb{kYt{l6q{ z%Hltie{7!pu8YuLdW8IhFNV1;PJ#CvM>g!~*)Fl!y$!}dU9IMvT5_J}a7^uXjmG_# zsa@y64@{b|^b=(mnwq5K!J4DGHl3pMWWEgZTTZK}CHZB`fpq61%%Pc2n?Prq0MDO+ zfHH4tl3Agn09E;A%l@3{Qhtv^oKlypnk0ZO&YIL2lF`qt9AZYDXN62Xfqp*5vdTbz z_C~;F{7ZVW{AlUn|1!P2Mi;wMp#U=_y>}rPbJ!mN6V743X*D>HsYb!}WG2Q;oIXZJ zkG)@`D_#MagOE~`0f##5CKq%V-JIgOBU%(#k2HtZ>U5$SSQX!I^?c36NUnxS&o^ET zk2PJGRy(g7felMAcSb35?=zMZqIhZ*1Osr#VJ*Ek(9LpD78~U+{nZrL%%`ojGJQR; zcuwFFtDhqdqzYJp1rvvY)wW>bP_Q}{OdNpK(sK1hEPS}x?-_>Q|44bDhmPG2q3)2F zJ`WgLo;q>l@drOd2T>hT$||o9iprfGJQ9WHl-G^IbAx|H;rb0EH=pGE`U3voxEYhD zzOUE9I${-H1Rk{TrF6=2f~KS0tQ%n%x}1b7MDm>1NOyII4m}ECCIn~F!W`q zcjO1LWXe(odl)I1VNSZ(@8~CGRF?CAO9E0_=G|?P`C8Z@PO|*_)+ZyI?c@9nF zEYjJU==*m~RC?Ihwagqhm6tbWxv=jWjO(lo3-v(GM-wIih2`Zy>KkU_H2xA|&j*Bx9|*EK9S8{EjuexY030#yJcme;7Zs|ECIw&+=?Cpb#h;yrmr zFSvZ3>MffHM;_xQ_;F@NP7QE7m^ab58K6YtGJM7?(YOWf=tWpq^{?LOO-<$kLboC$ z)oa{_AAidoh?(S1GESkVX!HiCHjZZF?l7Yd+!+ahQ3y{@&~K;Dlce$V3h8^)1yt&T z=YXx_frSOk7!MS1dQwgxWF#iwK+7`hl+2(avA>UB6-%y$OhQ~9RfrNIaljP!JPDE! zkL3Fz`QqVJO_IR9q5i+4=Wf81?3Yj^lH@Xzn7hcvx@Kj?F`f(SC7Jqbs8gswoEwfn z&W}OPGBfUT7a8zlK-3SZ>C1qY>{VLB%4)w5aq_9Y0Mo8ij!hY)4BY(<*7M-)roEt7&kL2F_h3m!djpllG2mZ zgxMVkHCf@DrUU}TJP*z`s>yP%EKnv&VW`DO?nOxU249DcsMFDEMNirTRrjxU%{yS7 zSM|vqCXb_R)D|Xlt5Z@5cNSrbklJM;g=8+YIf$C$p*F5(+%DG>pn(-}R$z1D3R85i zvT!~6V*CVGfg|m-X9e7$*PyBTD{%P|ita?@^Wuwc!;e43FI0W@3^DMWCvFOw~+ORr3R@Y8pK2BbAXWa;S?uI^=IzAD+w% zUuXrZDyH~VtlhD(Qqq!hb+p^Q(4B}BnSZqZQcXKA?R>e4D=iiJ znTn_?J5AmBIC?p@%j3r>(oMU72Zd8y^wX|xgYO?irMo6os=&E$&BCU+Hv^43L zWTcyzMk&iO-EZ`#2s1JQY);bB(=wjLKF_#}OpD7*xzH}7dRle;WuzKB2&v-sG`4JM z$)`PUK;)u$yi-k-FT)>=n&wxGWFUhXY2cyB(@s9kjLED~5||Dmm$fZ~2F!Vuf5#Jgcyc0nE2jHvEXGPJyB7mEnOp zim5LB$1>I47*maUfkHN|hceaNk=ptK7$0!86VG#Sj9}G+n|~NHNPm>;17c9KLIe{!FF^}F2UY(F?X5Lr^p=5o<)k5C`}m_nw$~O?C{4syIHDRqu+)|X18Bv53N3bx87>4&5|*GYod4xZ^mcMAPBc{ z7fL!$)<0$a+zRi6Z<|#L=Ni1k?c_EFB9<1u0vLJvg`{VNac#UE#K%7^JP2rR<8DD7 zED2o<&dgX{SAJ(!5*?w}E}; zxQU1~aKD;^QX+c*=BiyA8w?0e%Q^YEjT(yK+D zrpFs*kkQTuD?BU7HB5F$>DyqGH8kYsn(^=0wB+o&X~z&#o}KaSsR?4Ka3*zGsTecRs_iTg|f5^c^6E z&9i;bN~Q!jrc5+$hdb4qBtd#}q*&YB0sFlODQ34p2!}R#=P$YkL8O!x?;qqht^lky zdki(vtBzD4?@)*}%wA(*M9DMLRl8WpGY{om3rWvonHg6@OgOC@0=eX~OGVE6SEJqb zx>7P!eB`-T_g9$`m?e)jOO|4|k-nHbUP6(e)uLG$Y|kCc&lA<`Z36Y=~*~Tt25L3NTo$x zr@qbypZd2zHp-B3E!+(_C2BpSE1We>m#}5RA`yL>y2H#LI)Ktcw!+;3jPT{m+c(q` z?xA@NF`uPu!;Fm0iD>6s33#}aIvr17CSF=~MO#rT?~S2`oGHyb?KucuL(ia6j3!iq zjL!j!bRjcY5-+PTmO!`z$0`dENfA_ju;SA<;Z=S$HruO;fZ>ZzQOb^`#6t(H>nL9) zRG1r@0s)PXGO}PJqC1>KFt!LIl%UK_i`_!m+yH>v7h4t4f$eqt#VRrG1|8~NK?N} z1zLRc#%I|8*VmvF@wqrU??r~9?Q}8fMt?vp$y)JHF84{L7$AXcuA_18Rbip~fuNTN z;kz6pqB7t;3$2hB{#oP(MG=e85CQxEiPQl3Vp>Aw$7RW&TBDCTh$|;ysFN%ou5UaK z+1N^l79TXtdOH|SyWY|lt+%OJs@{eGjPM1eGw2>lH_J!qz3u@b>To^R!>F^1q#Q^H zb(kx*tiyNX`2-IpStC%^f}_!Et&F9YYA^tIgB}b3iHiYnq;h+esSv7CxwmpEv+Y!(SdLV( zt4yU&m8lS_Qn{~kDvRw@qF9bpa;i+_F3?koL0fH#fL z<=j}x8K7~ zeHZMYeliYI(8E}qVZMtVk&M!5B%lvaj)l^ABWx#xJ`w~W;a-Hx-X4cvO~G*cxQZD; zOf@6pLH#l_%Z{WL{7gzjD78eGgXIe=v8*^76Pt4JJ@m`WRPfZkxMBM3P)xPn%4-`H zi_F4&^>LxdJq7$2Ua6NB57g%C?&rrmKR6c#5z#9Z4#K>Hc7Rx z%|wJ&!nU*Q6O;jBq#|Whe#`E`UJeI1v>j&DFOvZJ)ycqcgx`yBx%JK2-LS&T-G-a9 z#_14{+lYr#3*Uzb@`)#$$g^zN3zclx2;i7D>;X7!8%AH$hFxgduyOz+e8Gl|q&rNv z!-n~l4NG>-1s^Yp4I?4gFqkN@VdeM@jK&LgO410EhH(qTA$p{ZjKHrSKu5m#CZYu= z?J-MFmHQJrW6GUNp*D&6YH~7IvD-vaC44_f!gMh`F@pQb9c4vXZ}&`ma(q(`^k}#rI+6 zSkr4Gi~eMDQ`g1t?6La(XntK^eWmUfKtGT)qh-ZAziC5XcE|(=;;Ct9809H6X)*!F z9S+&9gbQP7+GQ=mbCfkplV|x&v5L&hZIvQE4j}FNeJ>8yAoIl-wm?Rc5Eo}`0Wi1S zM*9*=D(TD=V46BJ8BSYg=!@zME{Bvcz)S!md_iZX(LI%Jht6CIMCeR4*I-CusmOCGby)WZA` zy@^a$0RG4q>LN1;2=iTzez4i$D{4kUVZr(_15L_&MOXlrPai53(qpTgc(sy#&PHrgKWD*d z>nD9t{lucB=;vGjBYZ(WAE)~E{y+#5XJn;D9gkBmrT*gQvxKVL0F`!fXI^iqP^7 zP|~V(N)$n1={jjWN?O^HGIaC>(lGfj?JEh&5I8c2sA0Z?iQO!lS*)~FpxHK5*;j$q zv!URVSrd|%MpMtRQa80!M5OZHnp*m+Xesv8*;;xfb%^%Wsiy-WI6e+NW$w<>(`Amb z`WHQAg6Gmxp=;}@aO}`iYMRnhJ1?f5O0mZ3>FbsBbRJ@xdio5Uww}@#)zda$k8>%{ z0T|&6?)h|A(CyIEW=*E9etL8T9`jdM;8zf<~!KA8kL1QY8o$ra%NFMi#jq{!7ab$oSJLu4&&2!+ZkvU5#h2&~H)?2lTZkZP;YwJp&bIlVf1>t>G-LFIZSx9;%+Ap^GXaOL z#I(&q)7BN?(4i|VZKW$V@20MZcw=?tjY_)m0%DuGvItIFSLloCN=L9qU0DoZgfF;X zqWeX<9lFvEi0Ef~T_ch2m6C4~g05J7U(Bev0=MG@J&`oRq+xJKCyT%N^`K=fId!3_ zkWz%mSk%1seJdJeeKTKM@KSx-=RpFhMS9Y=r6bz6Wni>S$Sm3)f!Q(@MjSGwRP4U( zo0Vj?6rrZfmcVJtjJ~MMx|=e49l!`*klCwrze2Y|X4g?>?Azj4q-&MPjD)Ziw3%#3 z&S|!kGCQnfCTVD45^>b6;>=_0;%!9CJ_MXWTYN(pazraGgh;uV^;3#S)lb~f zAmXE5@C+6k`k18SyE?Ck4PUuVcGZI22C^ViFN;J@`@EJ|vO~d{-<4SQP>8(M*z(qHJ zCh7S6Rb8Wn>1j(3t~-&CcJ#CoPli{H6rIgyIe6NWMssP(?n2khrD_i(+Y}Ck*RYI? zQ9$$sxKRfC+~G#H#^A@u#G=YJPrP{ps`^}WePDTwu?Y4X58|DYuIb~5%n21pK;|^L z0UzHl{0co$kfeImf9~uB7V`ocRjyuF>0oP(MaO`b_tUBMinqa|U8q`k6-w2#0dK-- z+W`8aHsE$B4ejPz07m$7*87_f2>Ji3E5eVFsI5EUWLTosU(ND5o*d|4V<jL`0gUkFltW)7hYVL3^?9Ahfsq~kU`)`ue!z1h5CT2%f;@zNn6!-1kcTSr zTPO}2SY8Ll&OrO=tKO`HL25tO6b!cP0}3{}IdKvi4^4`!24x76$%r5w>5Z)_Jp#*X zSDD__XnHb1Cp;6~oS<{0mtAFgnrKWdW4#KvJOsLPw0#4$uLt--UTqims3v$Dm_VaVO7=j zuILFPLr>TU&}#R^^A?`-p&}e`uEKK$PXI@osWXyRm~@S)QJGdC0zSWI0i_dCv3F#u;JL3wOQcLVpZL|oyF=Wd|0U*KL(;%j$7fh%aOilIX+~T<2C>zd^yW; zj4DUfPuL*k$jImDCkWjzX&9+sJ5&FjJv5yU!l@rc4UFs(u5F&6`=0~k)^At3Z|V2uO69r-NM^Zy z38!7I^r2kYH2XvI%yQieVB{;joaOoi%QX-8Jheeny+z8EksWp_2LXSBP#_Zy*eRin z&j0~S?*smf66kp3TX<2F3=Hf9HuRk!xjHNIH3RWE7yOi8&#gF<8RZ*7!|F|H#`9Qu zGzYn=FByeOzW__fQ9!T+M$niD^JgA#vO~bH8Nw-WFTVYWq?wAk>eWn^_zG++L9%k+ zf{7RTf??T`m#h?P-AJ;n^3e)UxZ9Ste zs%I~NJ&w2b0~q-MFQ=Z(N1%-7hJyY!$txo}?8lV|2*`YN^@z~Lb@0Ftt%w|eE5Ly# z%82gBcX&bHh$yDRjKMIq>O+^pt^bk3rZ8Sq_GA$AQ3A7NC!`#*WA2r0y$uX}Qb{%s zK?hCQOoG#v4SiABJPZ$IGa0{;DR{v>mF{WE{RrLD>85QmZO9DxQ8#@qSR2=Nkr|0X zX4V=SKagF42yO8j;DQC}r=*(|nF&nHGW~}?BOk^4boC^RH=bmeuHrF;$Q*`c3q8zAy}=Mg-C`4IEmBbRx`(xIQD2T~h>g*2ur`YB|4!xRo?dYvE!2lU zESNY1rrI;^Yr7f#9mt#8cm`?bm8b%o2e;d(z}uLQmwA25vo>@AoVB%)&*4X3h?jiV z3QG=frn^p8PeD#Sh9H42XB(Q)sJiQGq`6b%`8@F5#v;72FHj4=0Eh7o#(A0gFPK~_ z;${dFx(?8yi{bamU2CXsQDprna04hqm-*@FDo~EtC}zy{RVMRp)yWW9|IMZ$U#N~v zMo@mWQJ`nee4`vrvmEey#wrhSfNj8B9<$uUp_k=D4-cnLqeOITo^VU$NbwET@L`5A}dy%oNxfD-j{qFR0Wez?pOY2cDqc_-kl zZ&O_y>`PGJPydYN9BhZ?UB_pV(4gqpaRTa;jfJyIaNesDr@^)xaI1&hr-$}N(cCTg zZMy#(O?>eR>8_{}CpTE@2HbbbKI2}p+aUNk{E9IvjV~nrZ#Vv18ea;|T|NE{XOG}~ z@vk_zdk(y|=~)$>+~9n`ZC)+eqfc24@^bg@2Rpl<671fKTT~fjyaue$Vq`Vhi(9e)2_C_9 zVz|VL&LIitq%K7uJ~Z-*5=TrO=YDxkBYiD-xd>6rywF)iUYx1d0E(m@wU^<1fW(%I z19V|0YFaRHC|E5ECJw-8*EvzoKg%rWM^#gCoIeTrNwyeH`;^hhFWdRQ0q<&<#e+^1 z1TIxT0v`QZ^s7^F2M0aYZtzsECn=PJK@=yT66MrWrY!d)8b^?Vk&d9s0mm4SsRG2b zBpN3GQU=`cOMu%Lf~1Y}#1q3O=NAgVf{}+Xhu&js$ibWzuFXI?t)1X57s9-D7@cR2 z8;4r)>oERk*l`t~DsJiSYZe`x1CCcDo2LbRXHbD1W;{qJ`f?sM#N01*hE~rY}0zPzQuq({%hs_=5XVy59m8vu4$k)$qfP z=eTfO#r2)k6B2TaPd`Awvv>mQ@Intx(#edhVR9;g@cE!z{x$&C8I!eehu*t;A_r5|D{4f(#S4XK-PkTN9B=jL( ziW$MsuVFIRGMNpG9p<|%hbwHe(PLHqWPeIv3S{6-eD)orgo|@F0?WYJHDA$9fMbFa z&MD-={3tKQW@3E=r$R6`!|891WjPlylTt2 zZG5$@)!pn*3y$6aStydZ<*-ObSTa5ay1KSju@Kn?0EPi96d9*U>4ce}@d<;3n6VvB ze~YKFRmeF{%(&5hHI)MW55gql)DgR1EM#ppj8F^hc_7xC#wbYrQvpZYKJ-^wqdJBA zO9N5@r`{3Sit0W4^0bTlMDN;4l`KHd&WCS+;iiR5^-Xu!MQ*mlUwXPL5hthOqIC-C zUL~=1AmPwXrXJM7?U-g8zEr~P;ZzBOhBNNf2*43L2FvjwXV|q8)`4Na@Mw`0HXCVn zl(6gMeZ9Op$-6V&dK_k)#CBMH`gj+I-rpmSp-tvFq8E6M2nV5nA9+!oDSF9qrsyLs zgku)gXIw{dS#`B06d2>x1X=t4L1gwBvK%gjc-{K-R2Yt$@V#*g0<&QFaT}lG?fWVh z0cbgh@5YT3nA=romWXBj+JzHB=?z`ESf`H4nBQ%=QF7Nq-aVPe)9SF5B@@n{HAVva zna9m$9v7>8z3j->7Ut^bGmMB_F9kf2SX%So{E%M%5 zxb7qG+sXUkSl%riJSg()2Mo9I-*m75EcXNLzJkrR%@76LgRHUM*yBMQ$K`miIetVZ z!gnBwv?t;KF8UC6S}<`4Oz95VjQ$AI!ULF)-VLQzSQX4F2j+L6L>MFyu1AE>SBfd# zRZ|DF`KN{NVz@B|b=J5U>jI{ed-Ow7(bO6<@Uq4P@vec0a|rUW4FJwYfr8l%4TjTh zhvBI+vRSAy$$yjW(SkTO3J&)7(Q36(mq$oUAz&jQx_uuM)-nz6y4=?J9MrS5TSEf zuKAGL&mtERqRwHB(B;Wd+qb!kX&5ki;0fG~7Zgwu)WW1#AV&mh%YmNq_MDX;Po-lJ zG=S+FI0md%yp0#p;Zz#?Aj7kSP+$^L04_mFV@Fqttc3+4>FF1t;ZZck5iMKMXrgEk zq-cy$H24!4L3fTILIsx-RYk*@5JqSXj_a?}^q!E2$p=Bj14Ju(5L!7aD)SCz#xsrF z7-k4k%#39q4zl1!F_UL8BlBJ=8jhkcg2hZPBpa;^-QkhS;G9Ez0)@fHq4UhCL+2A* z4JT!i zxthBYS}RsHSH7$M^_F|EE8!mHMjIjg+jUFy%u%;k1619T5K$SkZi)7&x;4U7ELFN@ zxD>P%ZfdXy+zc1l$JR~S;~?_?tH^I6($=ZUT6hASYP|=0Qt-uS1<`LsAiAOtF*FM; z3pygvNVpvM6)3;#UGvJf56qjooj4}t*MZ1^oZ8RU)RlEzbU#~7s3q?{f7oVblEqB4 z@5ViOkAkt^gzw2jHCdZtMe`WTkq9nrqwZkkX#jq(lz?DdVvM;7udGVqdOo=QgGx-S z*1)PN2T`(EnIJcdK^uz#(Zo!!%9r{sx#qga73dM0uYNdxW5vOFAUbPvX8~=NWfPAe zPqso}F#%YnO`HLzZ4>E>+Qhq{inNLU0WiWB+_UI@lx~Mj>I zEFly)1BF5af{Zc-KE^;C6~RyNpP%A}W$L)`!V`Ji0si$umj!;p0gg-3Ebx;K@b9<+ z!Xz@s0e|T+=4<6v3I1r}-0R`f5JwdU7159L=+05Tz2HMlzb($x3UZ z_GHaN;i~T($xbRF&i7_1S%#;gw{LB!dI6#vfwZ3i22PGd6X-7qNbW{5Os@{v6jzmi zY}zB@{KS|9)bZMoNjJWWP%B49~MZgfK8^CWS~Oy#aV6UPb*0ck7~g}`@tZ?=Qq zqpqrviW%7-sSp|zu%e+dAOauBFnt2*nTxVk?{qGF#{O#0SUyNUs&7+P2d>r_QTfrijVxwg|~sIlzt%53Tb+O`0%w9R9a_S zI2|>O4{`X1wuDJI+Cp{4@|dGepJP3Z$vOIdG3PjhrrkbC<+sgIgw{y4PZA>a*lb^< zO2@V@oVRVO*hN7sKwP(hJAix!F6lAvk}5(U7h%sKEK~m(ZAx)E09Z5wh5{SMIfjYe z@nH2UX)o&l^|<7BA>#Y6O2xI=cUJo|%A5`O@X)tMfF_g0AZzEsR z6Ce48KM9ddycb_c+1SPp2+F!ieR37wG09YPGbI(Q z6Y2XAKBb1aUdg-p9|FfGmRs^yd&0kfJ(BwA zIO9j)II`d|4iiuyIl(Ch#dB4hpH|;+tYylG?FQzO$c=1Tr+<(oxX@4JemBY%-U;leI}zxb2oj1)cv85AT({ziyb z8%YFxE-De40mdW=-c`QkcXrZiwbkViad! zj1%2@lmHCbdK6<@n?rhh9JZBgJ8Y{Oum0hXzhi8Tm>ikA3bil`;9tiW%%(NQU}lva z#^kBy3b+zlC>Au#rq;h!xl#Yf%M=Qh_0P7=QrNb-MW}7cHcLpDrDxh^mZ$zSBwgrw z+b(gIntXyQ;sGaEbH>|@K&P0`XkEZM=2}!OxBf9&O)!Fb?FEw5VR3*rz!EK(I0UBZ z-p%-uiCe!BwjA?l1HejTJ*zw8h{LLLoiO+HEvohbYzD@djO^G~ zbQuD;m*0=yKm)u`2Zg?(D5I(1TW)N$vnK|&GW{$;3;ck%&}M?vIQk<7Vn;83 zP7s4d2Nt;v-G!1>q;o9Nb#2mS9$TZxij!s1;W@Ap9sSRT2cv&ye}^Y%_&Dk$8F$o4 zHQ$ArA1#-v>ZIAJVsef?Pt1Im(6#H86riJCQIk}?k`O5^vzkc3#rAnH-?a@9uyl!< zU^YaSZbN@RL70q`+{P5xEPL&xhZf#0@pvnawG51UW{nH~uB6{Pfo$sc4mfT7rVsi} zx%orOkZtPsE&wB+;RW~Sbnm8{_Qaf@T?|C%dXj5CU}zd4QxbBF3pvr!2T!03FX*|X zgOvzisoAP8;esX+9*_kuEliM7>@OIoh2yKVtgCLetg{$+$y5 zSQ1JWAb%RzG@c;XTZB_$$2i7rFoGYg$xGM-aYO!oRLMoNILZ8T2Zmihd-? zH;d0Ok78=^{RAI$FLHon5+VorqbCD`9b~!>TXRo1Xg^v8UGhM{;v}AH+dhC_(z@b!$$#w z{KLoii|?#Q2*8j){8qW}3?zFy@t_|%pVGw5mDTVI2Gj84Hq!BqWZ;FJJcOV2RL4)q zkC%QUyOma5Gx@D1^ZW^*cYd7y9`vu6w=ts+!PLXQ;|=(`fMcg2Jo*<9MyMB-c6=T) zz_<=RPhsd9{3LswKy0%4H!?;i#PG)M|Iosxkc!)wi>?(EV35-*I~ozI`@}Y_^+WaC3$=dsODu2vSHQ) zKM@7XRlU)?AsrZ)|DF!>%jVHz>R=q#IiHjrG8&xd!pd8~a|Ij^fJZ;B)UlF&C|X{V zR)S5-BUHTd7O1U7u=!u2b!7W#V;fuh)Q)BjMSQ~sZ6;QX4g}RUxd)FoGPBy~yB(;Sn8VCF8o`$W` zlhGV%BXfwti*}=BkMF(alBPNcVfOk3QD>WyKp)%IfP%IWQ-iX~&>X+k8EBy^gp8|D7O`ibNm{^>Jh;$W5?eNW z(7^$#vT0!kN82$aX9cs{AxX&2YJ@p07@kjI@KXIuo#B5p26O~%Ds*aR&kyhc7f7L5e3>vE;W z(nwUX$cY>+GSf?t^v)x$$bomY)&!26go&4#gK~T^B|cOOKvP!u%*SKgqRD(HR05QkdFR0G$2$P5h3>^7bgMv=Qip9BwwFZ zPJ_2Knk2Y*ug`=fQa6z~+c@r3xEQqYxk|)0aJi5#R7m2WY1PA^RSyfu4`xGrQZIFG z)OO-=KQ8$>AMy!pH}_|}hB&wvcNu=L;g6ovo=>?!BOSF<@4-gQ$JV%e75=8OALZ%2CkbIa|O*vS^fExKC3a%m+i6E+008_d1mrjxtZWr9$)O_@O1 zRn8SW)6dQ9Pyr{8(ffl7B{Army>}MvL0v#qBczyCAAbths|1d14_KBQVPWP5dpg^( zz&N7Kn(9aW#neps!|*-jF(%?i3)crNV*rtc!7q&y3c|@F`*aP6Rq3ut)Y-Z$Uf4QZ z2IRxHFuxJ&Zk2V^<~BxT5sq!Q*$?A69L$u&*u(lDWZJ_9aN72ezUa82Aw0B)XwZBS z+@3;r6S^-`?#t=MjT|v^Rad}|F~s?DaUg#wv~Rt-8tft{Z6b&oar^Fq=Y`*4Vrx;A#NF?U_T}gMpy53iyTq0Osi+Iu!+B zTCo#jKRQ509e`!{K~}HDZc?;8=zwjGLI6_$=uOGwoyB86Eqooqa6`VlJCVd9G+Wd+ z3kUH#OK2B{a^c(VYh_llE!}})+Lmr`+O~zhsBLMb8k_Kq07h=WOVTs#VE}=!A<3@o z;Gw$cFC#nV+@3=KDy|FDnXbS*yf7Cb^l_OyFv}mNk*$w>(lGlXJpn^qB!=pt;m&xt zIqvX9dN5GM^W%nj!conAk*MuDsSN#>5cKsD0IqEM%w%e^%a(MR&QMgW#A`6eMp zAGVbOoA%{RP*yLFGJPsIOo+b~ySzZ9C(?_USwcj*-a<{` zHGIX<2Pa;%Ovo(8Dul_`b;!FdTOr|)Eu~}E!A-c&AAs_{cv)NPJ0im&jNW{s36&t# z57Aedb=2S}H9Fp*Y|zljAFlF89Bepc%u)x@E>WU{N{}L|jqC@2{uW3}S4H)2!IzNe z?;z1NN`laGzGC=-Jz(N)eG5#uK955M*b0L~XYgwMsyTm-hc7gFb{pp*vohSrwpCCN zr)fNaLp>Zw( zB0;#I!UFe4LhuD1Bq}aPhuc_;Z$L%Lh!f_!yep>g^9)Q)_^P*LcNvR+5~nlW3Z+YB zlq`jUE)`ISZQaj7ijg5Co-GW(LJE?}j^f}Ya8SKuuuS#eiTp;5U|)D>1iAMMMeh3X z$EXb?&1ikI`Y?G8`JBTBlK#1DpwP7IsR+zbPg$DE21J$x_SxEFL=;1b_LK8rd~-J*qRG$<7@UEGQevj3@%)&w&FECpd zMRX2bq$b4JsgVFwbq+OBB^-Ugas-@pZWZuRRl%|6xGFlBce@3dHg3gB3y)z;+{S5- znPbDpo)ykHiU fVJ`&!$C&BPHKSNr^I-698vJ`otVBV$JO?H@wKQ^7nQL6aF;da zUVsh&U=J~3ic@{Bf-^p5AEGAg8_!}-AO;#hvE%))|5Vud4*+hXBWQ5iT*9pOg5&Rp zfTXumj7HCWL?!`>m4JuwgEBKB;jdR-Yq}(y6|`*#-QdfqeuJS-YQ32hfoRVhKzffZ@JR zeU9Wr%5EN=z$0P769@3vH(^t95p9oKe-e1uYYQyX1f?Mi21n-ZIDbcfp}R(Y31{xK zY?THgKEnjCF%~i1#yT|VwN=^j8{t!cS_AamK2MGOW-?J&qhT{HN_uLvY?h7Rz)hqk z=@$2;Gsh$>pqvt^?Lu5OGvNcY_uzbTu7Oo2HS?%a_SVQZUWL|XsZSu|li?x)ML4H~ zV{QvZy<^@>0LvG<%S^kQVXnbsgrX)4nVXBu6-jLUDaoftfv}AMGZ#-2Bz+)vPBWTp zcQ)q9F+%RGxGGL2TIfFT8lim9fAGk+lWI!31Qj`x%~i>&$dX@U1*$PNq!CrlwQ(&}L7QR!h>5oAyEm^oK$gk=D0Yt?Q zoNvQXX6vahR>`RTBy0imVRT1w)N#vyLnZ%>rauGs8xIE_|FB&p;k7#g!bHxx$rwZ2#|6T-S*W8dD0x&mRo(R@ z+!s@ZMm)CZ_%uV~9v<1($}@m&1u(uwKg;KlSrrr0?a_?Zz%>zm1A=DsL^g_OTHV8O zKdF}NH9I-Nh4cvB`a(!HAPVZ$pNCu110W+R>oyL63_98d)*oR-57B4wnkY8=65-WF zUa=1|14-dTz)iqTNpu@;17B^#G~R);$@i*WW3L1mKwcQnxDRqD^g-ugV<9U0NWZE+8Y>1-#?rvR02++jB|o&3<9iO|}{ zZ38EF+r{1=&_R z^JpsPch!}!oNG0MI2&qCZgTgxTEDy1)zF14+^%vogj+ZL`ZoIxGw=-V{y?a#bV!44 zr6FT@@Q%_@)YYxD@13Q=dig^_cNoFJ1N+s>?@<~I4K#+fxV%9l{;QYYcKG13;la`t zLraI31^W)Jm)~W0zrh3V=vex|4aVK2LtFH_^2)wV?`V2OBk|qE?suS$<98 z*WCxs$(%gu4WP4)?S*HBj(_FuJi z^@VGw%Mf21!295a)Zwnd_}2%Wupr)70e=|6**S8#8l6q#dPE302#`#f>pr}h3>425 z`0tUf0xCJ{|2I<*C4J&Y?J}P(!OP-L12RcU^j@X`!5LKv-FJtPu>arw9!Z7(19So_PzEx+dSaS69wJ}&cigqL1EZtIZC$2C9w z!}z`0{_#Ds_mAIx;r{VE@jRQqfBZ8|_m8jFVgLA+*WoGMKmNM%{o`*NwST;K+WzrN zrtY1v<=MRx_AJ~xVeyN5Cv(oY?zx4WKYR{E_+H1JWCd4PnokedrHQ8 z*;5+7pFO3+#_TC$KF^*qeNXn3W#48`d3VwuQ+9`&Pi^#D+o?%^w4M6nKW(S}_^Hks6G9fLsv}i za?i%;mp-s@y03iW^t>?}r%!rpze&*`(`d^2WMOP(?7yNnsLe!Bv{EoRJW+jhpRQC()tn$&H^tZ8_B z182+tb}<_jPxl{ZVfB*+YvL&Ay~t+~Z$Nx$*H4lP-I5{gu1szSU~i+;2PYn)_Rq zU2`uUuxswN@UFS*$L^ZjXV$K{10UZtcPO5IPwtxg3i@qs;a8+F?=H?I4hxgI>%_1QD`<-7LGU3>SQxoNvY^A@JB znD<7;ig|xuvSQx*^;XR5)p^CdOS`R@*8tD^r7Py`x@*O}4}&Y_z5Kw6d3Q!u%qy6- zV%~_lttuXG)T*M|<*h0{Z{4b5Q2SODe_Ye5;y)c*RXmF4hfb|3T0acf%vKe?CtFqI z&1qFp`a%IK!c)XidRxH@PvZDQ$D=S{# zyRu^8_bV&5{imrxQs-~Q(`ZZT{8~Fw z=jR_xoxlEY>iiC_^XC8abH4>$C;z_SfyaJdaQ9QcFZg`k?+e1u{=Ojl)!!FvfA{wV zJMnz~!S4%3@BV#3$3wp_xcNumYJV&kIOvaswKkM2dSz3|q8Z5ea9@`)@{|&#y726dU2ms zOP}n&YUxvW77tjpbjJ8qOD~(SYH7}lRZFj#1Dt19Ep@-NYH9kCRZFjHslPg|_l{Su z{qD*?7QZ_RwQ;;mVD?pR*& z)=z6H-a5Uu;;lZLD&9&tQt{S>N8vwJ@z#fN^WQ38Iec|?Z}*xScn0=yueq_zy=MRY z?lom2+-pvjyVqoncdwZ{3H}A{H4|QPuX${Vd(D>BaQ7^F`+_As*S`H)&$U-<=(+Z_ zEj`yR$MfK}o@+1qvgg`S`+KfU`LpNRda1qEwm7fX+Ka09T6^HaUTfzM8NK%Ly6Nkl z!E>ly`nsL1)7SNHpT6$+)#>Z*y)J#-qutWiUC!1?&6VU9kSAQ3dO_ zj=lIjZ|LUt)_)Ux?}k0szkkmSO*d%0nr@hWbJGpY#x&i~9M4odjV3nTu=3%i8xGBF zx*>fY!WT5%Fn@8=4a=4`-7xW^6&p`&U$OBtp2SaAY>a%hV&moCtk^i~hZP%799gmP zv7>OG|Hj4v*>7yTH}8#&i}g1)W(?TA>88;3O}+6nEZe?mUU>Va*UGnVdS&MJP2HZ{ zzUhl4@V~Kr)8w_=H@&lM`=(Dm-M(r3=QTI?|F-7l`@XBWdG*nnn;)xQYjgI6wKgBh zueJFXJVWZ#+I&f2tvtF`%uX0yopv4krPHp5f9q)!6-;%WZ#I~f}OTPmC zoZojJZo2x5nJrd-v7zJYFFxi+!N|^a?hKCPVRXd&m(uA+~W$J+*9r0lY3s9adOY$*(diDFFd&? z|M`=98ozjQPx?}X=j{J_#-+8teYkAacj2SPzL9u*$Bccm(ueKK@(BXJ8_@~o;sx`4lEjc;=n2c&!Q6t9(?7*feq_U9Qb_wi34qpyne9Rsn-wo zOF04^t0)vn}<|*iTarb-ugp z;U%ZH99|o@_3-iZt%tYdZaw_*MOzO)ck$N4^#fZEcWJTpaLtxm57)-CrTf;yU-#I0 zc<|j@5Bq*j`f30A{Xb9pDC4(RFY0{6`%kx{55#vrT8`%-JpY{6{pjmy-H%q!>V9^LO?ne(?+x_Ut>$)GUcXRinTY{e*n>F&+W1Aj3c5K-*$BrF(`Pi{PUO9Gb z(28Tn>VA0a*ms+b9ow+;*sF*dD-#eF?d#$9e1xUJATclWyf#YQFeUdf2N%}_2jfur|~4t znRY7j+_Y1dFPe60*2~jQop^KFsmE5qy=&U30pCnJb??4urxyP6y#wEIrdkUwY;$Jm)uGdS-Q(rDvA(SbFB^ z9~QY>L!O9hQRCgXuJcno2VYF_Bri?z_2M?rp#^D+Nncw^9F2A?`H-2xQgMRN{d0AfHMOofdJY|<;dHWY;c|UBF<(<|v z%X??5EU%|^miLXFH50dmMMEJ}Pm>l2M75EghAZvuaf0 zHSYmu^Qc7kj!}u}yGA8$`ld$mkak}tkKdJ>^62i|l>Xo5rt~?KoATEMc`3dcc`2!Q z$_nyQ`q#}%`LJkhy$HAhSh9AhYqa zfy^uLlq?Knezh`?`SIF7=Exm^%%wjDGT%NN$o&2$lApZoeKf6F&V`B!Wmycn?=+R*Ai;o9$zkMN?``cpRyc*2SdwOBs z1$bV3W?|kN6$|qU7A?&CZ1KXpXWm?xm$hbLUeo`>-jxSLQNI6K%PWu4tV}IeMDYML zFg(Ho#T(Q_1j~a37Fk(#ahZi6FTeu@@B6;*`^Ez;!7RI=EW67PL_y0e{ia#J&pXc! zhjH!9Yk&Q|eLv3Z?mVA)-*=wRGtYa>aCTeM8J}-!y5vjz{_VD=L#}RXdOhkv(^kE% zXgyosY4Jn5J1s``y3^vbzIR%D0c;*{r^Wg)cUm}G?zHG30(0-Q@Y!~!#hC4PTGTvt zr^R>Hl@4AlS~{-w80NTg^F_zkwq0~=u>YdtS4S>7c0F~`vHiOj9T&ZK(QzrT<%5fk zy&mHG>K{7RsrR8{llmVzzPIDL;#9h;rJ?wETHcyQhE-rv_9->PxLabWEmjzfTt zpT6NZz2ObVzK%B>ueH75_>J|x!eL@7aGvTE=Q`EtMMFORh<0Y%M%6Og<~^0!_Q!^qZQt&f z*>=u=%(ioZ--qD)5t(iKznR&#eo$uHtA@GhYj6=kqY2-54RT-KS3m zw!2w3u-)^|1h(t%5ZKPrKCoQ|kO|D|9N5l0Jh0uv5rOUE+xfO%(ZRRohFjekHQe?AtykA@TfDi3+omlw+_nPs57lrppQz#1?Bg14 z58C%|Yw=nSw~n4Y+^Ts4rXFq~Vh^|V(|Wk=OzPpb4|pcIhnujuhufxYJ>1%z>fsjG z!{1%#=kMOq*WcZ3h`;+4tH1lAID9wF-~FY{{_eZC`Md7{Htg_sZ?nhWJ@LH1ds0TS zd&jSm-536l?0&y6+5I6<_hzzt+}&jN#dT)8-v)MQXS*+KGuu7nmD%o=PP5(HzP#+! z7hc}vvA)G7kMvfXJQjOz@>l{m4A|t+bI>M_y~8$njP>8-QE$>Fk7kqc-SkZ!@1<_? zm~}79Hk5!-d8@+dN=fp_YNEu?>!E<^?JPb9lv;Q-KcnPKXbhI z#He`hZ&UDHYP|QHCGp-ZQ3!uogBvae&saA_eY>@n=!tl z-NyJn*L{rdvHoLxFAW*v+i%1e-++KIzH>uyY~&c<>P;66>GRIHA%8ST9eS;C>d;Zm zQ-_WP!nLVGzi*p5bcu87Q2!pOL+|xW9eSZp>d-Iyr4Fq-B6a8=qf>|KXZ$d9+l&2& zeO8!0%-j8q*NrXi4*&F<1%5w#zrgRgTMPX5++E<8d2fNA>$3~}d>SqE>(OqZ-<}Q& z{SLme(65*KLcjjN+9*}9c zFuGOrh0&d3E{vWLe_^!Kv>SUF)w8s`LE%pe8S@59)VpxbEt20lJ!h2I!u@AD|mkCs6mN zOQ0^fW1wz6aK3k-E~bB=?y66qF6{L{-E_Y|UERPyT~^#$-Ohxyx;Zn~>Q>KQtE;_X zt#0?WwYr4eYjpz-;N>r*R#)x9T3vOZ@wv}+=dwT7eg4_!x+?|1lb3XN zYFyGyYjR09spBQxAooi;U*Ll-mvml3F6nZHU($WjDKhxS&XK{521Ewm92OaTepF~f$>SdCzpuz8U#VTC|+s!LcRFa!8&365Fi5;kXfi| zw&C-^DPiu1r-Yq8H6?7$nJHm&frPK8gth!(N?7gODPgbPTx$T+mSZm$=zuaQukx~roZvI(f&rKP=DhO zMt@_s9sb6YUH-;Yz-gbq@#q16W51*R#;4Eu8)u#OH*WpV-P4G< zZ;3u3x5P1Fx5Q5;+!AkEZi&yw+!FgI-x4hgZ;2T|CNOX9Ezz8IOMH0pmiXEyo-vKz zI~kMRxPEMSi~6xCt?I|FYEwVb>o8V}TAAw#RMwWP9A9?Co&}a<|6~zqvi`8_kZmLr?99OKG?x?wyu9 z;<8)sh)epSdVI$l)#DfbT0Q>$-__$E0(JkX9v@e$M*QNJYQ*0LcDU7uU)Zfid`O=f z@s@ry;@`UDGHEJM{|lE%&t7(!l<=L)B)2OrlNR1_ne^ak*GbWhTqo^n>^kX6Th~dy zI=fDK_7&GjL*^Auiri8-Y0~z>Nw;cslM+wni}&_qp6?eHJaM;TBE6s zz?feeO}%xe(bP}tJvX%pW-_m14$Kv+PSb#Bpb0*20mcCf3I$;>Py?7$fWN8>e1ZM9 zd<5YvP{UUce1Rpvw}8VCK`;OZfF4+Gb`RSb*nR}Oi|KU>&=MHfLnEvJt^t?uN2g~1 z9>6~Qap`fuGr&XOH$3VQ1snuA0JpF{+8t}C_F}see`LuC2nUS#+#a}r{nN8FLb{_y zsM|^-yb0tuXau*G8X*B_j_*xC7WN0U)(C&%_g%np>c&QrT}MwQ^{)gW5o>ln1b)S&EL*?x9JXVD?Lbmn)E&6pMi6!YMec88`;4aux(X;0o{%pS@iLAqCjp0ju$V&#)hat%w&$HNr7-{zRJtpZ^a}H)7ii z+fDZbVHCE@fFH512igDyckzcgfe~1u8NCY&4!7YtI;0>s&qn)&SM7<9Y&%^9A7z;3FUwpB--CT4P%SesLY!CHVX%@G)RGDhTfYFC4>P znF2zOpxuCm_^#Gr@EpQ*1;%0j7*G$twMQL?HPHwwfuDh##u{N2;QXRScpckXz*$VS zTJgCiem{flmL!dE6KDv$3EWE12+sl+r{S6dqp`mgn3kv!J^(rcW=!pW{3EV)EkRg| zXQ_`()d&v&XJ8`Gc#1~&e6mKE2Mh$B1kO&<2%GTz7~mS<;07PYqSx<%@z}4Atsn3~ zM~!f_10K2nqJZi6d>`AM*fwgf5q=+udIsQ)C_pd}?T_{aJb_)n6(AkQ3~nojRb)$w$#0V8ED`RjyVm)UIIUsDdc+f%>=d_Ene z5&q~54q!9zau+OU2R_1n8{i)gXa(B>e76#a0?q-?duW6vGZ9l}zz?t;jBO2I0k8$1 zdnY3{&4O=XKMmVx;32^NH+d!aYr~I##Xvr;<$j1(KfmfmZw}4|`V;Bec2l)0YL0AMh zVt>Flg7EjZ;KFtxV8nh);3%+3i+5L#gCD#M|AdxDKY*@*<-q+v!F?ZX0^|X^ffo3F zz+cb=kOZ6o+NMG~cLc#7SOMsMM>_-GV!z!Vf^ZG{TYx**KLA7m9(NHhvBu&K)*BoH z;($6~h<(5e;2hwI@BYCyGF&5c1a<+}fU_Am-$#fgKpJrHW5f%f4zTMJy!i=u64?AH z;sx*!`**Q@^)l`iz*A_K3~XP1{tNi4#y|(`W6JzY%gQG32afJh_Ar0c=#K(3nrm_z-H|Kh^;G*n+MIs-9Vct}EaQL<3uN&>YYN7zYdvLR$mxjzb$^ z`vnmDx*)g=$9Ka7Aq;4S&z}K3{O}MuzTY)M5R$R|9iLYML-Dy~1Y*l~c=*Z<@n{(0 z6Yx2(cQ|75>xkdLJHXTUJQf)2rxE_bb``eQf$#TX)z&nPu&xn&&_yG71IL_^Zvd+h zpZ$OV%s4F;tzq)9I{@7-9#&ra`0l#?QegupH!ti@j;2>av zU#2faJ^{F6f7t@WB_JEn0=e^1SD-F_PXzh{18N{%PD5--!12Hs;1E9d0^)$tQ<3k$ z|5{?Z6!-+FiSJKY@YjXlt6PFK!tqmRzg1|fm1s|(3HI*-XMxuNm(|c1Pu2_*l3@&o6;$Mwec zU0kbaKs9`x4)g&A|0oElz*E2nIA-`<#FkW?ANUIR2%qNz&jGdP2|_>MA@B~61azA( z2p2v?zVRmX_Xaqz-H7clAQ$`pj6#_Mp?hEgun(Wd0CfS~1(ahP+SQ;DP9Pq?1>AiJ zc>%UZu@wP#;J0SDc0d%+0l0kMiT72f!fUXf$j1K8MffWbJ>V}5aZR3tj{xz&xN6`8{sh=N z$QJ`Y0lMlq7I*;c1H|qcAU$LKt zW2OTAfZMWKr8`jIUue8iNJ^WJP+uL{g{^M z7Xg1^|1h?JPiutP^)6Aq=>IhGEo}DzUfBO1$~p(zX80Tm?R|#h zW&=&Je;M&O7IE<9Hqa}s;f*2abHG=Pz+PY{K8FKNKuceZu+ay7Dj*d5dB9fS&%qjD z&mi2Vu$==m9H0??1vdBB2%UiQ{ot?o+#Sb!G7x=ppxq_Z@pHsnU;*&-XUOHV1;Glm z0lv+`wFh?M`_aH%pl$<=5CFXU49W=ngzFxI?IwKJr6Kxn*oHof>kNE?&q=^ooO@Px zK{yHA1pGa5J%LleEuaOy8v*zs_Gp2bzzJa6Zrn?EA@=~#&{j0<_Zr#{(fi>@$d^*dD_6CcvJ)N_iUhBVZWdiO=t0+YaX#x)U)QxB{%) z4lM!gci=c|YXWDs!7uPR9jJk0JR&v18VAI;e^6E+7jP61>mK4>0hj^y9K%g)o&QFh z2X+D1fvG{r<$%+``-m4QKy~c@2}J7<%YgCF>P>790PV2<@&&ZrdnhCDEzl51J&)Wx z6Xn77Q(zkQy94(#5KHm-!k>uyw~*7ef}R}_^MFr*X83FXhP6h&8F&Ji?gae-oq-$p z+%_K^S-2m0BVPor0X2YAeQ+-Y=J(bJ-vF(!|9)SMFd1+Ip2hV(8H@WVFf#^P0JPX2 z@fO+0vzIzLt>j1APBRPQJ(j446qCJeE|4if58Wc1Hcu)?IL0-kOahh zh}a0^u7l4^!Sz8*jA?><)nACEHIVn=zPk(<2l(LgNgxUMp*nIwAPT4kbOoNn_nB|u z-Z2YtekQI3@HY03%)otSI_@{X0l)*_N8>v;;13`cpWmF0>zst^kL@DBn20`P0@@qf z2Kat6w%-6#v40F0095ONYmD6G5bzKfFahNP&PE_E1B|GE zfuFD+fZyu^@8Yu__k}jVzUIhbflk0g;NHv7Gtdi|3_Jn6_Yz_naQRh?1puRf6~G2} zjqoGzawpsquyp`(+%W!v&uf5h0k5sN#(?WK#BXdzY(bj=zX9Vnqs@TEK>Q};nLu@X z?*+fAKM=XwGFJlI^c!xssYo0C3P^41RQ<}_fKF}ZTLnl-S77l!d z@4wVzJgOG1e@(O#w*J7W8qgoG2=Ku7^?<9`KZq@!j)uP?$7+jQsvY`wzy;vE6Rr{P z7SON_d>YsT{0a2Kv5SE^hj3r(i~C#%?m2IxzXBWvuExWcu2Zvc~k^BZt4!!{Y)YS<3O zcFB6=9Y6q3AD^?a)#V_5{*1f`+n=r=AI5$>un(X2{Dk-mj05`Nx5dDp*k5!CzTXEA zl|Zb$(<;vS5#ry!tkVwPWp4$6&_~5<1{+q^U6*-0jD$x1(h8Zf#O>P2(IFGi^9`N z5dvaiWrvA)#On3R4zr-uq6JH3hlwazgs>ck^(uYoz2O(^Iig^cN-qq<9&0)FbeSF) zhEHZV1U)ciKr4(Fj(}uLfm7OyP_9kWn1?oDUgAi{90dqn8#sdsLA< zk;-lndLbDHI97Cktn&A&cAzL|kbYFk$kd6KVN`Y?DQ|M+2a>Ar*GDR2B*ip9T2x6H zNe$tZA4r~ltnvfNi?ztwDmgWI=%lI~$h_}TQhZDedHb z@PGDnH_NWPfoSYmkd3h-8t|J*I1i&P_8Q6RxUbw;6k0!{@XSmlLzNkmQj(P!lUlx1 zW=x8Cwt=ELlWK-5GbZIMRAx--VIzwQoP-p_rdbpjGZl?gW=u+2qRg1oB%s&s%7kGO z!l0G$$Vp1~cB7@9jEF2nR#tbIc-UtmD`}xpQ&IRznJH6IGmK8yU0~8sk`hx=P=OLt z(oev13JOf>$x>oU+Hrnf!C6T;>y?<2ZZsI8visuDy(dD6DQV^lC8ng9c42m;iBMH^~0G0MppH3^7@pj9!{QquBwNVcR#4=;pEYsF#cbq zh9oZzs_Nn7xl5~hIC<-bRX?1?^%_m9Sa$MC&#E3yp18Q;!~5coWa%(&$x6;H)I}Wb zR=!6*dbsSF?#&dKiNYHD&6uZF$6%>lg(QzP*=t6gd)Zzy@?bViVpk!_lXu!{MjqX; zxt(Vt&wkrpGxG4O_M0(J_tn~2Nb>k&_L`CBH*bM?tnyvi5B@F|@y-S|HVEd z^6^(3?Wz-H8AlaInIiVNhJv`ii~X;kEOO-qy+lbSwKW=v}OpHgF{rUqE`ED6Fs_arrSRAx+S8VloI zOfzMlna$bKIu3eEaM|jL2gv}nB(mC8@FNq2{k+JS8b9DeM(Vu7hm6$f;KAhrka`F5 zAtN=%^C2U3uj4~TYX6)M8L7W!XD%0j`dvZ$Vh+eW%NKg(vy!Vp;H`#0 zjuOZC5Q)MkJcw9y$Wu>5k>QChs@sU7LNoP56cM_sC!%QZhI%531fqH(iURA^6Hx>> z%Y%sJ0^g}8BIQ3&PeiJB?TY7-$``G_v<8&DOP(F`@1E>HnDGG9cirat`8K<0pwD_)a0#adZFU%xXMTLGC zJuaRHc^zg|x-FMBlNC5ajkzeKD>rBAyQ|ckwD(GHg>@(8g)22D-R)FrPO7`A)SNWe zxR1iRlj3}onv>oVm7BBd_CuxSq_x`K3hPcv6Jg$LfHc|_^~kuf7e>I0!Z94+SkVEp zdahONKv8(MZxtAsB6?PSAo>2($`2$jPp|wy^5^@NA4r}%v|pu_As?Mu`GMq(H!44n z{LZs~rKhHNKCSWt$(PPnejs^`#{fK)P_|RBsQvFAj|B#u>@kqN>K$c6Z*>O08pI+E8Owcn7u_?G>K}UZ3HkkP zdrZjV*}F)qTz&HOAbU*6%h%guLjL`sJtpMYO^4c17xHPneJ0GC_u6AZew=TQ33;&R zFf7C_+bxSbuw_ShD@=PRGnG9&O)Z5e+)+ot6wv;46%`>xOjScc3i(nE1u3T8a1|9H z1tqGXAVqzohJqB<#!p2>NO9BEQ7{EwRzpFGY&SwhMM$A*LD8`?nLRqh^c#%ucjDQU z_M=IDv8*38l2z&Auhm^AoZR0}DeG-z#-yoZ%8W@(w_#jP9#Slf(t}0LfmOIgmNt=<)LE&iD0nF| zmHIPEOi4olN=!*XIwhv0AEOdeQqS8;Oi4R4m6(!p7Ai3%-KJ z%z2o)4MY!y{Q-1(vrSc28-4<_ZuXnW%GohWg}Era`G#V1rl1$zRA^2ravrVFoRrjc zj6!o#Q=hR4%}G(i$0;-?Rdo(hXl_%MPN6xeYk9C@bEdF&Lll~m%Fc%>G$*BngkgHM zV#!qWt|?hMVdFW_h{9a;G)zhd)zXlpuBxRWX}u7xvTaCWBh}K7)E23wA<3OpOGDDD zZBW@ZBtbv*G)#&!)zXk8PphRNX*QgI*H%{~P1ctRL2t_{y^?1ndR`XXFzGcU-enGu z`+{;LUrIRw?08(%c)?V}V<|O@6eAu7HARo}kAs>bimUN4GzdkR<&T4!A`hm}`8yv) zqp-(8O%W>RaZuZ$mgzAx2u;SFdmPjh-P)TUL#Zj^{Q&9;)Be)0vXetk=O_hcIHUb$ zEM)Am*Nno!J$ub;dHF;;>qat8ve%3x`jfq8B)_&6I}1tDT5qoz$>xFmX6)wf7j0)D z$=z4mYeufzLBwM6ite;SaoZL#P|E&g?{l@3vx;{vhB)v9|^ zxs{Nj%n=ZFtSC6JX9!uhfSxndp?jbgo_iZZ@b((X(PO1@V^OF*N#U7URESY#Y>NPs z6`h&X&i>Auf(9dH>!v6&wx!Hd6&aIa*`EYcP;63X$TUU9q{Mm&3XPfS_9!zZh4o2P zbY@ah$D~S(heJIRamQwNYkK~jjZo_`PAv*2VBD)BRaImxtLw?>s!2p)fLao!wwdZk zNOiZ=k&yb{n4zjoNQLR@NJxz@%v4npQl(iP390k0IucUpuvx0ALmkcS>PSenPbI4= z38{B0NP1KxK=za@8!VIG)Js{n9z$p%eqnDodI*Ys>L_F-x0ua|3i&l3DyHfv9#o|5 zojj;W;a~EgBAq`oheNZI+6VBUBF#_aK}E{n%Y%yae}fMdyJxpg;n3_93&!xEqKL4k zDpVD}&0Ci9H@v7s;fd5Lv{mJ$VsduoK}B*7XVGxkxn;#efluRTEJJa9E<6i1h!FdLmN)PfJyo zh_t_H83!V!{I{2@CbD(JSEwc;)vsKMm5^0a{iAD({Z>`dBPiDUqo%Ub_o$^1h3czS zm4c~ztQrc^^>H;6r08eXsHg~O*`S7kRD4bi1?jixS``%`<%()3NV6ZSqhM-ny-r0% zNT*ZPP>@2u0!62)DYW#8Ig((x*7te%)QD9NS9wLCm>bU+@QD- zNt15M2}qHnl@pL2XDTNkH6Bn-KwA7-4FOYPqm7EM0_o6OIRU9K4g?jBKUZaa*k+In zs7T6HA(7SjAwM!vxW$W%skY80F4ZIjci}@uY7XT?M#^5mhm2Hyhz}Vl{yRQor2ZzG zxm-<(1bujsv8WKnhm0abDjzb679W7Dw+|+=*aH@&AFZGla+DT&bUBMtu7hTfdKx)m zcyHlICkm_h(Xps;gBKmejj>xfRhA-01}{2_9X+>kDjh|S{k-TXe$?O2sdN-UcJQL3 z7}8(|r_#|BTNE!kiX&g~qN7MMb0=QXQg#UNE^`#_HViu1V<1O|bGsB7io(?03JjUz z2kf!ikhDE&uib{E;y3r%ZAf|@y5DX?Qs(djb{mogJr3G!NNRigkllu)tE9sU4B35n z(-FH3Nh?c_+HFXxc=0&?99!8=Ue=PVhG|%vTJ^(aMRZeQCJJNhH)Co@ve%5XkY=wL zDWSk#Gtxo36Lz*FsUX~5Gt$5+d(B7z-`Q(M{{P%bJL^XG4_|xD$oJ>iYet@b8)jX~ zcIC=nQ{MU%ILTdU|9SLdcrPHde4k>MrIug=d zj5-oh;ZAiVq{*+kGYOM3NCM?&hI3=)sB1z0>;Qg&Xq4W>Pmnaaw2Pc4Ng zm7aXu z4wFi6k)=&!CB3WER1_{NGi56JMTseC=$Q-!btMJ0S7J)~8KlIN)Dxw|l(aKfi76>( zyAo5aY>9N0r6D{CH4 zI=p0`A01O*Aul>oW!v+d+K!YO$%~HEyO$RoDf(Albfj{R_c*m3DLsyUGufBf*IG?KoT% zPFMYKrsSp{RFR#Oy0of?lM)+VtRg!pZDmytCnae=tRg!pWqDN(CndD|sEX|5>D#J) zIP>JTA6Jo`JoQvn4<}EI|Kwln>`fykfh~n$f9lwRmk_eY#0)|VJ_(;<9JaJaR&==R znH`mwiNYxR&6uYq+G|E0d)8hv^4#iKb~Xulu&2FdqZ{# zZ@(Gy^u_j?k;gB!*Ni;>iO&QIaL$dsRJ{d35d1 zt5gi~<1tk`n7nsK)ea_~{jF*Tlc#pRRHZVLe_E?{FnQ&vsvS(e_}mv&DhACL8LM_M z`Q4GK9ZcTl{w2n)hDotB;*nKHm7+6~_xgOT z$e6tOZ)L{h-3Pu=bY}AQ;BOTfllM3JPLVOG;XP%>q>i_~S9E4lOS>Nw8IyXxQ)WzR zn)f4m;<7Mw0{cU-rC0LxhSFG1oE?LgKwH+zfmlqvrc?mB%Qup_~=t%Dkf9BM76amKYqNA9wnjam@>b~MdM{%QJ4yU%G zND=`${81j($BDqdWknM9(iHTKQIsf9Pek#dSFY+dqR22uJrTu(_tXPKrFJ)SPtqbb-RNQVd<$}hAtNV$3;=!RE4 zZd67mN01J`JqB7)7|WlQMV0BiX(_&Z%A1xVO_MvE+m>QZ5N}$FK6`o7QXIO+o0cNd zsNXraEybp-{ApRQ;TCUNidS9#;M@olxz2%hNJXKB&8HUUIqZ$NVE}uXF8f}O@dfsD zlv$X7eHO){g}*>Kk}stk!3N)bOw^*V=Uzda6WigNw_d<+d@%f}uEHATCh9|tu>yh-;f89DVuPG-Wq zj1gOUQ8>-7%YUcq6A)B5a#|UI9L?%H;6jAALGU1Ak?L*rL==}!s3)Q*^u%AP+lXS0 zw|XLqFw@i%Q9L=To`|AH`HG)TFavqLY zU=q9l_9w05(7R#pUs?jwN`pz+rg8+xS4$xZZZ%Yuf+;>u4FxIvyc!BpxMNKf6(MEM zQbR$C{#6YHDS1FG6%`=`zpsXZl_C$ zMN+RSk*waHb+{6W!Wy20OxX|k5t7agb-7iURG-I>kYd27dfZA#5#cgFLW&Pv>vJn1 zMT;DMgcLg_Jk70y6iIUV5mHc z6nREI$FYIF^3Yfbzhu}D;h{V}xi-s}1kNGe=w zQWX+8>MU!_jZ74rU*tr_BF$+&WE5kjHQ`b+iY|UlxsXv@Y1)hn8AX&_K4cV2l3wCc zGKwNIU*9Y5r6I-tpq7TT z?$uglrKoqZQY{VXyHG6+DLd9lQ}Ht$#ZO$8qiqmWI5SxpfvoPA+i)R*zIhNag)dc4 zL>j-Lo`_W5yRGUrBAqW)Pee+;s-B3n-mjhNs*&1vsV5@6|HFfb-PcF9S6wyI{6_Ue zqN~12v~WBvdZVHBM^l>Y6zIB-&amRYR*?qKq{{3qPP)B zy{(lKkZQe^6OdX%l@pLk6O|K?I=84HV5)paIRUBhN96>h!slHp>4TSi$A-R~+}Z;q z752faLL#d(m>-!ar0^nRsy)t!j1+vE4;iVsLkBJwfRt_FLq;m!#fOX(e~AwnssH(o zT-uBxK>#l@78N$}A)^TK9Un4^7JXl-QnZj)43?d(CxE01(V}7!Ia(a$M zqPiQGYErat<3mQ#!pw(^qQzD|WE3rO_>fVw$mK&u(W0F@m#az9LdT1YMT-H$lpPrc!T?=@svF2r;B94wqOezqAyfC~_8XFtHLu!T zM^f!*`wdBFRllq>cdk}BLfYuHP| z%5w6`|LV+}FvjEA%8X^T{H&ft6r#GQED2N519c>%s9jxEm4wt4*G&}(DecwQRFRPC zepg3A3QYA>RT5I8Z+BHBq|Cq6k}#DX@1d$Bq*zl=RV1X|gkI7tR9ONXfi*IbSRZ4C zJjHT)%ALHV@q4A_vVxcJpb>>%)YC8(_wKE-Ql#VEYH3KxE&He}4QY9US{hPw18hgJkcv`}ViVL* zkXkRRqhR;n4ue%xgj70L4FxImNgoY+CvU|vd-P93`NOE3bh}vAj~dCU?BlE0SQK6v zqR^NrvH4I%#-zb|!xR~l`W`4VCf!|sUD26IahHcHGA6B^_fup{Dmy$vkum9OqrXC9 zrmXoR6&aJJCI=`oCN)I_Y6REH)Kq%rb=0UT+#*Yx$V!^5)KnC1U`CQ&La75>wL77A2;nocEQOl5T!cX3A94@=XOTOqv<4#FP{>AEs{X zO)$~u-5H*=L=S`^kl9%?4TjK@Ju621F4s7byqV;{q1Bxy%J z4r-G9&c{JbA>rG{K~3S}#c_|Jttpg*JRWKmW>!27Y6?N0JPv9KPp(0gBm(TEDt!=; zLNM{EFA6;-C1#?q(|$7+GOpNbM&ZC!XJ_3=>J#lXBN?aLYeo`n5^QH7Nq(XBnvt}= zvDb`b;}K$KA!$@}p1o$|?qAw#My@;|6eBwo-Dyj&&}C2Im40(87PEq)pE?Tp=A6%q zN))Q=xs-}2sW}fSQkN$WDpK4?9#o{lDLkl1nVWb}ky5YLqVcbipu^a_{S5G1eUB;^{2~&QI zIug?S59&xr?SsNqRflxGR~-o{yrw}_Nl4o|btI(fe03zG=iU=kRmb)`ojMZI@B?)u zq~2u_mE6zS8Y82$Lct&@_uu#PKR{98{k(DtS;>QpoTx-$2_Gt^>JNBOk+xeza;P9F zd^!&*()leORHXJdOdKjmnm@;bij+Uh%%N1I{|r7KwCZZ@X<1N)h6a!|*sV1TbFe6?y5$QktZPi4i{)>}T6Os16 zp3H%W-N-LZQB6d;e{ZU4B2s;q1UykuHPMz{f8m%|<#18jP*%CWIs!a`tA>E7`jm14 zQuA%)1f=4YNs1eh)H_l+0jYMDaspE83FQQ&(i_SNNS!ZDSKNqnKOUx>fYdlsIRUBg zBM^A_Aw?DiFZ>}hgD@ETaaDS>O)~@ia%HBn5+l@7h{Ct(D3}@t&s0$n(&I;JC`gf} zSt?3Fn$#q#pdeKytDzuW3bR#|f|R*O4Fze_YmSOikUGCqLqYlsN>Nb?QfP-%JPS~n z%qoA(?gVHCsi%>Zdxa;RDAbtCt#nM$uDs|--4l4xkiUuv_ zak{b;8HVzrqbL#2kB(*8$9U0E^tj54jv`5)`Ir}|ECf{6*Ny?n0JS7?6v^U8CJL<< za4H##Ad~r!QT)i^Lq^dfcp;Z+QtY_Ehm0aet3_N&MsZ^bA2Ny>xA>4z%b8g&J(@?MTNbF$|>Xsa-SEKC^Xv7rBp0(xbmQ)s4<8K6-A729#j-97W1H@NO6V- z6-9|3cu-M~%0B(5rZ>+_8ptaGD8^|1@%BdEwxHcsfxS``?|8MX25X)#)gTH9PblH6}&6 z)&JG$C>l0C{2$ehBIbtw>U0!Us~!1|YDbZG-hXvEiq1`r{ztW=5#L$=)#)h8-~O*o zM|Xk~$MDQUMIpL)K}6|^Q}^RoX|BXjj@I$&2=H{H8UhwkYo{r$0>#MJl@n0ZTcMnQ z;@B1C1QeN^PAF~ziZzkS2`G9TQBFYd;Gr4F|mzesoN|S9#HqmOW2%YCBT)9$s{$^9Q`>NcBU~IaQWo zz(QVh6cMiQqNDiWe1=nHDIZwGi;iN)SG?#bk_4Z{!;pS>Zc2|=4U~Ryu9q}gtjBB+ zd!c8X^g>S&@6Pisb7tr$hx^6q3meV@|@Jo zC@U^3BoK6k-xLsH`f z`wdBT7v8t~jHIsQ4-^`Y~si7ckZB;`-D$7zsL3+EdhJuvm`H6}vLK=)z zN5Ry%L=6S$GE)r&DYV(A_~S-pE3|l=>(K{)2EqsrCzPel@{MFw&Q)$K3fW4HrTbWx zqGFQvXY)wYAOoNm6~ut%veQ_kPYj7d8&UnnXzspqaTW75y)FBP4c6!e`kW71H^%ZkoS zDoRskOgi%XO3|5VJaoGJ|dS36}x{<%Hu#qF<{y?4pbBo-oK8aoATv65cl1(@3DX1 zz!b0&Ls|XL7pNi-1$Q+BOzFPL2}s`)loODu=P4&3EvG3bu-$)^6Oe8nDkmVdY6}(n z0cmuA8Um)w807?{$5qM+NQFOwz_ola4Z}JHww6I}TSdxNHfV05Uud6+th_{}rlN37 znJH77&n*Q7CY{|LET zcNCnJbkp*81*W7J?H`zvEZ_avJBg$42p9V^oAgI}_pE=(lY3{s!X;)mxFVtX{8bs!2p)fm#x#-tW|rkb2#pP*ojL z?_PBzq+ZRFs!BrYov4n4)cdYF5>juc>Z+RqXpgx#ZWsUsov_OGF;I;7qlkW?_B zRr0}|vK8E=W;MaPqWf?08zssnkX1Z^50NM=<3YsKd{#XXDf*szB2sm)TB;kHls#EJ z5vlu>dLmNzUG+qyaLVi$~Wut%6|% z;i7y)S><1;BM^n>>!>IJQ}qbt1f=Fg$_YrtS;`4Wz4hxVZUa)Sk8%Q1>m20-q|*15 z6OcM<)KlCBltFtdCm=N@DkmTnz5{{^=A}m>bG9ISu<^X|dcS{zqJnwps!+(vY+0WZ zl_>P%L⪙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 z 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�*$3# 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ุ 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�%cP(6*`sfAdi7U5a- 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 CBqpx_ diff --git a/runtime/CSharp/.nuget/NuGet.targets b/runtime/CSharp/.nuget/NuGet.targets deleted file mode 100644 index 2c3545bc7..000000000 --- a/runtime/CSharp/.nuget/NuGet.targets +++ /dev/null @@ -1,151 +0,0 @@ - - - - $(MSBuildProjectDirectory)\..\ - - - false - - - false - - - true - - - false - - - - - - - - - - - $([System.IO.Path]::Combine($(SolutionDir), ".nuget")) - - - - - $(SolutionDir).nuget - - - - packages.$(MSBuildProjectName.Replace(' ', '_')).config - - - - - - $(PackagesProjectConfig) - - - - - packages.config - - - - - - - $(NuGetToolsPath)\NuGet.exe - @(PackageSource) - - "$(NuGetExePath)" - mono --runtime=v4.0.30319 $(NuGetExePath) - - $(TargetDir.Trim('\\')) - - -RequireConsent - -NonInteractive - - "$(SolutionDir) " - "$(SolutionDir)" - - - $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir) - $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols - - - - RestorePackages; - $(BuildDependsOn); - - - - - $(BuildDependsOn); - BuildPackage; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net20.csproj b/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net20.csproj deleted file mode 100644 index e4eb212c4..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net20.csproj +++ /dev/null @@ -1,127 +0,0 @@ - - - - - Debug - AnyCPU - {0A4681C4-1248-4ACD-B59F-D6CC17CC2B4C} - Library - Properties - Antlr4.Runtime.Test - Antlr4.Runtime.Test.net20 - v3.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - obj\net20\ - ..\ - true - - - true - full - false - bin\net20\Debug\ - DEBUG;TRACE;NET20;NET20PLUS - prompt - 4 - true - - - pdbonly - true - bin\net20\Release\ - TRACE;NET20;NET20PLUS - prompt - 4 - true - - - true - - - TestingKey.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {e1a46d9d-66cb-46e8-93b0-7fc87299abef} - Antlr4.Runtime.net20 - - - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net30.csproj b/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net30.csproj deleted file mode 100644 index 53fb7d063..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net30.csproj +++ /dev/null @@ -1,127 +0,0 @@ - - - - - Debug - AnyCPU - {8A2F2331-A4A5-4C7F-8D5D-DEECEF54AEA7} - Library - Properties - Antlr4.Runtime.Test - Antlr4.Runtime.Test.net30 - v3.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - obj\net30\ - ..\ - true - - - true - full - false - bin\net30\Debug\ - DEBUG;TRACE;NET30;NET30PLUS;NET20PLUS - prompt - 4 - true - - - pdbonly - true - bin\net30\Release\ - TRACE;NET30;NET30PLUS;NET20PLUS - prompt - 4 - true - - - true - - - TestingKey.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {ebbdcc35-43cc-416c-860b-9fc115f1eb42} - Antlr4.Runtime.net30 - - - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net35-client.csproj b/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net35-client.csproj deleted file mode 100644 index 0791a16a3..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net35-client.csproj +++ /dev/null @@ -1,127 +0,0 @@ - - - - - Debug - AnyCPU - {C4A38390-8AA3-45AE-9A70-C392146B37D0} - Library - Properties - Antlr4.Runtime.Test - Antlr4.Runtime.Test.net35_client - v3.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - obj\net35\ - ..\ - true - - - true - full - false - bin\net35\Debug\ - DEBUG;TRACE;NET35;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - pdbonly - true - bin\net35\Release\ - TRACE;NET35;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - true - - - TestingKey.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {e186fda3-1411-47ee-94c7-9f3745f0474b} - Antlr4.Runtime.net35-client - - - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net40-client.csproj b/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net40-client.csproj deleted file mode 100644 index 9e528e8eb..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net40-client.csproj +++ /dev/null @@ -1,128 +0,0 @@ - - - - - Debug - AnyCPU - {706D364A-CD4E-4720-B94C-0DB82AF7B433} - Library - Properties - Antlr4.Runtime.Test - Antlr4.Runtime.Test.net40_client - v4.0 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - obj\net40\ - ..\ - true - - - true - full - false - bin\net40\Debug\ - DEBUG;TRACE;NET40;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - pdbonly - true - bin\net40\Release\ - TRACE;NET40;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - true - - - TestingKey.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {423978df-85a4-409e-a16c-453683fe3969} - Antlr4.Runtime.net40-client - - - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net45.csproj b/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net45.csproj deleted file mode 100644 index 46d00d3a4..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.net45.csproj +++ /dev/null @@ -1,128 +0,0 @@ - - - - - Debug - AnyCPU - {9D8C43DF-71F9-4CC9-83AD-A39FAEBCECA0} - Library - Properties - Antlr4.Runtime.Test - Antlr4.Runtime.Test.net45 - v4.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - obj\net45\ - ..\ - true - - - true - full - false - bin\net45\Debug\ - DEBUG;TRACE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - pdbonly - true - bin\net45\Release\ - TRACE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - true - - - TestingKey.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {e1d192de-5347-48c4-a9f4-a8cba2af3869} - Antlr4.Runtime.net45 - - - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.portable-net40.csproj b/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.portable-net40.csproj deleted file mode 100644 index b5ac880c6..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.portable-net40.csproj +++ /dev/null @@ -1,128 +0,0 @@ - - - - - Debug - AnyCPU - {97C32E42-51B2-4A29-B005-769B63CFEFCA} - Library - Properties - Antlr4.Runtime.Test - Antlr4.Runtime.Test.portable_net40 - v4.0 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - obj\portable-net40\ - ..\ - true - - - true - full - false - bin\portable-net40\Debug\ - DEBUG;TRACE;PORTABLE;NET40;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - pdbonly - true - bin\portable-net40\Release\ - TRACE;PORTABLE;NET40;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - true - - - TestingKey.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {06c182c5-095c-4d43-9c33-c87e305c6bc2} - Antlr4.Runtime.portable-net40 - - - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.portable-net45.csproj b/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.portable-net45.csproj deleted file mode 100644 index e4c60d563..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Antlr4.Runtime.Test.portable-net45.csproj +++ /dev/null @@ -1,128 +0,0 @@ - - - - - Debug - AnyCPU - {5844076E-3C92-4122-BB7A-0D745C3F5334} - Library - Properties - Antlr4.Runtime.Test - Antlr4.Runtime.Test.portable_net45 - v4.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - obj\portable-net45\ - ..\ - true - - - true - full - false - bin\portable-net45\Debug\ - DEBUG;TRACE;PORTABLE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - pdbonly - true - bin\portable-net45\Release\ - TRACE;PORTABLE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - true - - - true - - - TestingKey.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {12269283-ee92-4faa-b849-53cd24f341fa} - Antlr4.Runtime.portable-net45 - - - - - - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/BaseTest.cs b/runtime/CSharp/Antlr4.Runtime.Test/BaseTest.cs deleted file mode 100644 index df9dbd717..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/BaseTest.cs +++ /dev/null @@ -1,1213 +0,0 @@ -namespace Antlr4.Runtime.Test -{ - using System; - using System.Collections.Generic; - using System.Text; - using Antlr4.Runtime.Misc; - using Microsoft.VisualStudio.TestTools.UnitTesting; - using Microsoft.Win32; - using Directory = System.IO.Directory; - using DirectoryInfo = System.IO.DirectoryInfo; - using File = System.IO.File; - using IOException = System.IO.IOException; - using Path = System.IO.Path; - using TextReader = System.IO.TextReader; - using Thread = System.Threading.Thread; - - public abstract class BaseTest - { -#if false - // -J-Dorg.antlr.v4.test.BaseTest.level=FINE - private static readonly Logger LOGGER = Logger.getLogger(typeof(BaseTest).getName()); - - public static readonly string newline = System.getProperty("line.separator"); - public static readonly string pathSep = System.getProperty("path.separator"); - - public static readonly bool TEST_IN_SAME_PROCESS = Boolean.parseBoolean(System.getProperty("antlr.testinprocess")); - public static readonly bool STRICT_COMPILE_CHECKS = Boolean.parseBoolean(System.getProperty("antlr.strictcompile")); - - /** - * Build up the full classpath we need, including the surefire path (if present) - */ - public static readonly string CLASSPATH = System.getProperty("java.class.path"); -#endif - - public string tmpdir = null; - - /** If error during parser execution, store stderr here; can't return - * stdout and stderr. This doesn't trap errors from running antlr. - */ - protected string stderrDuringParse; - - public TestContext TestContext - { - get; - set; - } - - [TestCleanup] - public void TestCleanup() - { - if (TestContext.CurrentTestOutcome == UnitTestOutcome.Passed) - { - // remove tmpdir if no error. - eraseTempDir(); - } - } - - [TestInitialize] - public void TestInitialize() - { - // new output dir for each test - string tempTestFolder = GetType().Name + "-" + (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond); - string dir = Path.Combine(Path.GetTempPath(), tempTestFolder); - if (Directory.Exists(dir)) - throw new InvalidOperationException(); - - tmpdir = dir; - } - - protected static string WindowsFolder - { - get - { -#if NET40PLUS - return Environment.GetFolderPath(Environment.SpecialFolder.Windows); -#else - string systemFolder = Environment.GetFolderPath(Environment.SpecialFolder.System); - return Path.GetDirectoryName(systemFolder); -#endif - } - } - - protected static string UserProfile - { - get - { -#if NET40PLUS - return Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); -#else - string documentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); - return Path.GetDirectoryName(documentsFolder); -#endif - } - } - - protected static string PathCombine(params string[] paths) - { -#if NET40PLUS - return Path.Combine(paths); -#else - string result = paths[0]; - for (int i = 1; i < paths.Length; i++) - result = Path.Combine(result, paths[i]); - - return result; -#endif - } - - /** Wow! much faster than compiling outside of VM. Finicky though. - * Had rules called r and modulo. Wouldn't compile til I changed to 'a'. - */ - protected virtual bool compile(params string[] fileNames) - { - DirectoryInfo outputDir = new DirectoryInfo(tmpdir); - try - { - string compiler = PathCombine(WindowsFolder, "Microsoft.NET", "Framework64", "v4.0.30319", "csc.exe"); - - List args = new List(); - args.AddRange(getCompileOptions()); - - bool hasTestClass = false; - foreach (String fileName in fileNames) - { - if (fileName.Equals("Test.cs")) - { - hasTestClass = true; - } - - if (fileName.EndsWith(".dll")) - { - args.Add("/reference:" + fileName); - } - else - { - args.Add(fileName); - } - } - - if (hasTestClass) - { - args.Insert(1, "/target:exe"); - args.Insert(1, "/reference:Parser.dll"); - args.Insert(1, "/out:Test.exe"); - } - else - { - args.Insert(1, "/target:library"); - args.Insert(1, "/out:Parser.dll"); - } - - System.Diagnostics.Process process = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(compiler, '"' + Utils.Join("\" \"", args) + '"') - { - UseShellExecute = false, - CreateNoWindow = true, - RedirectStandardOutput = true, - RedirectStandardError = true, - WorkingDirectory = tmpdir - }); - - StreamVacuum stdout = new StreamVacuum(process.StandardOutput); - StreamVacuum stderr = new StreamVacuum(process.StandardError); - stdout.start(); - stderr.start(); - process.WaitForExit(); - stdout.join(); - stderr.join(); - if (stdout.ToString().Length > 0) - { - Console.Error.WriteLine("compile stdout from: " + Utils.Join(" ", args)); - Console.Error.WriteLine(stdout); - } - if (stderr.ToString().Length > 0) - { - Console.Error.WriteLine("compile stderr from: " + Utils.Join(" ", args)); - Console.Error.WriteLine(stderr); - } - int ret = process.ExitCode; - return ret == 0; - } - catch (Exception) - { - Console.Error.WriteLine("can't exec compilation"); - //e.printStackTrace(System.err); - return false; - } - } - - public virtual IList getCompileOptions() - { - IList compileOptions = new List(); - compileOptions.Add("/debug"); - compileOptions.Add("/warn:4"); - compileOptions.Add("/nologo"); - compileOptions.Add("/reference:" + typeof(Lexer).Assembly.Location); - return compileOptions; - } - -#if false - public string getBootClassPath() - { - string path = System.getProperty("bootclasspath.java6"); - if (path != null) - { - return path; - } - - path = System.getProperty("java6.home"); - if (path == null) - { - path = System.getenv("JAVA6_HOME"); - } - - if (path != null) - { - return path + File.separatorChar + "lib" + File.separatorChar + "rt.jar"; - } - - return null; - } -#endif - - protected virtual string JavaHome - { - get - { - string javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment"; -#if NET40PLUS - using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default).OpenSubKey(javaKey)) -#else - using (var baseKey = Registry.LocalMachine.OpenSubKey(javaKey)) -#endif - { - string currentVersion = baseKey.GetValue("CurrentVersion").ToString(); - using (var homeKey = baseKey.OpenSubKey(currentVersion)) - return homeKey.GetValue("JavaHome").ToString(); - } - } - } - - protected virtual string MavenHome - { - get - { - string mavenHome = Environment.GetEnvironmentVariable("M2_HOME"); - if (!Directory.Exists(mavenHome)) - mavenHome = Path.Combine(UserProfile, ".m2"); - - return mavenHome; - } - } - - protected virtual string GetMavenArtifact(string groupId, string artifactId, string version, string classifier = null) - { - string folder = PathCombine(MavenHome, "repository", groupId.Replace('.', Path.DirectorySeparatorChar), artifactId, version); - string fileNameFormat = string.IsNullOrEmpty(classifier) ? "{0}-{1}.jar" : "{0}-{1}-{2}.jar"; - string fileName = string.Format(fileNameFormat, artifactId, version, classifier); - return Path.Combine(folder, fileName); - } - - /** Return true if all is ok, no errors */ - protected virtual bool antlr(string fileName, string grammarFileName, string grammarStr, bool defaultListener, params string[] extraOptions) - { - mkdir(tmpdir); - writeFile(tmpdir, fileName, grammarStr); - try - { - string compiler = PathCombine(JavaHome, "bin", "java.exe"); - - List classpath = new List(); - classpath.Add(GetMavenArtifact("com.tunnelvisionlabs", "antlr4-csharp", "4.3-SNAPSHOT")); - classpath.Add(GetMavenArtifact("com.tunnelvisionlabs", "antlr4-runtime", "4.3")); - classpath.Add(GetMavenArtifact("com.tunnelvisionlabs", "antlr4", "4.3")); - classpath.Add(GetMavenArtifact("org.antlr", "antlr-runtime", "3.5.2")); - classpath.Add(GetMavenArtifact("org.antlr", "ST4", "4.0.8")); - - List options = new List(); - options.Add("-cp"); - options.Add(Utils.Join(";", classpath)); - options.Add("org.antlr.v4.Tool"); - - options.AddRange(extraOptions); - options.Add("-o"); - options.Add(tmpdir); - options.Add("-lib"); - options.Add(tmpdir); - -#if PORTABLE - options.Add("-Dlanguage=CSharp_v4_5"); -#elif NET45 - options.Add("-Dlanguage=CSharp_v4_5"); -#elif NET40 - options.Add("-Dlanguage=CSharp_v4_0"); -#elif NET35 - options.Add("-Dlanguage=CSharp_v3_5"); -#elif NET30 - options.Add("-Dlanguage=CSharp_v3_0"); -#elif NET20 - options.Add("-Dlanguage=CSharp_v2_0"); -#else -#error Unknown assembly. -#endif - - options.Add(grammarFileName); - - System.Diagnostics.Process process = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(compiler, '"' + Utils.Join("\" \"", options) + '"') - { - UseShellExecute = false, - CreateNoWindow = true, - RedirectStandardOutput = true, - RedirectStandardError = true, - WorkingDirectory = tmpdir - }); - - StreamVacuum stdout = new StreamVacuum(process.StandardOutput); - StreamVacuum stderr = new StreamVacuum(process.StandardError); - stdout.start(); - stderr.start(); - process.WaitForExit(); - stdout.join(); - stderr.join(); - if (stdout.ToString().Length > 0) - { - Console.Error.WriteLine("compile stdout from: " + Utils.Join(" ", options)); - Console.Error.WriteLine(stdout); - } - if (stderr.ToString().Length > 0) - { - Console.Error.WriteLine("compile stderr from: " + Utils.Join(" ", options)); - Console.Error.WriteLine(stderr); - } - int ret = process.ExitCode; - return ret == 0; - } - catch (Exception) - { - Console.Error.WriteLine("can't exec compilation"); - //e.printStackTrace(System.err); - return false; - } - } - -#if false - protected string execLexer(string grammarFileName, - string grammarStr, - string lexerName, - string input) - { - return execLexer(grammarFileName, grammarStr, lexerName, input, false); - } - - protected string execLexer(string grammarFileName, - string grammarStr, - string lexerName, - string input, - bool showDFA) - { - bool success = rawGenerateAndBuildRecognizer(grammarFileName, - grammarStr, - null, - lexerName); - Assert.IsTrue(success); - writeFile(tmpdir, "input", input); - writeLexerTestFile(lexerName, showDFA); - compile("Test.java"); - string output = execClass("Test"); - if (stderrDuringParse != null && stderrDuringParse.Length > 0) - { - Console.Error.WriteLine(stderrDuringParse); - } - return output; - } - - protected string execParser(string grammarFileName, - string grammarStr, - string parserName, - string lexerName, - string startRuleName, - string input, bool debug) - { - bool success = rawGenerateAndBuildRecognizer(grammarFileName, - grammarStr, - parserName, - lexerName, - "-visitor"); - Assert.IsTrue(success); - writeFile(tmpdir, "input", input); - return rawExecRecognizer(parserName, - lexerName, - startRuleName, - debug); - } -#endif - - /** Return true if all is well */ - protected virtual bool rawGenerateAndBuildRecognizer(string grammarFileName, - string grammarStr, - [Nullable] string parserName, - string lexerName, - params string[] extraOptions) - { - return rawGenerateAndBuildRecognizer(grammarFileName, grammarStr, parserName, lexerName, false, extraOptions); - } - - /** Return true if all is well */ - protected virtual bool rawGenerateAndBuildRecognizer(string grammarFileName, - string grammarStr, - [Nullable] string parserName, - string lexerName, - bool defaultListener, - params string[] extraOptions) - { - bool allIsWell = - antlr(grammarFileName, grammarFileName, grammarStr, defaultListener, extraOptions); - if (!allIsWell) - { - return false; - } - - List files = new List(); - if (lexerName != null) - { - files.Add(lexerName + ".cs"); - } - if (parserName != null) - { - files.Add(parserName + ".cs"); - HashSet optionsSet = new HashSet(extraOptions); - if (!optionsSet.Contains("-no-listener")) - { - files.Add(grammarFileName.Substring(0, grammarFileName.LastIndexOf('.')) + "BaseListener.cs"); - files.Add(grammarFileName.Substring(0, grammarFileName.LastIndexOf('.')) + "Listener.cs"); - } - if (optionsSet.Contains("-visitor")) - { - files.Add(grammarFileName.Substring(0, grammarFileName.LastIndexOf('.')) + "BaseVisitor.cs"); - files.Add(grammarFileName.Substring(0, grammarFileName.LastIndexOf('.')) + "Visitor.cs"); - } - } - allIsWell = compile(files.ToArray()); - return allIsWell; - } - -#if false - protected string rawExecRecognizer(string parserName, - string lexerName, - string parserStartRuleName, - bool debug) - { - this.stderrDuringParse = null; - if (parserName == null) - { - writeLexerTestFile(lexerName, false); - } - else - { - writeTestFile(parserName, - lexerName, - parserStartRuleName, - debug); - } - - compile("Test.java"); - return execClass("Test"); - } - - public string execRecognizer() - { - return execClass("Test"); - } - - public string execClass(string className) - { - if (TEST_IN_SAME_PROCESS) - { - try - { - ClassLoader loader = new URLClassLoader(new URL[] { new File(tmpdir).toURI().toURL() }, ClassLoader.getSystemClassLoader()); - Class mainClass = (Class)loader.loadClass(className); - Method mainMethod = mainClass.getDeclaredMethod("main", typeof(string[])); - PipedInputStream stdoutIn = new PipedInputStream(); - PipedInputStream stderrIn = new PipedInputStream(); - PipedOutputStream stdoutOut = new PipedOutputStream(stdoutIn); - PipedOutputStream stderrOut = new PipedOutputStream(stderrIn); - StreamVacuum stdoutVacuum = new StreamVacuum(stdoutIn); - StreamVacuum stderrVacuum = new StreamVacuum(stderrIn); - - PrintStream originalOut = Console.Out; - System.setOut(new PrintStream(stdoutOut)); - try - { - PrintStream originalErr = System.err; - try - { - System.setErr(new PrintStream(stderrOut)); - stdoutVacuum.start(); - stderrVacuum.start(); - mainMethod.invoke(null, (Object)new string[] { new File(tmpdir, "input").getAbsolutePath() }); - } - finally - { - System.setErr(originalErr); - } - } - finally - { - System.setOut(originalOut); - } - - stdoutOut.close(); - stderrOut.close(); - stdoutVacuum.join(); - stderrVacuum.join(); - string output = stdoutVacuum.tostring(); - if (stderrVacuum.tostring().length() > 0) - { - this.stderrDuringParse = stderrVacuum.tostring(); - Console.Error.WriteLine("exec stderrVacuum: " + stderrVacuum); - } - return output; - } - catch (MalformedURLException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - catch (IOException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - catch (InterruptedException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - catch (IllegalAccessException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - catch (IllegalArgumentException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - catch (InvocationTargetException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - catch (NoSuchMethodException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - catch (SecurityException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - catch (ClassNotFoundException ex) - { - LOGGER.log(Level.SEVERE, null, ex); - } - } - - try - { - string[] args = new string[] { - "java", "-classpath", tmpdir+pathSep+CLASSPATH, - className, new File(tmpdir, "input").getAbsolutePath() - }; - //string cmdLine = "java -classpath "+CLASSPATH+pathSep+tmpdir+" Test " + new File(tmpdir, "input").getAbsolutePath(); - //Console.WriteLine("execParser: "+cmdLine); - Process process = - Runtime.getRuntime().exec(args, null, new File(tmpdir)); - StreamVacuum stdoutVacuum = new StreamVacuum(process.getInputStream()); - StreamVacuum stderrVacuum = new StreamVacuum(process.getErrorStream()); - stdoutVacuum.start(); - stderrVacuum.start(); - process.waitFor(); - stdoutVacuum.join(); - stderrVacuum.join(); - string output = stdoutVacuum.tostring(); - if (stderrVacuum.tostring().length() > 0) - { - this.stderrDuringParse = stderrVacuum.tostring(); - Console.Error.WriteLine("exec stderrVacuum: " + stderrVacuum); - } - return output; - } - catch (Exception e) - { - Console.Error.WriteLine("can't exec recognizer"); - e.printStackTrace(System.err); - } - return null; - } - - public void testErrors(string[] pairs, bool printTree) - { - for (int i = 0; i < pairs.length; i += 2) - { - string input = pairs[i]; - string expect = pairs[i + 1]; - ErrorQueue equeue = new ErrorQueue(); - Grammar g = null; - try - { - string[] lines = input.split("\n"); - string fileName = getFilenameFromFirstLineOfGrammar(lines[0]); - if (input.startsWith("lexer ")) - { - g = new LexerGrammar(fileName, input, equeue); - } - else - { - g = new Grammar(fileName, input, equeue); - } - } - catch (UnsupportedOperationException ex) - { - } - catch (org.antlr.runtime.RecognitionException re) - { - re.printStackTrace(System.err); - } - string actual = equeue.tostring(g != null ? g.tool : new Tool()); - Console.Error.WriteLine(actual); - string msg = input; - msg = msg.replaceAll("\n", "\\\\n"); - msg = msg.replaceAll("\r", "\\\\r"); - msg = msg.replaceAll("\t", "\\\\t"); - - assertEquals("error in: " + msg, expect, actual); - } - } - - public string getFilenameFromFirstLineOfGrammar(string line) - { - string fileName = ""; - int grIndex = line.lastIndexOf("grammar"); - int semi = line.lastIndexOf(';'); - if (grIndex >= 0 && semi >= 0) - { - int space = line.indexOf(' ', grIndex); - fileName = line.substring(space + 1, semi) + Tool.GRAMMAR_EXTENSION; - } - if (fileName.length() == Tool.GRAMMAR_EXTENSION.length()) - fileName = ""; - return fileName; - } - - // void ambig(IList msgs, int[] expectedAmbigAlts, string expectedAmbigInput) - // throws Exception - // { - // ambig(msgs, 0, expectedAmbigAlts, expectedAmbigInput); - // } - - // void ambig(IList msgs, int i, int[] expectedAmbigAlts, string expectedAmbigInput) - // throws Exception - // { - // IList amsgs = getMessagesOfType(msgs, AmbiguityMessage.class); - // AmbiguityMessage a = (AmbiguityMessage)amsgs.get(i); - // if ( a==null ) assertNull(expectedAmbigAlts); - // else { - // assertEquals(a.conflictingAlts.tostring(), Arrays.tostring(expectedAmbigAlts)); - // } - // assertEquals(expectedAmbigInput, a.input); - // } - - // void unreachable(IList msgs, int[] expectedUnreachableAlts) - // throws Exception - // { - // unreachable(msgs, 0, expectedUnreachableAlts); - // } - - // void unreachable(IList msgs, int i, int[] expectedUnreachableAlts) - // throws Exception - // { - // IList amsgs = getMessagesOfType(msgs, UnreachableAltsMessage.class); - // UnreachableAltsMessage u = (UnreachableAltsMessage)amsgs.get(i); - // if ( u==null ) assertNull(expectedUnreachableAlts); - // else { - // assertEquals(u.conflictingAlts.tostring(), Arrays.tostring(expectedUnreachableAlts)); - // } - // } - - IList getMessagesOfType(IList msgs, Class c) - { - IList filtered = new List(); - foreach (ANTLRMessage m in msgs) - { - if (m.getClass() == c) - filtered.add(m); - } - return filtered; - } - - void checkRuleATN(Grammar g, string ruleName, string expecting) - { - ParserATNFactory f = new ParserATNFactory(g); - ATN atn = f.createATN(); - - DOTGenerator dot = new DOTGenerator(g); - Console.WriteLine(dot.getDOT(atn.ruleToStartState[g.getRule(ruleName).index])); - - Rule r = g.getRule(ruleName); - ATNState startState = atn.ruleToStartState[r.index]; - ATNPrinter serializer = new ATNPrinter(g, startState); - string result = serializer.asstring(); - - //System.out.print(result); - assertEquals(expecting, result); - } - - public void testActions(string templates, string actionName, string action, string expected) - { - int lp = templates.indexOf('('); - string name = templates.substring(0, lp); - STGroup group = new STGroupstring(templates); - ST st = group.getInstanceOf(name); - st.add(actionName, action); - string grammar = st.render(); - ErrorQueue equeue = new ErrorQueue(); - Grammar g = new Grammar(grammar); - if (g.ast != null && !g.ast.hasErrors) - { - SemanticPipeline sem = new SemanticPipeline(g); - sem.process(); - - ATNFactory factory = new ParserATNFactory(g); - if (g.isLexer()) - factory = new LexerATNFactory((LexerGrammar)g); - g.atn = factory.createATN(); - - CodeGenerator gen = new CodeGenerator(g); - ST outputFileST = gen.generateParser(); - string output = outputFileST.render(); - //Console.WriteLine(output); - string b = "#" + actionName + "#"; - int start = output.indexOf(b); - string e = "#end-" + actionName + "#"; - int end = output.indexOf(e); - string snippet = output.substring(start + b.length(), end); - assertEquals(expected, snippet); - } - if (equeue.Count > 0) - { - Console.Error.WriteLine(equeue.tostring(g.tool)); - } - } -#endif - - public class StreamVacuum - { - private readonly StringBuilder buf = new StringBuilder(); - private readonly TextReader @in; - private Thread sucker; - - public StreamVacuum(TextReader @in) - { - this.@in = @in; - } - - public void start() - { - sucker = new Thread(run); - sucker.Start(); - } - - public void run() - { - try - { - string line = @in.ReadLine(); - while (line != null) - { - buf.AppendLine(line); - line = @in.ReadLine(); - } - } - catch (IOException) - { - Console.Error.WriteLine("can't read output from process"); - } - } - - /** wait for the thread to finish */ - public void join() /*throws InterruptedException*/ { - sucker.Join(); - } - - public override string ToString() - { - return buf.ToString(); - } - } - -#if false - protected void checkGrammarSemanticsError(ErrorQueue equeue, - GrammarSemanticsMessage expectedMessage) - { - ANTLRMessage foundMsg = null; - for (int i = 0; i < equeue.errors.Count; i++) - { - ANTLRMessage m = equeue.errors.get(i); - if (m.getErrorType() == expectedMessage.getErrorType()) - { - foundMsg = m; - } - } - assertNotNull("no error; " + expectedMessage.getErrorType() + " expected", foundMsg); - Assert.IsTrue("error is not a GrammarSemanticsMessage", - foundMsg is GrammarSemanticsMessage); - assertEquals(Arrays.tostring(expectedMessage.getArgs()), Arrays.tostring(foundMsg.getArgs())); - if (equeue.Count != 1) - { - Console.Error.WriteLine(equeue); - } - } - - protected void checkGrammarSemanticsWarning(ErrorQueue equeue, - GrammarSemanticsMessage expectedMessage) - { - ANTLRMessage foundMsg = null; - for (int i = 0; i < equeue.warnings.Count; i++) - { - ANTLRMessage m = equeue.warnings.get(i); - if (m.getErrorType() == expectedMessage.getErrorType()) - { - foundMsg = m; - } - } - assertNotNull("no error; " + expectedMessage.getErrorType() + " expected", foundMsg); - Assert.IsTrue("error is not a GrammarSemanticsMessage", - foundMsg is GrammarSemanticsMessage); - assertEquals(Arrays.tostring(expectedMessage.getArgs()), Arrays.tostring(foundMsg.getArgs())); - if (equeue.Count != 1) - { - Console.Error.WriteLine(equeue); - } - } - - protected void checkError(ErrorQueue equeue, - ANTLRMessage expectedMessage) - { - //Console.WriteLine("errors="+equeue); - ANTLRMessage foundMsg = null; - for (int i = 0; i < equeue.errors.Count; i++) - { - ANTLRMessage m = equeue.errors.get(i); - if (m.getErrorType() == expectedMessage.getErrorType()) - { - foundMsg = m; - } - } - Assert.IsTrue("no error; " + expectedMessage.getErrorType() + " expected", !equeue.errors.isEmpty()); - Assert.IsTrue("too many errors; " + equeue.errors, equeue.errors.Count <= 1); - assertNotNull("couldn't find expected error: " + expectedMessage.getErrorType(), foundMsg); - /* - Assert.IsTrue("error is not a GrammarSemanticsMessage", - foundMsg is GrammarSemanticsMessage); - */ - assertArrayEquals(expectedMessage.getArgs(), foundMsg.getArgs()); - } - - public class FilteringTokenStream : CommonTokenStream - { - public FilteringTokenStream(TokenSource src) - { - super(src); - } - Set hide = new HashSet(); - protected override bool sync(int i) - { - if (!super.sync(i)) - { - return false; - } - - Token t = get(i); - if (hide.contains(t.getType())) - { - ((WritableToken)t).setChannel(Token.HIDDEN_CHANNEL); - } - - return true; - } - public void setTokenTypeChannel(int ttype, int channel) - { - hide.add(ttype); - } - } -#endif - - public static void writeFile(string dir, string fileName, string content) - { - File.WriteAllText(Path.Combine(dir, fileName), content); - } - - protected void mkdir(string dir) - { - Directory.CreateDirectory(dir); - } - -#if false - protected void writeTestFile(string parserName, - string lexerName, - string parserStartRuleName, - bool debug) - { - ST outputFileST = new ST( - "import org.antlr.v4.runtime.*;\n" + - "import org.antlr.v4.runtime.tree.*;\n" + - "\n" + - "public class Test {\n" + - " public static void main(string[] args) throws Exception {\n" + - " CharStream input = new ANTLRFileStream(args[0]);\n" + - " lex = new (input);\n" + - " CommonTokenStream tokens = new CommonTokenStream(lex);\n" + - " \n" + - " parser.setBuildParseTree(true);\n" + - " parser.getInterpreter().reportAmbiguities = true;\n" + - " ParserRuleContext tree = parser.();\n" + - " ParseTreeWalker.DEFAULT.walk(new TreeShapeListener(), tree);\n" + - " }\n" + - "\n" + - " static class TreeShapeListener implements ParseTreeListener {\n" + - " @Override public void visitTerminal(TerminalNode node) { }\n" + - " @Override public void visitErrorNode(ErrorNode node) { }\n" + - " @Override public void exitEveryRule(ParserRuleContext ctx) { }\n" + - "\n" + - " @Override\n" + - " public void enterEveryRule(ParserRuleContext ctx) {\n" + - " for (int i = 0; i \\< ctx.getChildCount(); i++) {\n" + - " ParseTree parent = ctx.getChild(i).getParent();\n" + - " if (!(parent is RuleNode) || ((RuleNode)parent).getRuleContext() != ctx) {\n" + - " throw new IllegalStateException(\"Invalid parse tree shape detected.\");\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}" - ); - ST createParserST = new ST(" parser = new (tokens);\n"); - if (debug) - { - createParserST = - new ST( - " parser = new (tokens);\n" + - " parser.addErrorListener(new DiagnosticErrorListener());\n"); - } - outputFileST.add("createParser", createParserST); - outputFileST.add("parserName", parserName); - outputFileST.add("lexerName", lexerName); - outputFileST.add("parserStartRuleName", parserStartRuleName); - writeFile(tmpdir, "Test.java", outputFileST.render()); - } - - protected void writeLexerTestFile(string lexerName, bool showDFA) - { - ST outputFileST = new ST( - "import org.antlr.v4.runtime.*;\n" + - "\n" + - "public class Test {\n" + - " public static void main(string[] args) throws Exception {\n" + - " CharStream input = new ANTLRFileStream(args[0]);\n" + - " lex = new (input);\n" + - " CommonTokenStream tokens = new CommonTokenStream(lex);\n" + - " tokens.fill();\n" + - " for (Object t : tokens.getTokens()) Console.WriteLine(t);\n" + - (showDFA ? "System.out.print(lex.getInterpreter().getDFA(Lexer.DEFAULT_MODE).toLexerstring());\n" : "") + - " }\n" + - "}" - ); - - outputFileST.add("lexerName", lexerName); - writeFile(tmpdir, "Test.java", outputFileST.render()); - } - - public void writeRecognizerAndCompile(string parserName, string lexerName, - string parserStartRuleName, - bool debug) - { - if (parserName == null) - { - writeLexerTestFile(lexerName, debug); - } - else - { - writeTestFile(parserName, - lexerName, - parserStartRuleName, - debug); - } - - compile("Test.java"); - } - - - protected void eraseFiles(string filesEndingWith) - { - File tmpdirF = new File(tmpdir); - string[] files = tmpdirF.list(); - for (int i = 0; files != null && i < files.length; i++) - { - if (files[i].endsWith(filesEndingWith)) - { - new File(tmpdir + "/" + files[i]).delete(); - } - } - } - - protected void eraseFiles() - { - if (tmpdir == null) - { - return; - } - - File tmpdirF = new File(tmpdir); - string[] files = tmpdirF.list(); - for (int i = 0; files != null && i < files.length; i++) - { - new File(tmpdir + "/" + files[i]).delete(); - } - } -#endif - - protected virtual void eraseTempDir() - { - if (!Path.GetTempPath().Equals(Path.GetDirectoryName(tmpdir) + Path.DirectorySeparatorChar)) - { - throw new InvalidOperationException(); - } - - Directory.Delete(tmpdir, true); - } - -#if false - public string getFirstLineOfException() - { - if (this.stderrDuringParse == null) - { - return null; - } - string[] lines = this.stderrDuringParse.split("\n"); - string prefix = "Exception in thread \"main\" "; - return lines[0].substring(prefix.length(), lines[0].length()); - } - - /** - * When looking at a result set that consists of a Map/HashTable - * we cannot rely on the output order, as the hashing algorithm or other aspects - * of the implementation may be different on differnt JDKs or platforms. Hence - * we take the Map, convert the keys to a IList, sort them and stringify the Map, which is a - * bit of a hack, but guarantees that we get the same order on all systems. We assume that - * the keys are strings. - * - * @param m The Map that contains keys we wish to return in sorted order - * @return A string that represents all the keys in sorted order. - */ - public string sortMapTostring(Map m) - { - // Pass in crap, and get nothing back - // - if (m == null) - { - return null; - } - - Console.WriteLine("Map tostring looks like: " + m.tostring()); - - // Sort the keys in the Map - // - TreeMap nset = new TreeMap(m); - - Console.WriteLine("Tree map looks like: " + nset.tostring()); - return nset.tostring(); - } - - public IList realElements(IList elements) - { - return elements.subList(Token.MIN_USER_TOKEN_TYPE, elements.Count); - } - - public void assertNotNullOrEmpty(string message, string text) - { - assertNotNull(message, text); - assertFalse(message, text.isEmpty()); - } - - public void assertNotNullOrEmpty(string text) - { - assertNotNull(text); - assertFalse(text.isEmpty()); - } - - public class IntTokenStream : TokenStream - { - IntegerList types; - int p = 0; - public IntTokenStream(IntegerList types) - { - this.types = types; - } - - public override void consume() - { - p++; - } - - public override int LA(int i) - { - return LT(i).getType(); - } - - public override int mark() - { - return index(); - } - - public override int index() - { - return p; - } - - public override void release(int marker) - { - seek(marker); - } - - public override void seek(int index) - { - p = index; - } - - public override int size() - { - return types.Count; - } - - public override string getSourceName() - { - return null; - } - - public override Token LT(int i) - { - CommonToken t; - int rawIndex = p + i - 1; - if (rawIndex >= types.Count) - t = new CommonToken(Token.EOF); - else - t = new CommonToken(types.get(rawIndex)); - t.setTokenIndex(rawIndex); - return t; - } - - public override Token get(int i) - { - return new org.antlr.v4.runtime.CommonToken(types.get(i)); - } - - public override TokenSource getTokenSource() - { - return null; - } - - [return: NotNull] - public override string getText() - { - throw new UnsupportedOperationException("can't give strings"); - } - - [return: NotNull] - public override string getText(Interval interval) - { - throw new UnsupportedOperationException("can't give strings"); - } - - [return: NotNull] - public override string getText(RuleContext ctx) - { - throw new UnsupportedOperationException("can't give strings"); - } - - [return: NotNull] - public override string getText(Token start, Token stop) - { - throw new UnsupportedOperationException("can't give strings"); - } - } - - /** Sort a list */ - public IList sort(IList data) - { - IList dup = new List(); - dup.addAll(data); - Collections.sort(dup); - return dup; - } - - /** Return map sorted by key */ - public LinkedHashMap sort(Map data) - { - LinkedHashMap dup = new LinkedHashMap(); - IList keys = new List(); - keys.addAll(data.keySet()); - Collections.sort(keys); - foreach (K k in keys) - { - dup.put(k, data.get(k)); - } - return dup; - } -#endif - } -} diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Java-LR.g4 b/runtime/CSharp/Antlr4.Runtime.Test/Java-LR.g4 deleted file mode 100644 index 9c088a800..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Java-LR.g4 +++ /dev/null @@ -1,1293 +0,0 @@ -/* - [The "BSD licence"] - Copyright (c) 2007-2008 Terence Parr - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** A Java 1.5 grammar for ANTLR v3 derived from the spec - * - * This is a very close representation of the spec; the changes - * are comestic (remove left recursion) and also fixes (the spec - * isn't exactly perfect). I have run this on the 1.4.2 source - * and some nasty looking enums from 1.5, but have not really - * tested for 1.5 compatibility. - * - * I built this with: java -Xmx100M org.antlr.Tool java.g - * and got two errors that are ok (for now): - * java.g:691:9: Decision can match input such as - * "'0'..'9'{'E', 'e'}{'+', '-'}'0'..'9'{'D', 'F', 'd', 'f'}" - * using multiple alternatives: 3, 4 - * As a result, alternative(s) 4 were disabled for that input - * java.g:734:35: Decision can match input such as "{'$', 'A'..'Z', - * '_', 'a'..'z', '\u00C0'..'\u00D6', '\u00D8'..'\u00F6', - * '\u00F8'..'\u1FFF', '\u3040'..'\u318F', '\u3300'..'\u337F', - * '\u3400'..'\u3D2D', '\u4E00'..'\u9FFF', '\uF900'..'\uFAFF'}" - * using multiple alternatives: 1, 2 - * As a result, alternative(s) 2 were disabled for that input - * - * You can turn enum on/off as a keyword :) - * - * Version 1.0 -- initial release July 5, 2006 (requires 3.0b2 or higher) - * - * Primary author: Terence Parr, July 2006 - * - * Version 1.0.1 -- corrections by Koen Vanderkimpen & Marko van Dooren, - * October 25, 2006; - * fixed normalInterfaceDeclaration: now uses typeParameters instead - * of typeParameter (according to JLS, 3rd edition) - * fixed castExpression: no longer allows expression next to type - * (according to semantics in JLS, in contrast with syntax in JLS) - * - * Version 1.0.2 -- Terence Parr, Nov 27, 2006 - * java spec I built this from had some bizarre for-loop control. - * Looked weird and so I looked elsewhere...Yep, it's messed up. - * simplified. - * - * Version 1.0.3 -- Chris Hogue, Feb 26, 2007 - * Factored out an annotationName rule and used it in the annotation rule. - * Not sure why, but typeName wasn't recognizing references to inner - * annotations (e.g. @InterfaceName.InnerAnnotation()) - * Factored out the elementValue section of an annotation reference. Created - * elementValuePair and elementValuePairs rules, then used them in the - * annotation rule. Allows it to recognize annotation references with - * multiple, comma separated attributes. - * Updated elementValueArrayInitializer so that it allows multiple elements. - * (It was only allowing 0 or 1 element). - * Updated localVariableDeclaration to allow annotations. Interestingly the JLS - * doesn't appear to indicate this is legal, but it does work as of at least - * JDK 1.5.0_06. - * Moved the Identifier portion of annotationTypeElementRest to annotationMethodRest. - * Because annotationConstantRest already references variableDeclarator which - * has the Identifier portion in it, the parser would fail on constants in - * annotation definitions because it expected two identifiers. - * Added optional trailing ';' to the alternatives in annotationTypeElementRest. - * Wouldn't handle an inner interface that has a trailing ';'. - * Swapped the expression and type rule reference order in castExpression to - * make it check for genericized casts first. It was failing to recognize a - * statement like "Class TYPE = (Class)...;" because it was seeing - * 'Class'. - * Changed createdName to use typeArguments instead of nonWildcardTypeArguments. - * Changed the 'this' alternative in primary to allow 'identifierSuffix' rather than - * just 'arguments'. The case it couldn't handle was a call to an explicit - * generic method invocation (e.g. this.doSomething()). Using identifierSuffix - * may be overly aggressive--perhaps should create a more constrained thisSuffix rule? - * - * Version 1.0.4 -- Hiroaki Nakamura, May 3, 2007 - * - * Fixed formalParameterDecls, localVariableDeclaration, forInit, - * and forVarControl to use variableModifier* not 'final'? (annotation)? - * - * Version 1.0.5 -- Terence, June 21, 2007 - * --a[i].foo didn't work. Fixed unaryExpression - * - * Version 1.0.6 -- John Ridgway, March 17, 2008 - * Made "assert" a switchable keyword like "enum". - * Fixed compilationUnit to disallow "annotation importDeclaration ...". - * Changed "Identifier ('.' Identifier)*" to "qualifiedName" in more - * places. - * Changed modifier* and/or variableModifier* to classOrInterfaceModifiers, - * modifiers or variableModifiers, as appropriate. - * Renamed "bound" to "typeBound" to better match language in the JLS. - * Added "memberDeclaration" which rewrites to methodDeclaration or - * fieldDeclaration and pulled type into memberDeclaration. So we parse - * type and then move on to decide whether we're dealing with a field - * or a method. - * Modified "constructorDeclaration" to use "constructorBody" instead of - * "methodBody". constructorBody starts with explicitConstructorInvocation, - * then goes on to blockStatement*. Pulling explicitConstructorInvocation - * out of expressions allowed me to simplify "primary". - * Changed variableDeclarator to simplify it. - * Changed type to use classOrInterfaceType, thus simplifying it; of course - * I then had to add classOrInterfaceType, but it is used in several - * places. - * Fixed annotations, old version allowed "@X(y,z)", which is illegal. - * Added optional comma to end of "elementValueArrayInitializer"; as per JLS. - * Changed annotationTypeElementRest to use normalClassDeclaration and - * normalInterfaceDeclaration rather than classDeclaration and - * interfaceDeclaration, thus getting rid of a couple of grammar ambiguities. - * Split localVariableDeclaration into localVariableDeclarationStatement - * (includes the terminating semi-colon) and localVariableDeclaration. - * This allowed me to use localVariableDeclaration in "forInit" clauses, - * simplifying them. - * Changed switchBlockStatementGroup to use multiple labels. This adds an - * ambiguity, but if one uses appropriately greedy parsing it yields the - * parse that is closest to the meaning of the switch statement. - * Renamed "forVarControl" to "enhancedForControl" -- JLS language. - * Added semantic predicates to test for shift operations rather than other - * things. Thus, for instance, the string "< <" will never be treated - * as a left-shift operator. - * In "creator" we rule out "nonWildcardTypeArguments" on arrayCreation, - * which are illegal. - * Moved "nonWildcardTypeArguments into innerCreator. - * Removed 'super' superSuffix from explicitGenericInvocation, since that - * is only used in explicitConstructorInvocation at the beginning of a - * constructorBody. (This is part of the simplification of expressions - * mentioned earlier.) - * Simplified primary (got rid of those things that are only used in - * explicitConstructorInvocation). - * Lexer -- removed "Exponent?" from FloatingPointLiteral choice 4, since it - * led to an ambiguity. - * - * This grammar successfully parses every .java file in the JDK 1.5 source - * tree (excluding those whose file names include '-', which are not - * valid Java compilation units). - * - * June 26, 2008 - * - * conditionalExpression had wrong precedence x?y:z. - * - * February 26, 2011 - * added left-recursive expression rule - * - * Known remaining problems: - * "Letter" and "JavaIDDigit" are wrong. The actual specification of - * "Letter" should be "a character for which the method - * Character.isJavaIdentifierStart(int) returns true." A "Java - * letter-or-digit is a character for which the method - * Character.isJavaIdentifierPart(int) returns true." - */ -grammar Java; - -@lexer::members { - -private static bool IsJavaIdentifierCharacter(char c, bool start) -{ - switch (char.GetUnicodeCategory(c)) - { - case System.Globalization.UnicodeCategory.UppercaseLetter: - case System.Globalization.UnicodeCategory.LowercaseLetter: - case System.Globalization.UnicodeCategory.TitlecaseLetter: - case System.Globalization.UnicodeCategory.ModifierLetter: - case System.Globalization.UnicodeCategory.OtherLetter: - // isLetter returns true - return true; - - case System.Globalization.UnicodeCategory.LetterNumber: - // getType returns LETTER_NUMBER - return true; - - case System.Globalization.UnicodeCategory.CurrencySymbol: - // a currency symbol (such as "$") - return true; - - case System.Globalization.UnicodeCategory.ConnectorPunctuation: - // a connecting punctuation character (such as "_") - return true; - - case System.Globalization.UnicodeCategory.DecimalDigitNumber: - // it is a digit - return !start; - - case System.Globalization.UnicodeCategory.SpacingCombiningMark: - // it is a combining mark - return !start; - - case System.Globalization.UnicodeCategory.NonSpacingMark: - // it is a non-spacing mark - return !start; - - default: - return false; - } -} - -} - -// starting point for parsing a java file -/* The annotations are separated out to make parsing faster, but must be associated with - a packageDeclaration or a typeDeclaration (and not an empty one). */ -compilationUnit - : annotations - ( packageDeclaration importDeclaration* typeDeclaration* - | classOrInterfaceDeclaration typeDeclaration* - ) - EOF - | packageDeclaration? importDeclaration* typeDeclaration* - EOF - ; - -packageDeclaration - : 'package' qualifiedName ';' - ; - -importDeclaration - : 'import' 'static'? qualifiedName ('.' '*')? ';' - ; - -typeDeclaration - : classOrInterfaceDeclaration - | ';' - ; - -classOrInterfaceDeclaration - : classOrInterfaceModifiers (classDeclaration | interfaceDeclaration) - ; - -classOrInterfaceModifiers - : classOrInterfaceModifier* - ; - -classOrInterfaceModifier - : annotation // class or interface - | ( 'public' // class or interface - | 'protected' // class or interface - | 'private' // class or interface - | 'abstract' // class or interface - | 'static' // class or interface - | 'final' // class only -- does not apply to interfaces - | 'strictfp' // class or interface - ) - ; - -modifiers - : modifier* - ; - -classDeclaration - : normalClassDeclaration - | enumDeclaration - ; - -normalClassDeclaration - : 'class' Identifier typeParameters? - ('extends' type)? - ('implements' typeList)? - classBody - ; - -typeParameters - : '<' typeParameter (',' typeParameter)* '>' - ; - -typeParameter - : Identifier ('extends' typeBound)? - ; - -typeBound - : type ('&' type)* - ; - -enumDeclaration - : ENUM Identifier ('implements' typeList)? enumBody - ; - -enumBody - : '{' enumConstants? ','? enumBodyDeclarations? '}' - ; - -enumConstants - : enumConstant (',' enumConstant)* - ; - -enumConstant - : annotations? Identifier arguments? classBody? - ; - -enumBodyDeclarations - : ';' (classBodyDeclaration)* - ; - -interfaceDeclaration - : normalInterfaceDeclaration - | annotationTypeDeclaration - ; - -normalInterfaceDeclaration - : 'interface' Identifier typeParameters? ('extends' typeList)? interfaceBody - ; - -typeList - : type (',' type)* - ; - -classBody - : '{' classBodyDeclaration* '}' - ; - -interfaceBody - : '{' interfaceBodyDeclaration* '}' - ; - -classBodyDeclaration - : ';' - | 'static'? block - | modifiers memberDecl - ; - -memberDecl - : genericMethodOrConstructorDecl - | memberDeclaration - | 'void' Identifier voidMethodDeclaratorRest - | Identifier constructorDeclaratorRest - | interfaceDeclaration - | classDeclaration - ; - -memberDeclaration - : type (methodDeclaration | fieldDeclaration) - ; - -genericMethodOrConstructorDecl - : typeParameters genericMethodOrConstructorRest - ; - -genericMethodOrConstructorRest - : (type | 'void') Identifier methodDeclaratorRest - | Identifier constructorDeclaratorRest - ; - -methodDeclaration - : Identifier methodDeclaratorRest - ; - -fieldDeclaration - : variableDeclarators ';' - ; - -interfaceBodyDeclaration - : modifiers interfaceMemberDecl - | ';' - ; - -interfaceMemberDecl - : interfaceMethodOrFieldDecl - | interfaceGenericMethodDecl - | 'void' Identifier voidInterfaceMethodDeclaratorRest - | interfaceDeclaration - | classDeclaration - ; - -interfaceMethodOrFieldDecl - : type Identifier interfaceMethodOrFieldRest - ; - -interfaceMethodOrFieldRest - : constantDeclaratorsRest ';' - | interfaceMethodDeclaratorRest - ; - -methodDeclaratorRest - : formalParameters ('[' ']')* - ('throws' qualifiedNameList)? - ( methodBody - | ';' - ) - ; - -voidMethodDeclaratorRest - : formalParameters ('throws' qualifiedNameList)? - ( methodBody - | ';' - ) - ; - -interfaceMethodDeclaratorRest - : formalParameters ('[' ']')* ('throws' qualifiedNameList)? ';' - ; - -interfaceGenericMethodDecl - : typeParameters (type | 'void') Identifier - interfaceMethodDeclaratorRest - ; - -voidInterfaceMethodDeclaratorRest - : formalParameters ('throws' qualifiedNameList)? ';' - ; - -constructorDeclaratorRest - : formalParameters ('throws' qualifiedNameList)? constructorBody - ; - -constantDeclarator - : Identifier constantDeclaratorRest - ; - -variableDeclarators - : variableDeclarator (',' variableDeclarator)* - ; - -variableDeclarator - : variableDeclaratorId ('=' variableInitializer)? - ; - -constantDeclaratorsRest - : constantDeclaratorRest (',' constantDeclarator)* - ; - -constantDeclaratorRest - : ('[' ']')* '=' variableInitializer - ; - -variableDeclaratorId - : Identifier ('[' ']')* - ; - -variableInitializer - : arrayInitializer - | expression - ; - -arrayInitializer - : '{' (variableInitializer (',' variableInitializer)* (',')? )? '}' - ; - -modifier - : annotation - | ( 'public' - | 'protected' - | 'private' - | 'static' - | 'abstract' - | 'final' - | 'native' - | 'synchronized' - | 'transient' - | 'volatile' - | 'strictfp' - ) - ; - -packageOrTypeName - : qualifiedName - ; - -enumConstantName - : Identifier - ; - -typeName - : qualifiedName - ; - -type - : classOrInterfaceType ('[' ']')* - | primitiveType ('[' ']')* - ; - -classOrInterfaceType - : Identifier typeArguments? ('.' Identifier typeArguments? )* - ; - -primitiveType - : 'boolean' - | 'char' - | 'byte' - | 'short' - | 'int' - | 'long' - | 'float' - | 'double' - ; - -variableModifier - : 'final' - | annotation - ; - -typeArguments - : '<' typeArgument (',' typeArgument)* '>' - ; - -typeArgument - : type - | '?' (('extends' | 'super') type)? - ; - -qualifiedNameList - : qualifiedName (',' qualifiedName)* - ; - -formalParameters - : '(' formalParameterDecls? ')' - ; - -formalParameterDecls - : variableModifiers type formalParameterDeclsRest - ; - -formalParameterDeclsRest - : variableDeclaratorId (',' formalParameterDecls)? - | '...' variableDeclaratorId - ; - -methodBody - : block - ; - -constructorBody - : block - ; - -qualifiedName - : Identifier ('.' Identifier)* - ; - -literal - : IntegerLiteral - | FloatingPointLiteral - | CharacterLiteral - | StringLiteral - | BooleanLiteral - | 'null' - ; - -// ANNOTATIONS - -annotations - : annotation+ - ; - -annotation - : '@' annotationName ( '(' ( elementValuePairs | elementValue )? ')' )? - ; - -annotationName - : Identifier ('.' Identifier)* - ; - -elementValuePairs - : elementValuePair (',' elementValuePair)* - ; - -elementValuePair - : Identifier '=' elementValue - ; - -elementValue - : expression - | annotation - | elementValueArrayInitializer - ; - -elementValueArrayInitializer - : '{' (elementValue (',' elementValue)*)? (',')? '}' - ; - -annotationTypeDeclaration - : '@' 'interface' Identifier annotationTypeBody - ; - -annotationTypeBody - : '{' (annotationTypeElementDeclaration)* '}' - ; - -annotationTypeElementDeclaration - : modifiers annotationTypeElementRest - | ';' // this is not allowed by the grammar, but apparently allowed by the actual compiler - ; - -annotationTypeElementRest - : type annotationMethodOrConstantRest ';' - | normalClassDeclaration ';'? - | normalInterfaceDeclaration ';'? - | enumDeclaration ';'? - | annotationTypeDeclaration ';'? - ; - -annotationMethodOrConstantRest - : annotationMethodRest - | annotationConstantRest - ; - -annotationMethodRest - : Identifier '(' ')' defaultValue? - ; - -annotationConstantRest - : variableDeclarators - ; - -defaultValue - : 'default' elementValue - ; - -// STATEMENTS / BLOCKS - -block - : '{' blockStatement* '}' - ; - -blockStatement - : localVariableDeclarationStatement - | classOrInterfaceDeclaration - | statement - ; - -localVariableDeclarationStatement - : localVariableDeclaration ';' - ; - -localVariableDeclaration - : variableModifiers type variableDeclarators - ; - -variableModifiers - : variableModifier* - ; - -statement - : block - | ASSERT expression (':' expression)? ';' - | 'if' parExpression statement ('else' statement)? - | 'for' '(' forControl ')' statement - | 'while' parExpression statement - | 'do' statement 'while' parExpression ';' - | 'try' block (catches finallyBlock? | finallyBlock) - | 'try' resourceSpecification block catches? finallyBlock? - | 'switch' parExpression '{' switchBlockStatementGroups '}' - | 'synchronized' parExpression block - | 'return' expression? ';' - | 'throw' expression ';' - | 'break' Identifier? ';' - | 'continue' Identifier? ';' - | ';' - | statementExpression ';' - | Identifier ':' statement - ; - -catches - : catchClause+ - ; - -catchClause - : 'catch' '(' variableModifiers catchType Identifier ')' block - ; - -catchType - : qualifiedName ('|' qualifiedName)* - ; - -finallyBlock - : 'finally' block - ; - -resourceSpecification - : '(' resources ';'? ')' - ; - -resources - : resource (';' resource)* - ; - -resource - : variableModifiers classOrInterfaceType variableDeclaratorId '=' expression - ; - -formalParameter - : variableModifiers type variableDeclaratorId - ; - -switchBlockStatementGroups - : (switchBlockStatementGroup)* - ; - -/* The change here (switchLabel -> switchLabel+) technically makes this grammar - ambiguous; but with appropriately greedy parsing it yields the most - appropriate AST, one in which each group, except possibly the last one, has - labels and statements. */ -switchBlockStatementGroup - : switchLabel+ blockStatement* - ; - -switchLabel - : 'case' constantExpression ':' - | 'case' enumConstantName ':' - | 'default' ':' - ; - -forControl - : enhancedForControl - | forInit? ';' expression? ';' forUpdate? - ; - -forInit - : localVariableDeclaration - | expressionList - ; - -enhancedForControl - : variableModifiers type Identifier ':' expression - ; - -forUpdate - : expressionList - ; - -// EXPRESSIONS - -parExpression - : '(' expression ')' - ; - -expressionList - : expression (',' expression)* - ; - -statementExpression - : expression - ; - -constantExpression - : expression - ; - -expression - : primary - | expression '.' Identifier - | expression '.' 'this' - | expression '.' 'new' nonWildcardTypeArguments? innerCreator - | expression '.' 'super' superSuffix - | expression '.' explicitGenericInvocation - | 'new' creator - | expression '[' expression ']' - | '(' type ')' expression - | expression ('++' | '--') - | expression '(' expressionList? ')' - | ('+'|'-'|'++'|'--') expression - | ('~'|'!') expression - | expression ('*'|'/'|'%') expression - | expression ('+'|'-') expression - | expression ('<' '<' | '>' '>' '>' | '>' '>') expression - | expression ('<=' | '>=' | '>' | '<') expression - | expression 'instanceof' type - | expression ('==' | '!=') expression - | expression '&' expression - | expression '^' expression - | expression '|' expression - | expression '&&' expression - | expression '||' expression - | expression '?' expression ':' expression - | expression - ( '=' - | '+=' - | '-=' - | '*=' - | '/=' - | '&=' - | '|=' - | '^=' - | '>>=' - | '>>>=' - | '<<=' - | '%=' - ) - expression - ; - -primary - : '(' expression ')' - | 'this' - | 'super' - | literal - | Identifier - | type '.' 'class' - | 'void' '.' 'class' - | nonWildcardTypeArguments (explicitGenericInvocationSuffix | 'this' arguments) - ; - -creator - : nonWildcardTypeArguments createdName classCreatorRest - | createdName (arrayCreatorRest | classCreatorRest) - ; - -createdName - : Identifier typeArgumentsOrDiamond? ('.' Identifier typeArgumentsOrDiamond?)* - | primitiveType - ; - -innerCreator - : Identifier nonWildcardTypeArgumentsOrDiamond? classCreatorRest - ; - -arrayCreatorRest - : '[' - ( ']' ('[' ']')* arrayInitializer - | expression ']' ('[' expression ']')* ('[' ']')* - ) - ; - -classCreatorRest - : arguments classBody? - ; - -explicitGenericInvocation - : nonWildcardTypeArguments explicitGenericInvocationSuffix - ; - -nonWildcardTypeArguments - : '<' typeList '>' - ; - -typeArgumentsOrDiamond - : '<' '>' - | typeArguments - ; - -nonWildcardTypeArgumentsOrDiamond - : '<' '>' - | nonWildcardTypeArguments - ; - -superSuffix - : arguments - | '.' Identifier arguments? - ; - -explicitGenericInvocationSuffix - : 'super' superSuffix - | Identifier arguments - ; - -arguments - : '(' expressionList? ')' - ; - -// LEXER - -// §3.9 Keywords - -ABSTRACT : 'abstract'; -ASSERT : 'assert'; -BOOLEAN : 'boolean'; -BREAK : 'break'; -BYTE : 'byte'; -CASE : 'case'; -CATCH : 'catch'; -CHAR : 'char'; -CLASS : 'class'; -CONST : 'const'; -CONTINUE : 'continue'; -DEFAULT : 'default'; -DO : 'do'; -DOUBLE : 'double'; -ELSE : 'else'; -ENUM : 'enum'; -EXTENDS : 'extends'; -FINAL : 'final'; -FINALLY : 'finally'; -FLOAT : 'float'; -FOR : 'for'; -IF : 'if'; -GOTO : 'goto'; -IMPLEMENTS : 'implements'; -IMPORT : 'import'; -INSTANCEOF : 'instanceof'; -INT : 'int'; -INTERFACE : 'interface'; -LONG : 'long'; -NATIVE : 'native'; -NEW : 'new'; -PACKAGE : 'package'; -PRIVATE : 'private'; -PROTECTED : 'protected'; -PUBLIC : 'public'; -RETURN : 'return'; -SHORT : 'short'; -STATIC : 'static'; -STRICTFP : 'strictfp'; -SUPER : 'super'; -SWITCH : 'switch'; -SYNCHRONIZED : 'synchronized'; -THIS : 'this'; -THROW : 'throw'; -THROWS : 'throws'; -TRANSIENT : 'transient'; -TRY : 'try'; -VOID : 'void'; -VOLATILE : 'volatile'; -WHILE : 'while'; - -// §3.10.1 Integer Literals - -IntegerLiteral - : DecimalIntegerLiteral - | HexIntegerLiteral - | OctalIntegerLiteral - | BinaryIntegerLiteral - ; - -fragment -DecimalIntegerLiteral - : DecimalNumeral IntegerTypeSuffix? - ; - -fragment -HexIntegerLiteral - : HexNumeral IntegerTypeSuffix? - ; - -fragment -OctalIntegerLiteral - : OctalNumeral IntegerTypeSuffix? - ; - -fragment -BinaryIntegerLiteral - : BinaryNumeral IntegerTypeSuffix? - ; - -fragment -IntegerTypeSuffix - : [lL] - ; - -fragment -DecimalNumeral - : '0' - | NonZeroDigit (Digits? | Underscores Digits) - ; - -fragment -Digits - : Digit (DigitsAndUnderscores? Digit)? - ; - -fragment -Digit - : '0' - | NonZeroDigit - ; - -fragment -NonZeroDigit - : [1-9] - ; - -fragment -DigitsAndUnderscores - : DigitOrUnderscore+ - ; - -fragment -DigitOrUnderscore - : Digit - | '_' - ; - -fragment -Underscores - : '_'+ - ; - -fragment -HexNumeral - : '0' [xX] HexDigits - ; - -fragment -HexDigits - : HexDigit (HexDigitsAndUnderscores? HexDigit)? - ; - -fragment -HexDigit - : [0-9a-fA-F] - ; - -fragment -HexDigitsAndUnderscores - : HexDigitOrUnderscore+ - ; - -fragment -HexDigitOrUnderscore - : HexDigit - | '_' - ; - -fragment -OctalNumeral - : '0' Underscores? OctalDigits - ; - -fragment -OctalDigits - : OctalDigit (OctalDigitsAndUnderscores? OctalDigit)? - ; - -fragment -OctalDigit - : [0-7] - ; - -fragment -OctalDigitsAndUnderscores - : OctalDigitOrUnderscore+ - ; - -fragment -OctalDigitOrUnderscore - : OctalDigit - | '_' - ; - -fragment -BinaryNumeral - : '0' [bB] BinaryDigits - ; - -fragment -BinaryDigits - : BinaryDigit (BinaryDigitsAndUnderscores? BinaryDigit)? - ; - -fragment -BinaryDigit - : [01] - ; - -fragment -BinaryDigitsAndUnderscores - : BinaryDigitOrUnderscore+ - ; - -fragment -BinaryDigitOrUnderscore - : BinaryDigit - | '_' - ; - -// §3.10.2 Floating-Point Literals - -FloatingPointLiteral - : DecimalFloatingPointLiteral - | HexadecimalFloatingPointLiteral - ; - -fragment -DecimalFloatingPointLiteral - : Digits '.' Digits? ExponentPart? FloatTypeSuffix? - | '.' Digits ExponentPart? FloatTypeSuffix? - | Digits ExponentPart FloatTypeSuffix? - | Digits FloatTypeSuffix - ; - -fragment -ExponentPart - : ExponentIndicator SignedInteger - ; - -fragment -ExponentIndicator - : [eE] - ; - -fragment -SignedInteger - : Sign? Digits - ; - -fragment -Sign - : [+-] - ; - -fragment -FloatTypeSuffix - : [fFdD] - ; - -fragment -HexadecimalFloatingPointLiteral - : HexSignificand BinaryExponent FloatTypeSuffix? - ; - -fragment -HexSignificand - : HexNumeral '.'? - | '0' [xX] HexDigits? '.' HexDigits - ; - -fragment -BinaryExponent - : BinaryExponentIndicator SignedInteger - ; - -fragment -BinaryExponentIndicator - : [pP] - ; - -// §3.10.3 Boolean Literals - -BooleanLiteral - : 'true' - | 'false' - ; - -// §3.10.4 Character Literals - -CharacterLiteral - : '\'' SingleCharacter '\'' - | '\'' EscapeSequence '\'' - ; - -fragment -SingleCharacter - : ~['\\] - ; - -// §3.10.5 String Literals - -StringLiteral - : '"' StringCharacters? '"' - ; - -fragment -StringCharacters - : StringCharacter+ - ; - -fragment -StringCharacter - : ~["\\] - | EscapeSequence - ; - -// §3.10.6 Escape Sequences for Character and String Literals - -fragment -EscapeSequence - : '\\' [btnfr"'\\] - | OctalEscape - ; - -fragment -OctalEscape - : '\\' OctalDigit - | '\\' OctalDigit OctalDigit - | '\\' ZeroToThree OctalDigit OctalDigit - ; - -fragment -ZeroToThree - : [0-3] - ; - -// §3.10.7 The Null Literal - -NullLiteral - : 'null' - ; - -// §3.11 Separators - -LPAREN : '('; -RPAREN : ')'; -LBRACE : '{'; -RBRACE : '}'; -LBRACK : '['; -RBRACK : ']'; -SEMI : ';'; -COMMA : ','; -DOT : '.'; - -// §3.12 Operators - -ASSIGN : '='; -GT : '>'; -LT : '<'; -BANG : '!'; -TILDE : '~'; -QUESTION : '?'; -COLON : ':'; -EQUAL : '=='; -LE : '<='; -GE : '>='; -NOTEQUAL : '!='; -AND : '&&'; -OR : '||'; -INC : '++'; -DEC : '--'; -ADD : '+'; -SUB : '-'; -MUL : '*'; -DIV : '/'; -BITAND : '&'; -BITOR : '|'; -CARET : '^'; -MOD : '%'; - -ADD_ASSIGN : '+='; -SUB_ASSIGN : '-='; -MUL_ASSIGN : '*='; -DIV_ASSIGN : '/='; -AND_ASSIGN : '&='; -OR_ASSIGN : '|='; -XOR_ASSIGN : '^='; -MOD_ASSIGN : '%='; -LSHIFT_ASSIGN : '<<='; -RSHIFT_ASSIGN : '>>='; -URSHIFT_ASSIGN : '>>>='; - -// §3.8 Identifiers (must appear after all keywords in the grammar) - -Identifier - : JavaLetter JavaLetterOrDigit* - ; - -fragment -JavaLetter - : [a-zA-Z$_] // these are the "java letters" below 0xFF - | // covers all characters above 0xFF which are not a surrogate - ~[\u0000-\u00FF\uD800-\uDBFF] - {IsJavaIdentifierCharacter((char)_input.La(-1), true)}? - //| // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF - // [\uD800-\uDBFF] [\uDC00-\uDFFF] - // {Character.isJavaIdentifierStart(Character.toCodePoint((char)_input.La(-2), (char)_input.La(-1)))}? - ; - -fragment -JavaLetterOrDigit - : [a-zA-Z0-9$_] // these are the "java letters or digits" below 0xFF - | // covers all characters above 0xFF which are not a surrogate - ~[\u0000-\u00FF\uD800-\uDBFF] - {IsJavaIdentifierCharacter((char)_input.La(-1), false)}? - //| // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF - // [\uD800-\uDBFF] [\uDC00-\uDFFF] - // {Character.isJavaIdentifierPart(Character.toCodePoint((char)_input.La(-2), (char)_input.La(-1)))}? - ; - -// -// Additional symbols not defined in the lexical specification -// - -AT : '@'; -ELLIPSIS : '...'; - -// -// Whitespace and comments -// - -WS : [ \t\r\n\u000C]+ -> skip - ; - -COMMENT - : '/*' .*? '*/' -> skip - ; - -LINE_COMMENT - : '//' ~[\r\n]* -> skip - ; diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Java.g4 b/runtime/CSharp/Antlr4.Runtime.Test/Java.g4 deleted file mode 100644 index 26b0e9b2e..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Java.g4 +++ /dev/null @@ -1,1377 +0,0 @@ -/* - [The "BSD licence"] - Copyright (c) 2007-2008 Terence Parr - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/** A Java 1.5 grammar for ANTLR v3 derived from the spec - * - * This is a very close representation of the spec; the changes - * are comestic (remove left recursion) and also fixes (the spec - * isn't exactly perfect). I have run this on the 1.4.2 source - * and some nasty looking enums from 1.5, but have not really - * tested for 1.5 compatibility. - * - * I built this with: java -Xmx100M org.antlr.Tool java.g - * and got two errors that are ok (for now): - * java.g:691:9: Decision can match input such as - * "'0'..'9'{'E', 'e'}{'+', '-'}'0'..'9'{'D', 'F', 'd', 'f'}" - * using multiple alternatives: 3, 4 - * As a result, alternative(s) 4 were disabled for that input - * java.g:734:35: Decision can match input such as "{'$', 'A'..'Z', - * '_', 'a'..'z', '\u00C0'..'\u00D6', '\u00D8'..'\u00F6', - * '\u00F8'..'\u1FFF', '\u3040'..'\u318F', '\u3300'..'\u337F', - * '\u3400'..'\u3D2D', '\u4E00'..'\u9FFF', '\uF900'..'\uFAFF'}" - * using multiple alternatives: 1, 2 - * As a result, alternative(s) 2 were disabled for that input - * - * You can turn enum on/off as a keyword :) - * - * Version 1.0 -- initial release July 5, 2006 (requires 3.0b2 or higher) - * - * Primary author: Terence Parr, July 2006 - * - * Version 1.0.1 -- corrections by Koen Vanderkimpen & Marko van Dooren, - * October 25, 2006; - * fixed normalInterfaceDeclaration: now uses typeParameters instead - * of typeParameter (according to JLS, 3rd edition) - * fixed castExpression: no longer allows expression next to type - * (according to semantics in JLS, in contrast with syntax in JLS) - * - * Version 1.0.2 -- Terence Parr, Nov 27, 2006 - * java spec I built this from had some bizarre for-loop control. - * Looked weird and so I looked elsewhere...Yep, it's messed up. - * simplified. - * - * Version 1.0.3 -- Chris Hogue, Feb 26, 2007 - * Factored out an annotationName rule and used it in the annotation rule. - * Not sure why, but typeName wasn't recognizing references to inner - * annotations (e.g. @InterfaceName.InnerAnnotation()) - * Factored out the elementValue section of an annotation reference. Created - * elementValuePair and elementValuePairs rules, then used them in the - * annotation rule. Allows it to recognize annotation references with - * multiple, comma separated attributes. - * Updated elementValueArrayInitializer so that it allows multiple elements. - * (It was only allowing 0 or 1 element). - * Updated localVariableDeclaration to allow annotations. Interestingly the JLS - * doesn't appear to indicate this is legal, but it does work as of at least - * JDK 1.5.0_06. - * Moved the Identifier portion of annotationTypeElementRest to annotationMethodRest. - * Because annotationConstantRest already references variableDeclarator which - * has the Identifier portion in it, the parser would fail on constants in - * annotation definitions because it expected two identifiers. - * Added optional trailing ';' to the alternatives in annotationTypeElementRest. - * Wouldn't handle an inner interface that has a trailing ';'. - * Swapped the expression and type rule reference order in castExpression to - * make it check for genericized casts first. It was failing to recognize a - * statement like "Class TYPE = (Class)...;" because it was seeing - * 'Class'. - * Changed createdName to use typeArguments instead of nonWildcardTypeArguments. - * Changed the 'this' alternative in primary to allow 'identifierSuffix' rather than - * just 'arguments'. The case it couldn't handle was a call to an explicit - * generic method invocation (e.g. this.doSomething()). Using identifierSuffix - * may be overly aggressive--perhaps should create a more constrained thisSuffix rule? - * - * Version 1.0.4 -- Hiroaki Nakamura, May 3, 2007 - * - * Fixed formalParameterDecls, localVariableDeclaration, forInit, - * and forVarControl to use variableModifier* not 'final'? (annotation)? - * - * Version 1.0.5 -- Terence, June 21, 2007 - * --a[i].foo didn't work. Fixed unaryExpression - * - * Version 1.0.6 -- John Ridgway, March 17, 2008 - * Made "assert" a switchable keyword like "enum". - * Fixed compilationUnit to disallow "annotation importDeclaration ...". - * Changed "Identifier ('.' Identifier)*" to "qualifiedName" in more - * places. - * Changed modifier* and/or variableModifier* to classOrInterfaceModifiers, - * modifiers or variableModifiers, as appropriate. - * Renamed "bound" to "typeBound" to better match language in the JLS. - * Added "memberDeclaration" which rewrites to methodDeclaration or - * fieldDeclaration and pulled type into memberDeclaration. So we parse - * type and then move on to decide whether we're dealing with a field - * or a method. - * Modified "constructorDeclaration" to use "constructorBody" instead of - * "methodBody". constructorBody starts with explicitConstructorInvocation, - * then goes on to blockStatement*. Pulling explicitConstructorInvocation - * out of expressions allowed me to simplify "primary". - * Changed variableDeclarator to simplify it. - * Changed type to use classOrInterfaceType, thus simplifying it; of course - * I then had to add classOrInterfaceType, but it is used in several - * places. - * Fixed annotations, old version allowed "@X(y,z)", which is illegal. - * Added optional comma to end of "elementValueArrayInitializer"; as per JLS. - * Changed annotationTypeElementRest to use normalClassDeclaration and - * normalInterfaceDeclaration rather than classDeclaration and - * interfaceDeclaration, thus getting rid of a couple of grammar ambiguities. - * Split localVariableDeclaration into localVariableDeclarationStatement - * (includes the terminating semi-colon) and localVariableDeclaration. - * This allowed me to use localVariableDeclaration in "forInit" clauses, - * simplifying them. - * Changed switchBlockStatementGroup to use multiple labels. This adds an - * ambiguity, but if one uses appropriately greedy parsing it yields the - * parse that is closest to the meaning of the switch statement. - * Renamed "forVarControl" to "enhancedForControl" -- JLS language. - * Added semantic predicates to test for shift operations rather than other - * things. Thus, for instance, the string "< <" will never be treated - * as a left-shift operator. - * In "creator" we rule out "nonWildcardTypeArguments" on arrayCreation, - * which are illegal. - * Moved "nonWildcardTypeArguments into innerCreator. - * Removed 'super' superSuffix from explicitGenericInvocation, since that - * is only used in explicitConstructorInvocation at the beginning of a - * constructorBody. (This is part of the simplification of expressions - * mentioned earlier.) - * Simplified primary (got rid of those things that are only used in - * explicitConstructorInvocation). - * Lexer -- removed "Exponent?" from FloatingPointLiteral choice 4, since it - * led to an ambiguity. - * - * This grammar successfully parses every .java file in the JDK 1.5 source - * tree (excluding those whose file names include '-', which are not - * valid Java compilation units). - * - * June 26, 2008 - * - * conditionalExpression had wrong precedence x?y:z. - * - * Known remaining problems: - * "Letter" and "JavaIDDigit" are wrong. The actual specification of - * "Letter" should be "a character for which the method - * Character.isJavaIdentifierStart(int) returns true." A "Java - * letter-or-digit is a character for which the method - * Character.isJavaIdentifierPart(int) returns true." - */ -grammar Java; - -@lexer::members { - -private static bool IsJavaIdentifierCharacter(char c, bool start) -{ - switch (char.GetUnicodeCategory(c)) - { - case System.Globalization.UnicodeCategory.UppercaseLetter: - case System.Globalization.UnicodeCategory.LowercaseLetter: - case System.Globalization.UnicodeCategory.TitlecaseLetter: - case System.Globalization.UnicodeCategory.ModifierLetter: - case System.Globalization.UnicodeCategory.OtherLetter: - // isLetter returns true - return true; - - case System.Globalization.UnicodeCategory.LetterNumber: - // getType returns LETTER_NUMBER - return true; - - case System.Globalization.UnicodeCategory.CurrencySymbol: - // a currency symbol (such as "$") - return true; - - case System.Globalization.UnicodeCategory.ConnectorPunctuation: - // a connecting punctuation character (such as "_") - return true; - - case System.Globalization.UnicodeCategory.DecimalDigitNumber: - // it is a digit - return !start; - - case System.Globalization.UnicodeCategory.SpacingCombiningMark: - // it is a combining mark - return !start; - - case System.Globalization.UnicodeCategory.NonSpacingMark: - // it is a non-spacing mark - return !start; - - default: - return false; - } -} - -} - -// starting point for parsing a java file -/* The annotations are separated out to make parsing faster, but must be associated with - a packageDeclaration or a typeDeclaration (and not an empty one). */ -compilationUnit - : annotations - ( packageDeclaration importDeclaration* typeDeclaration* - | classOrInterfaceDeclaration typeDeclaration* - ) - EOF - | packageDeclaration? importDeclaration* typeDeclaration* - EOF - ; - -packageDeclaration - : 'package' qualifiedName ';' - ; - -importDeclaration - : 'import' 'static'? qualifiedName ('.' '*')? ';' - ; - -typeDeclaration - : classOrInterfaceDeclaration - | ';' - ; - -classOrInterfaceDeclaration - : classOrInterfaceModifiers (classDeclaration | interfaceDeclaration) - ; - -classOrInterfaceModifiers - : classOrInterfaceModifier* - ; - -classOrInterfaceModifier - : annotation // class or interface - | ( 'public' // class or interface - | 'protected' // class or interface - | 'private' // class or interface - | 'abstract' // class or interface - | 'static' // class or interface - | 'final' // class only -- does not apply to interfaces - | 'strictfp' // class or interface - ) - ; - -modifiers - : modifier* - ; - -classDeclaration - : normalClassDeclaration - | enumDeclaration - ; - -normalClassDeclaration - : 'class' Identifier typeParameters? - ('extends' type)? - ('implements' typeList)? - classBody - ; - -typeParameters - : '<' typeParameter (',' typeParameter)* '>' - ; - -typeParameter - : Identifier ('extends' typeBound)? - ; - -typeBound - : type ('&' type)* - ; - -enumDeclaration - : ENUM Identifier ('implements' typeList)? enumBody - ; - -enumBody - : '{' enumConstants? ','? enumBodyDeclarations? '}' - ; - -enumConstants - : enumConstant (',' enumConstant)* - ; - -enumConstant - : annotations? Identifier arguments? classBody? - ; - -enumBodyDeclarations - : ';' (classBodyDeclaration)* - ; - -interfaceDeclaration - : normalInterfaceDeclaration - | annotationTypeDeclaration - ; - -normalInterfaceDeclaration - : 'interface' Identifier typeParameters? ('extends' typeList)? interfaceBody - ; - -typeList - : type (',' type)* - ; - -classBody - : '{' classBodyDeclaration* '}' - ; - -interfaceBody - : '{' interfaceBodyDeclaration* '}' - ; - -classBodyDeclaration - : ';' - | 'static'? block - | modifiers memberDecl - ; - -memberDecl - : genericMethodOrConstructorDecl - | memberDeclaration - | 'void' Identifier voidMethodDeclaratorRest - | Identifier constructorDeclaratorRest - | interfaceDeclaration - | classDeclaration - ; - -memberDeclaration - : type (methodDeclaration | fieldDeclaration) - ; - -genericMethodOrConstructorDecl - : typeParameters genericMethodOrConstructorRest - ; - -genericMethodOrConstructorRest - : (type | 'void') Identifier methodDeclaratorRest - | Identifier constructorDeclaratorRest - ; - -methodDeclaration - : Identifier methodDeclaratorRest - ; - -fieldDeclaration - : variableDeclarators ';' - ; - -interfaceBodyDeclaration - : modifiers interfaceMemberDecl - | ';' - ; - -interfaceMemberDecl - : interfaceMethodOrFieldDecl - | interfaceGenericMethodDecl - | 'void' Identifier voidInterfaceMethodDeclaratorRest - | interfaceDeclaration - | classDeclaration - ; - -interfaceMethodOrFieldDecl - : type Identifier interfaceMethodOrFieldRest - ; - -interfaceMethodOrFieldRest - : constantDeclaratorsRest ';' - | interfaceMethodDeclaratorRest - ; - -methodDeclaratorRest - : formalParameters ('[' ']')* - ('throws' qualifiedNameList)? - ( methodBody - | ';' - ) - ; - -voidMethodDeclaratorRest - : formalParameters ('throws' qualifiedNameList)? - ( methodBody - | ';' - ) - ; - -interfaceMethodDeclaratorRest - : formalParameters ('[' ']')* ('throws' qualifiedNameList)? ';' - ; - -interfaceGenericMethodDecl - : typeParameters (type | 'void') Identifier - interfaceMethodDeclaratorRest - ; - -voidInterfaceMethodDeclaratorRest - : formalParameters ('throws' qualifiedNameList)? ';' - ; - -constructorDeclaratorRest - : formalParameters ('throws' qualifiedNameList)? constructorBody - ; - -constantDeclarator - : Identifier constantDeclaratorRest - ; - -variableDeclarators - : variableDeclarator (',' variableDeclarator)* - ; - -variableDeclarator - : variableDeclaratorId ('=' variableInitializer)? - ; - -constantDeclaratorsRest - : constantDeclaratorRest (',' constantDeclarator)* - ; - -constantDeclaratorRest - : ('[' ']')* '=' variableInitializer - ; - -variableDeclaratorId - : Identifier ('[' ']')* - ; - -variableInitializer - : arrayInitializer - | expression - ; - -arrayInitializer - : '{' (variableInitializer (',' variableInitializer)* (',')? )? '}' - ; - -modifier - : annotation - | ( 'public' - | 'protected' - | 'private' - | 'static' - | 'abstract' - | 'final' - | 'native' - | 'synchronized' - | 'transient' - | 'volatile' - | 'strictfp' - ) - ; - -packageOrTypeName - : qualifiedName - ; - -enumConstantName - : Identifier - ; - -typeName - : qualifiedName - ; - -type - : classOrInterfaceType ('[' ']')* - | primitiveType ('[' ']')* - ; - -classOrInterfaceType - : Identifier typeArguments? ('.' Identifier typeArguments? )* - ; - -primitiveType - : 'boolean' - | 'char' - | 'byte' - | 'short' - | 'int' - | 'long' - | 'float' - | 'double' - ; - -variableModifier - : 'final' - | annotation - ; - -typeArguments - : '<' typeArgument (',' typeArgument)* '>' - ; - -typeArgument - : type - | '?' (('extends' | 'super') type)? - ; - -qualifiedNameList - : qualifiedName (',' qualifiedName)* - ; - -formalParameters - : '(' formalParameterDecls? ')' - ; - -formalParameterDecls - : variableModifiers type formalParameterDeclsRest - ; - -formalParameterDeclsRest - : variableDeclaratorId (',' formalParameterDecls)? - | '...' variableDeclaratorId - ; - -methodBody - : block - ; - -constructorBody - : block - ; - -qualifiedName - : Identifier ('.' Identifier)* - ; - -literal - : IntegerLiteral - | FloatingPointLiteral - | CharacterLiteral - | StringLiteral - | BooleanLiteral - | 'null' - ; - -// ANNOTATIONS - -annotations - : annotation+ - ; - -annotation - : '@' annotationName ( '(' ( elementValuePairs | elementValue )? ')' )? - ; - -annotationName - : Identifier ('.' Identifier)* - ; - -elementValuePairs - : elementValuePair (',' elementValuePair)* - ; - -elementValuePair - : Identifier '=' elementValue - ; - -elementValue - : conditionalExpression - | annotation - | elementValueArrayInitializer - ; - -elementValueArrayInitializer - : '{' (elementValue (',' elementValue)*)? (',')? '}' - ; - -annotationTypeDeclaration - : '@' 'interface' Identifier annotationTypeBody - ; - -annotationTypeBody - : '{' (annotationTypeElementDeclaration)* '}' - ; - -annotationTypeElementDeclaration - : modifiers annotationTypeElementRest - | ';' // this is not allowed by the grammar, but apparently allowed by the actual compiler - ; - -annotationTypeElementRest - : type annotationMethodOrConstantRest ';' - | normalClassDeclaration ';'? - | normalInterfaceDeclaration ';'? - | enumDeclaration ';'? - | annotationTypeDeclaration ';'? - ; - -annotationMethodOrConstantRest - : annotationMethodRest - | annotationConstantRest - ; - -annotationMethodRest - : Identifier '(' ')' defaultValue? - ; - -annotationConstantRest - : variableDeclarators - ; - -defaultValue - : 'default' elementValue - ; - -// STATEMENTS / BLOCKS - -block - : '{' blockStatement* '}' - ; - -blockStatement - : localVariableDeclarationStatement - | classOrInterfaceDeclaration - | statement - ; - -localVariableDeclarationStatement - : localVariableDeclaration ';' - ; - -localVariableDeclaration - : variableModifiers type variableDeclarators - ; - -variableModifiers - : variableModifier* - ; - -statement - : block - | ASSERT expression (':' expression)? ';' - | 'if' parExpression statement ('else' statement)? - | 'for' '(' forControl ')' statement - | 'while' parExpression statement - | 'do' statement 'while' parExpression ';' - | 'try' block (catches finallyBlock? | finallyBlock) - | 'try' resourceSpecification block catches? finallyBlock? - | 'switch' parExpression '{' switchBlockStatementGroups '}' - | 'synchronized' parExpression block - | 'return' expression? ';' - | 'throw' expression ';' - | 'break' Identifier? ';' - | 'continue' Identifier? ';' - | ';' - | statementExpression ';' - | Identifier ':' statement - ; - -catches - : catchClause+ - ; - -catchClause - : 'catch' '(' variableModifiers catchType Identifier ')' block - ; - -catchType - : qualifiedName ('|' qualifiedName)* - ; - -finallyBlock - : 'finally' block - ; - -resourceSpecification - : '(' resources ';'? ')' - ; - -resources - : resource (';' resource)* - ; - -resource - : variableModifiers classOrInterfaceType variableDeclaratorId '=' expression - ; - -formalParameter - : variableModifiers type variableDeclaratorId - ; - -switchBlockStatementGroups - : (switchBlockStatementGroup)* - ; - -/* The change here (switchLabel -> switchLabel+) technically makes this grammar - ambiguous; but with appropriately greedy parsing it yields the most - appropriate AST, one in which each group, except possibly the last one, has - labels and statements. */ -switchBlockStatementGroup - : switchLabel+ blockStatement* - ; - -switchLabel - : 'case' constantExpression ':' - | 'case' enumConstantName ':' - | 'default' ':' - ; - -forControl - : enhancedForControl - | forInit? ';' expression? ';' forUpdate? - ; - -forInit - : localVariableDeclaration - | expressionList - ; - -enhancedForControl - : variableModifiers type Identifier ':' expression - ; - -forUpdate - : expressionList - ; - -// EXPRESSIONS - -parExpression - : '(' expression ')' - ; - -expressionList - : expression (',' expression)* - ; - -statementExpression - : expression - ; - -constantExpression - : expression - ; - -expression - : conditionalExpression (assignmentOperator expression)? - ; - -assignmentOperator - : '=' - | '+=' - | '-=' - | '*=' - | '/=' - | '&=' - | '|=' - | '^=' - | '%=' - | '<<=' - | '>>=' - | '>>>=' - ; - -conditionalExpression - : conditionalOrExpression ( '?' expression ':' conditionalExpression )? - ; - -conditionalOrExpression - : conditionalAndExpression ( '||' conditionalAndExpression )* - ; - -conditionalAndExpression - : inclusiveOrExpression ( '&&' inclusiveOrExpression )* - ; - -inclusiveOrExpression - : exclusiveOrExpression ( '|' exclusiveOrExpression )* - ; - -exclusiveOrExpression - : andExpression ( '^' andExpression )* - ; - -andExpression - : equalityExpression ( '&' equalityExpression )* - ; - -equalityExpression - : instanceOfExpression ( ('==' | '!=') instanceOfExpression )* - ; - -instanceOfExpression - : relationalExpression ('instanceof' type)? - ; - -relationalExpression - : shiftExpression ( relationalOp shiftExpression )* - ; - -relationalOp - : '<=' - | '>=' - | '<' - | '>' - ; - -shiftExpression - : additiveExpression ( shiftOp additiveExpression )* - ; - -shiftOp - : t1='<' t2='<' -// { $t1.getLine() == $t2.getLine() && -// $t1.getCharPositionInLine() + 1 == $t2.getCharPositionInLine() }? - | t1='>' t2='>' t3='>' -// { $t1.getLine() == $t2.getLine() && -// $t1.getCharPositionInLine() + 1 == $t2.getCharPositionInLine() && -// $t2.getLine() == $t3.getLine() && -// $t2.getCharPositionInLine() + 1 == $t3.getCharPositionInLine() }? - | t1='>' t2='>' -// { $t1.getLine() == $t2.getLine() && -// $t1.getCharPositionInLine() + 1 == $t2.getCharPositionInLine() }? - ; - - -additiveExpression - : multiplicativeExpression ( ('+' | '-') multiplicativeExpression )* - ; - -multiplicativeExpression - : unaryExpression ( ( '*' | '/' | '%' ) unaryExpression )* - ; - -unaryExpression - : '+' unaryExpression - | '-' unaryExpression - | '++' unaryExpression - | '--' unaryExpression - | unaryExpressionNotPlusMinus - ; - -unaryExpressionNotPlusMinus - : '~' unaryExpression - | '!' unaryExpression - | castExpression - | primary selector* ('++'|'--')? - ; - -castExpression - : '(' primitiveType ')' unaryExpression - | '(' (type | expression) ')' unaryExpressionNotPlusMinus - ; - -primary - : parExpression - | 'this' arguments? - | 'super' superSuffix - | literal - | 'new' creator - | nonWildcardTypeArguments (explicitGenericInvocationSuffix | 'this' arguments) - | Identifier ('.' Identifier)* identifierSuffix? - | primitiveType ('[' ']')* '.' 'class' - | 'void' '.' 'class' - ; - -identifierSuffix - : ('[' ']')+ '.' 'class' - | '[' expression ']' - | arguments - | '.' 'class' - | '.' explicitGenericInvocation - | '.' 'this' - | '.' 'super' arguments - | '.' 'new' nonWildcardTypeArguments? innerCreator - ; - -creator - : nonWildcardTypeArguments createdName classCreatorRest - | createdName (arrayCreatorRest | classCreatorRest) - ; - -createdName - : Identifier typeArgumentsOrDiamond? ('.' Identifier typeArgumentsOrDiamond?)* - | primitiveType - ; - -innerCreator - : Identifier nonWildcardTypeArgumentsOrDiamond? classCreatorRest - ; - -arrayCreatorRest - : '[' - ( ']' ('[' ']')* arrayInitializer - | expression ']' ('[' expression ']')* ('[' ']')* - ) - ; - -classCreatorRest - : arguments classBody? - ; - -explicitGenericInvocation - : nonWildcardTypeArguments explicitGenericInvocationSuffix - ; - -nonWildcardTypeArguments - : '<' typeList '>' - ; - -typeArgumentsOrDiamond - : '<' '>' - | typeArguments - ; - -nonWildcardTypeArgumentsOrDiamond - : '<' '>' - | nonWildcardTypeArguments - ; - -selector - : '.' Identifier arguments? - | '.' explicitGenericInvocation - | '.' 'this' - | '.' 'super' superSuffix - | '.' 'new' nonWildcardTypeArguments? innerCreator - | '[' expression ']' - ; - -superSuffix - : arguments - | '.' Identifier arguments? - ; - -explicitGenericInvocationSuffix - : 'super' superSuffix - | Identifier arguments - ; - -arguments - : '(' expressionList? ')' - ; - -// LEXER - -// §3.9 Keywords - -ABSTRACT : 'abstract'; -ASSERT : 'assert'; -BOOLEAN : 'boolean'; -BREAK : 'break'; -BYTE : 'byte'; -CASE : 'case'; -CATCH : 'catch'; -CHAR : 'char'; -CLASS : 'class'; -CONST : 'const'; -CONTINUE : 'continue'; -DEFAULT : 'default'; -DO : 'do'; -DOUBLE : 'double'; -ELSE : 'else'; -ENUM : 'enum'; -EXTENDS : 'extends'; -FINAL : 'final'; -FINALLY : 'finally'; -FLOAT : 'float'; -FOR : 'for'; -IF : 'if'; -GOTO : 'goto'; -IMPLEMENTS : 'implements'; -IMPORT : 'import'; -INSTANCEOF : 'instanceof'; -INT : 'int'; -INTERFACE : 'interface'; -LONG : 'long'; -NATIVE : 'native'; -NEW : 'new'; -PACKAGE : 'package'; -PRIVATE : 'private'; -PROTECTED : 'protected'; -PUBLIC : 'public'; -RETURN : 'return'; -SHORT : 'short'; -STATIC : 'static'; -STRICTFP : 'strictfp'; -SUPER : 'super'; -SWITCH : 'switch'; -SYNCHRONIZED : 'synchronized'; -THIS : 'this'; -THROW : 'throw'; -THROWS : 'throws'; -TRANSIENT : 'transient'; -TRY : 'try'; -VOID : 'void'; -VOLATILE : 'volatile'; -WHILE : 'while'; - -// §3.10.1 Integer Literals - -IntegerLiteral - : DecimalIntegerLiteral - | HexIntegerLiteral - | OctalIntegerLiteral - | BinaryIntegerLiteral - ; - -fragment -DecimalIntegerLiteral - : DecimalNumeral IntegerTypeSuffix? - ; - -fragment -HexIntegerLiteral - : HexNumeral IntegerTypeSuffix? - ; - -fragment -OctalIntegerLiteral - : OctalNumeral IntegerTypeSuffix? - ; - -fragment -BinaryIntegerLiteral - : BinaryNumeral IntegerTypeSuffix? - ; - -fragment -IntegerTypeSuffix - : [lL] - ; - -fragment -DecimalNumeral - : '0' - | NonZeroDigit (Digits? | Underscores Digits) - ; - -fragment -Digits - : Digit (DigitsAndUnderscores? Digit)? - ; - -fragment -Digit - : '0' - | NonZeroDigit - ; - -fragment -NonZeroDigit - : [1-9] - ; - -fragment -DigitsAndUnderscores - : DigitOrUnderscore+ - ; - -fragment -DigitOrUnderscore - : Digit - | '_' - ; - -fragment -Underscores - : '_'+ - ; - -fragment -HexNumeral - : '0' [xX] HexDigits - ; - -fragment -HexDigits - : HexDigit (HexDigitsAndUnderscores? HexDigit)? - ; - -fragment -HexDigit - : [0-9a-fA-F] - ; - -fragment -HexDigitsAndUnderscores - : HexDigitOrUnderscore+ - ; - -fragment -HexDigitOrUnderscore - : HexDigit - | '_' - ; - -fragment -OctalNumeral - : '0' Underscores? OctalDigits - ; - -fragment -OctalDigits - : OctalDigit (OctalDigitsAndUnderscores? OctalDigit)? - ; - -fragment -OctalDigit - : [0-7] - ; - -fragment -OctalDigitsAndUnderscores - : OctalDigitOrUnderscore+ - ; - -fragment -OctalDigitOrUnderscore - : OctalDigit - | '_' - ; - -fragment -BinaryNumeral - : '0' [bB] BinaryDigits - ; - -fragment -BinaryDigits - : BinaryDigit (BinaryDigitsAndUnderscores? BinaryDigit)? - ; - -fragment -BinaryDigit - : [01] - ; - -fragment -BinaryDigitsAndUnderscores - : BinaryDigitOrUnderscore+ - ; - -fragment -BinaryDigitOrUnderscore - : BinaryDigit - | '_' - ; - -// §3.10.2 Floating-Point Literals - -FloatingPointLiteral - : DecimalFloatingPointLiteral - | HexadecimalFloatingPointLiteral - ; - -fragment -DecimalFloatingPointLiteral - : Digits '.' Digits? ExponentPart? FloatTypeSuffix? - | '.' Digits ExponentPart? FloatTypeSuffix? - | Digits ExponentPart FloatTypeSuffix? - | Digits FloatTypeSuffix - ; - -fragment -ExponentPart - : ExponentIndicator SignedInteger - ; - -fragment -ExponentIndicator - : [eE] - ; - -fragment -SignedInteger - : Sign? Digits - ; - -fragment -Sign - : [+-] - ; - -fragment -FloatTypeSuffix - : [fFdD] - ; - -fragment -HexadecimalFloatingPointLiteral - : HexSignificand BinaryExponent FloatTypeSuffix? - ; - -fragment -HexSignificand - : HexNumeral '.'? - | '0' [xX] HexDigits? '.' HexDigits - ; - -fragment -BinaryExponent - : BinaryExponentIndicator SignedInteger - ; - -fragment -BinaryExponentIndicator - : [pP] - ; - -// §3.10.3 Boolean Literals - -BooleanLiteral - : 'true' - | 'false' - ; - -// §3.10.4 Character Literals - -CharacterLiteral - : '\'' SingleCharacter '\'' - | '\'' EscapeSequence '\'' - ; - -fragment -SingleCharacter - : ~['\\] - ; - -// §3.10.5 String Literals - -StringLiteral - : '"' StringCharacters? '"' - ; - -fragment -StringCharacters - : StringCharacter+ - ; - -fragment -StringCharacter - : ~["\\] - | EscapeSequence - ; - -// §3.10.6 Escape Sequences for Character and String Literals - -fragment -EscapeSequence - : '\\' [btnfr"'\\] - | OctalEscape - ; - -fragment -OctalEscape - : '\\' OctalDigit - | '\\' OctalDigit OctalDigit - | '\\' ZeroToThree OctalDigit OctalDigit - ; - -fragment -ZeroToThree - : [0-3] - ; - -// §3.10.7 The Null Literal - -NullLiteral - : 'null' - ; - -// §3.11 Separators - -LPAREN : '('; -RPAREN : ')'; -LBRACE : '{'; -RBRACE : '}'; -LBRACK : '['; -RBRACK : ']'; -SEMI : ';'; -COMMA : ','; -DOT : '.'; - -// §3.12 Operators - -ASSIGN : '='; -GT : '>'; -LT : '<'; -BANG : '!'; -TILDE : '~'; -QUESTION : '?'; -COLON : ':'; -EQUAL : '=='; -LE : '<='; -GE : '>='; -NOTEQUAL : '!='; -AND : '&&'; -OR : '||'; -INC : '++'; -DEC : '--'; -ADD : '+'; -SUB : '-'; -MUL : '*'; -DIV : '/'; -BITAND : '&'; -BITOR : '|'; -CARET : '^'; -MOD : '%'; - -ADD_ASSIGN : '+='; -SUB_ASSIGN : '-='; -MUL_ASSIGN : '*='; -DIV_ASSIGN : '/='; -AND_ASSIGN : '&='; -OR_ASSIGN : '|='; -XOR_ASSIGN : '^='; -MOD_ASSIGN : '%='; -LSHIFT_ASSIGN : '<<='; -RSHIFT_ASSIGN : '>>='; -URSHIFT_ASSIGN : '>>>='; - -// §3.8 Identifiers (must appear after all keywords in the grammar) - -Identifier - : JavaLetter JavaLetterOrDigit* - ; - -fragment -JavaLetter - : [a-zA-Z$_] // these are the "java letters" below 0xFF - | // covers all characters above 0xFF which are not a surrogate - ~[\u0000-\u00FF\uD800-\uDBFF] - {IsJavaIdentifierCharacter((char)_input.La(-1), true)}? - //| // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF - // [\uD800-\uDBFF] [\uDC00-\uDFFF] - // {Character.isJavaIdentifierStart(Character.toCodePoint((char)_input.La(-2), (char)_input.La(-1)))}? - ; - -fragment -JavaLetterOrDigit - : [a-zA-Z0-9$_] // these are the "java letters or digits" below 0xFF - | // covers all characters above 0xFF which are not a surrogate - ~[\u0000-\u00FF\uD800-\uDBFF] - {IsJavaIdentifierCharacter((char)_input.La(-1), false)}? - //| // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF - // [\uD800-\uDBFF] [\uDC00-\uDFFF] - // {Character.isJavaIdentifierPart(Character.toCodePoint((char)_input.La(-2), (char)_input.La(-1)))}? - ; - -// -// Additional symbols not defined in the lexical specification -// - -AT : '@'; -ELLIPSIS : '...'; - -// -// Whitespace and comments -// - -WS : [ \t\r\n\u000C]+ -> skip - ; - -COMMENT - : '/*' .*? '*/' -> skip - ; - -LINE_COMMENT - : '//' ~[\r\n]* -> skip - ; diff --git a/runtime/CSharp/Antlr4.Runtime.Test/JavaUnicodeInputStream.cs b/runtime/CSharp/Antlr4.Runtime.Test/JavaUnicodeInputStream.cs deleted file mode 100644 index 18615e6e8..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/JavaUnicodeInputStream.cs +++ /dev/null @@ -1,272 +0,0 @@ -namespace Antlr4.Runtime.Test -{ - using System; - using System.Collections.Generic; - using System.Diagnostics; - using Antlr4.Runtime.Misc; - - public class JavaUnicodeInputStream : ICharStream - { - [NotNull] - private readonly ICharStream _source; - private readonly List _escapeIndexes = new List(); - private readonly List _escapeCharacters = new List(); - private readonly List _escapeIndirectionLevels = new List(); - - private int _escapeListIndex; - private int _range; - private int _slashCount; - - private int _la1; - - public JavaUnicodeInputStream([NotNull] ICharStream source) - { - if (source == null) - throw new ArgumentNullException("source"); - - this._source = source; - this._la1 = source.La(1); - } - - public int Size - { - get - { - return _source.Size; - } - } - - public int Index - { - get - { - return _source.Index; - } - } - - public string SourceName - { - get - { - return _source.SourceName; - } - } - - public String GetText(Interval interval) - { - return _source.GetText(interval); - } - - public void Consume() - { - if (_la1 != '\\') - { - _source.Consume(); - _la1 = _source.La(1); - _range = Math.Max(_range, _source.Index); - _slashCount = 0; - return; - } - - // make sure the next character has been processed - this.La(1); - - if (_escapeListIndex >= _escapeIndexes.Count || _escapeIndexes[_escapeListIndex] != Index) - { - _source.Consume(); - _slashCount++; - } - else - { - int indirectionLevel = _escapeIndirectionLevels[_escapeListIndex]; - for (int i = 0; i < 6 + indirectionLevel; i++) - { - _source.Consume(); - } - - _escapeListIndex++; - _slashCount = 0; - } - - _la1 = _source.La(1); - Debug.Assert(_range >= Index); - } - - public int La(int i) - { - if (i == 1 && _la1 != '\\') - { - return _la1; - } - - if (i <= 0) - { - int desiredIndex = Index + i; - for (int j = _escapeListIndex - 1; j >= 0; j--) - { - if (_escapeIndexes[j] + 6 + _escapeIndirectionLevels[j] > desiredIndex) - { - desiredIndex -= 5 + _escapeIndirectionLevels[j]; - } - - if (_escapeIndexes[j] == desiredIndex) - { - return _escapeCharacters[j]; - } - } - - return _source.La(desiredIndex - Index); - } - else - { - int desiredIndex = Index + i - 1; - for (int j = _escapeListIndex; j < _escapeIndexes.Count; j++) - { - if (_escapeIndexes[j] == desiredIndex) - { - return _escapeCharacters[j]; - } - else if (_escapeIndexes[j] < desiredIndex) - { - desiredIndex += 5 + _escapeIndirectionLevels[j]; - } - else - { - return _source.La(desiredIndex - Index + 1); - } - } - - int currentIndex = Index; - int slashCount = _slashCount; - int indirectionLevel = 0; - for (int j = 0; j < i; j++) - { - int previousIndex = currentIndex; - int c = ReadCharAt(ref currentIndex, ref slashCount, ref indirectionLevel); - if (currentIndex > _range) - { - if (currentIndex - previousIndex > 1) - { - _escapeIndexes.Add(previousIndex); - _escapeCharacters.Add(c); - _escapeIndirectionLevels.Add(indirectionLevel); - } - - _range = currentIndex; - } - - if (j == i - 1) - { - return c; - } - } - - throw new InvalidOperationException("shouldn't be reachable"); - } - } - - public int Mark() - { - return _source.Mark(); - } - - public void Release(int marker) - { - _source.Release(marker); - } - - public void Seek(int index) - { - if (index > _range) - { - throw new NotSupportedException(); - } - - _source.Seek(index); - _la1 = _source.La(1); - - _slashCount = 0; - while (_source.La(-_slashCount - 1) == '\\') - { - _slashCount++; - } - - _escapeListIndex = _escapeIndexes.BinarySearch(_source.Index); - if (_escapeListIndex < 0) - { - _escapeListIndex = -_escapeListIndex - 1; - } - } - - private static bool IsHexDigit(int c) - { - return c >= '0' && c <= '9' - || c >= 'a' && c <= 'f' - || c >= 'A' && c <= 'F'; - } - - private static int HexValue(int c) - { - if (c >= '0' && c <= '9') - { - return c - '0'; - } - - if (c >= 'a' && c <= 'f') - { - return c - 'a' + 10; - } - - if (c >= 'A' && c <= 'F') - { - return c - 'A' + 10; - } - - throw new ArgumentException("c"); - } - - private int ReadCharAt(ref int nextIndex, ref int slashCount, ref int indirectionLevel) - { - bool blockUnicodeEscape = (slashCount % 2) != 0; - - int c0 = _source.La(nextIndex - Index + 1); - if (c0 == '\\') - { - slashCount++; - - if (!blockUnicodeEscape) - { - int c1 = _source.La(nextIndex - Index + 2); - if (c1 == 'u') - { - int c2 = _source.La(nextIndex - Index + 3); - indirectionLevel = 0; - while (c2 == 'u') - { - indirectionLevel++; - c2 = _source.La(nextIndex - Index + 3 + indirectionLevel); - } - - int c3 = _source.La(nextIndex - Index + 4 + indirectionLevel); - int c4 = _source.La(nextIndex - Index + 5 + indirectionLevel); - int c5 = _source.La(nextIndex - Index + 6 + indirectionLevel); - if (IsHexDigit(c2) && IsHexDigit(c3) && IsHexDigit(c4) && IsHexDigit(c5)) - { - int value = HexValue(c2); - value = (value << 4) + HexValue(c3); - value = (value << 4) + HexValue(c4); - value = (value << 4) + HexValue(c5); - - nextIndex += 6 + indirectionLevel; - slashCount = 0; - return value; - } - } - } - } - - nextIndex++; - return c0; - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Properties/AssemblyInfo.cs b/runtime/CSharp/Antlr4.Runtime.Test/Properties/AssemblyInfo.cs deleted file mode 100644 index d59ef0aca..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,68 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Antlr4.Runtime.Test")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Tunnel Vision Laboratories, LLC")] -[assembly: AssemblyProduct("Antlr4.Runtime.Test")] -[assembly: AssemblyCopyright("Copyright © Sam Harwell 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -[assembly: CLSCompliant(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("e88a6cd4-d62a-4a1b-a124-47f7fa10ad7e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Sharpen/CRC32.cs b/runtime/CSharp/Antlr4.Runtime.Test/Sharpen/CRC32.cs deleted file mode 100644 index da06f3114..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Sharpen/CRC32.cs +++ /dev/null @@ -1,415 +0,0 @@ -namespace Antlr4.Runtime.Sharpen -{ - using System; - - internal class CRC32 : Checksum - { - private uint _crc; - - public long Value - { - get - { - return (int)_crc; - } - } - - public void Reset() - { - _crc = 0; - } - - public void Update(byte[] buffer, int offset, int length) - { - if (buffer == null) - throw new ArgumentNullException("buffer"); - if (offset < 0) - throw new ArgumentOutOfRangeException("offset"); - if (length < 0) - throw new ArgumentOutOfRangeException("length"); - if (offset > buffer.Length || length > buffer.Length || offset + length > buffer.Length) - throw new ArgumentException(); - - unsafe - { - fixed (byte* data = buffer) - { - _crc = crc32(_crc, data + offset, (uint)length); - } - } - } - - public void Update(int byteValue) - { - byte value = (byte)byteValue; - unsafe - { - _crc = crc32(_crc, &value, 1); - } - } - - /* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - - /* @(#) $Id$ */ - - /* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - */ - - /* Definitions for doing the crc four data bytes at a time. */ - - private static uint REV(uint w) - { - return (w >> 24) + ((w >> 8) & 0xff00) + ((w & 0xff00) << 8) + ((w & 0xff) << 24); - } - - private const uint TBLS = 8; - - /* Local functions for crc concatenation */ - - private static readonly uint[][] crc_table; - - static CRC32() - { - crc_table = new uint[TBLS][]; - for (int i = 0; i < TBLS; i++) - crc_table[i] = new uint[256]; - - make_crc_table(); - } - - /* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. - */ - private static void make_crc_table() - { - /* terms of polynomial defining this crc (except x^32): */ - byte[] p = { 0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26 }; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - uint poly = 0U; - for (int n = 0; n < p.Length; n++) - poly |= 1U << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (int n = 0; n < 256; n++) - { - uint c = (uint)n; - for (int k = 0; k < 8; k++) - c = (c & 1) != 0 ? poly ^ (c >> 1) : c >> 1; - - crc_table[0][n] = c; - } - - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (int n = 0; n < 256; n++) - { - uint c = crc_table[0][n]; - crc_table[4][n] = REV(c); - for (int k = 1; k < 4; k++) - { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); - } - } - } - - /* ========================================================================= - * This function can be used by asm versions of crc32() - */ - private static uint[][] get_crc_table() - { - return crc_table; - } - - ///* ========================================================================= */ - private static unsafe void DO1(ref uint crc, ref byte* buf) - { - crc = crc_table[0][(crc ^ (*buf++)) & 0xFF] ^ (crc >> 8); - } - - private static unsafe void DO8(ref uint crc, ref byte* buf) - { - DO1(ref crc, ref buf); - DO1(ref crc, ref buf); - DO1(ref crc, ref buf); - DO1(ref crc, ref buf); - DO1(ref crc, ref buf); - DO1(ref crc, ref buf); - DO1(ref crc, ref buf); - DO1(ref crc, ref buf); - } - - /* ========================================================================= */ - private static unsafe uint crc32(uint crc, byte* buf, uint len) - { - if (buf == null) - return 0; - - if (BitConverter.IsLittleEndian) - return (uint)crc32_little(crc, buf, len); - else - return (uint)crc32_big(crc, buf, len); - } - - ///* ========================================================================= */ - private static unsafe void DOLIT4(ref uint c, ref uint* buf4) - { - c ^= *buf4++; - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]; - } - - private static unsafe void DOLIT32(ref uint c, ref uint* buf4) - { - DOLIT4(ref c, ref buf4); - DOLIT4(ref c, ref buf4); - DOLIT4(ref c, ref buf4); - DOLIT4(ref c, ref buf4); - DOLIT4(ref c, ref buf4); - DOLIT4(ref c, ref buf4); - DOLIT4(ref c, ref buf4); - DOLIT4(ref c, ref buf4); - } - - /* ========================================================================= */ - private static unsafe uint crc32_little(uint crc, byte* buf, uint len) - { - uint c = (uint)crc; - c = ~c; - while (len != 0 && ((uint)buf & 3) != 0) - { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - uint* buf4 = (uint*)buf; - while (len >= 32) - { - DOLIT32(ref c, ref buf4); - len -= 32; - } - - while (len >= 4) - { - DOLIT4(ref c, ref buf4); - len -= 4; - } - - buf = (byte*)buf4; - - if (len != 0) - { - do - { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len != 0); - } - - c = ~c; - return (uint)c; - } - - ///* ========================================================================= */ - private static unsafe void DOBIG4(ref uint c, ref uint* buf4) - { - c ^= *++buf4; - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]; - } - - private static unsafe void DOBIG32(ref uint c, ref uint* buf4) - { - DOBIG4(ref c, ref buf4); - DOBIG4(ref c, ref buf4); - DOBIG4(ref c, ref buf4); - DOBIG4(ref c, ref buf4); - DOBIG4(ref c, ref buf4); - DOBIG4(ref c, ref buf4); - DOBIG4(ref c, ref buf4); - DOBIG4(ref c, ref buf4); - } - - /* ========================================================================= */ - private static unsafe uint crc32_big(uint crc, byte* buf, uint len) - { - uint c; - uint* buf4; - - c = REV((uint)crc); - c = ~c; - while (len != 0 && ((uint)buf & 3) != 0) - { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (uint*)buf; - buf4--; - while (len >= 32) - { - DOBIG32(ref c, ref buf4); - len -= 32; - } - - while (len >= 4) - { - DOBIG4(ref c, ref buf4); - len -= 4; - } - - buf4++; - buf = (byte*)buf4; - - if (len != 0) - do - { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len != 0); - c = ~c; - return (uint)(REV(c)); - } - - private const int GF2_DIM = 32; /* dimension of GF(2) vectors (length of CRC) */ - - /* ========================================================================= */ - private static unsafe uint gf2_matrix_times(uint* mat, uint vec) - { - uint sum = 0; - while (vec != 0) - { - if ((vec & 1) != 0) - sum ^= *mat; - - vec >>= 1; - mat++; - } - - return sum; - } - - /* ========================================================================= */ - private static unsafe void gf2_matrix_square(uint* square, uint* mat) - { - for (int n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); - } - - /* ========================================================================= */ - private static unsafe uint crc32_combine(uint crc1, uint crc2, uint len2) - { - /* degenerate case */ - if (len2 == 0) - return crc1; - - uint* even = stackalloc uint[GF2_DIM]; /* even-power-of-two zeros operator */ - uint* odd = stackalloc uint[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* put operator for one zero bit in odd */ - odd[0] = 0xEDB88320U; /* CRC-32 polynomial */ - uint row = 1; - for (int n = 1; n < GF2_DIM; n++) - { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do - { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if ((len2 & 1) != 0) - crc1 = gf2_matrix_times(even, crc1); - - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if ((len2 & 1) != 0) - crc1 = gf2_matrix_times(odd, crc1); - - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime.Test/Sharpen/Checksum.cs b/runtime/CSharp/Antlr4.Runtime.Test/Sharpen/Checksum.cs deleted file mode 100644 index 30e70cf16..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/Sharpen/Checksum.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Antlr4.Runtime.Sharpen -{ - internal interface Checksum - { - long Value - { - get; - } - - void Reset(); - - void Update(byte[] buffer, int offset, int length); - - void Update(int byteValue); - } -} diff --git a/runtime/CSharp/Antlr4.Runtime.Test/TaskSchedulers/QueuedTaskScheduler.cs b/runtime/CSharp/Antlr4.Runtime.Test/TaskSchedulers/QueuedTaskScheduler.cs deleted file mode 100644 index 870195503..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/TaskSchedulers/QueuedTaskScheduler.cs +++ /dev/null @@ -1,612 +0,0 @@ -//-------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// File: QueuedTaskScheduler.cs -// -//-------------------------------------------------------------------------- - -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace System.Threading.Tasks.Schedulers -{ - /// - /// Provides a TaskScheduler that provides control over priorities, fairness, and the underlying threads utilized. - /// - [DebuggerTypeProxy(typeof(QueuedTaskSchedulerDebugView))] - [DebuggerDisplay("Id={Id}, Queues={DebugQueueCount}, ScheduledTasks = {DebugTaskCount}")] - public sealed class QueuedTaskScheduler : TaskScheduler, IDisposable - { - /// Debug view for the QueuedTaskScheduler. - private class QueuedTaskSchedulerDebugView - { - /// The scheduler. - private QueuedTaskScheduler _scheduler; - - /// Initializes the debug view. - /// The scheduler. - public QueuedTaskSchedulerDebugView(QueuedTaskScheduler scheduler) - { - if (scheduler == null) throw new ArgumentNullException("scheduler"); - _scheduler = scheduler; - } - - /// Gets all of the Tasks queued to the scheduler directly. - public IEnumerable ScheduledTasks - { - get - { - var tasks = (_scheduler._targetScheduler != null) ? - (IEnumerable)_scheduler._nonthreadsafeTaskQueue : - (IEnumerable)_scheduler._blockingTaskQueue; - return tasks.Where(t => t != null).ToList(); - } - } - - /// Gets the prioritized and fair queues. - public IEnumerable Queues - { - get - { - List queues = new List(); - foreach (var group in _scheduler._queueGroups) queues.AddRange(group.Value); - return queues; - } - } - } - - /// - /// A sorted list of round-robin queue lists. Tasks with the smallest priority value - /// are preferred. Priority groups are round-robin'd through in order of priority. - /// - private readonly SortedList _queueGroups = new SortedList(); - /// Cancellation token used for disposal. - private readonly CancellationTokenSource _disposeCancellation = new CancellationTokenSource(); - /// - /// The maximum allowed concurrency level of this scheduler. If custom threads are - /// used, this represents the number of created threads. - /// - private readonly int _concurrencyLevel; - /// Whether we're processing tasks on the current thread. - private static ThreadLocal _taskProcessingThread = new ThreadLocal(); - - // *** - // *** For when using a target scheduler - // *** - - /// The scheduler onto which actual work is scheduled. - private readonly TaskScheduler _targetScheduler; - /// The queue of tasks to process when using an underlying target scheduler. - private readonly Queue _nonthreadsafeTaskQueue; - /// The number of Tasks that have been queued or that are running whiel using an underlying scheduler. - private int _delegatesQueuedOrRunning = 0; - - // *** - // *** For when using our own threads - // *** - - /// The threads used by the scheduler to process work. - private readonly Thread[] _threads; - /// The collection of tasks to be executed on our custom threads. - private readonly BlockingCollection _blockingTaskQueue; - - // *** - - /// Initializes the scheduler. - public QueuedTaskScheduler() : this(TaskScheduler.Default, 0) { } - - /// Initializes the scheduler. - /// The target underlying scheduler onto which this sceduler's work is queued. - public QueuedTaskScheduler(TaskScheduler targetScheduler) : this(targetScheduler, 0) { } - - /// Initializes the scheduler. - /// The target underlying scheduler onto which this sceduler's work is queued. - /// The maximum degree of concurrency allowed for this scheduler's work. - public QueuedTaskScheduler( - TaskScheduler targetScheduler, - int maxConcurrencyLevel) - { - // Validate arguments - if (targetScheduler == null) throw new ArgumentNullException("underlyingScheduler"); - if (maxConcurrencyLevel < 0) throw new ArgumentOutOfRangeException("concurrencyLevel"); - - // Initialize only those fields relevant to use an underlying scheduler. We don't - // initialize the fields relevant to using our own custom threads. - _targetScheduler = targetScheduler; - _nonthreadsafeTaskQueue = new Queue(); - - // If 0, use the number of logical processors. But make sure whatever value we pick - // is not greater than the degree of parallelism allowed by the underlying scheduler. - _concurrencyLevel = maxConcurrencyLevel != 0 ? maxConcurrencyLevel : Environment.ProcessorCount; - if (targetScheduler.MaximumConcurrencyLevel > 0 && - targetScheduler.MaximumConcurrencyLevel < _concurrencyLevel) - { - _concurrencyLevel = targetScheduler.MaximumConcurrencyLevel; - } - } - - /// Initializes the scheduler. - /// The number of threads to create and use for processing work items. - public QueuedTaskScheduler(int threadCount) : this(threadCount, string.Empty, false, ThreadPriority.Normal, ApartmentState.MTA, 0, null, null) { } - - /// Initializes the scheduler. - /// The number of threads to create and use for processing work items. - /// The name to use for each of the created threads. - /// A Boolean value that indicates whether to use foreground threads instead of background. - /// The priority to assign to each thread. - /// The apartment state to use for each thread. - /// The stack size to use for each thread. - /// An initialization routine to run on each thread. - /// A finalization routine to run on each thread. - public QueuedTaskScheduler( - int threadCount, - string threadName = "", - bool useForegroundThreads = false, - ThreadPriority threadPriority = ThreadPriority.Normal, - ApartmentState threadApartmentState = ApartmentState.MTA, - int threadMaxStackSize = 0, - Action threadInit = null, - Action threadFinally = null) - { - // Validates arguments (some validation is left up to the Thread type itself). - // If the thread count is 0, default to the number of logical processors. - if (threadCount < 0) throw new ArgumentOutOfRangeException("concurrencyLevel"); - else if (threadCount == 0) _concurrencyLevel = Environment.ProcessorCount; - else _concurrencyLevel = threadCount; - - // Initialize the queue used for storing tasks - _blockingTaskQueue = new BlockingCollection(); - - // Create all of the threads - _threads = new Thread[threadCount]; - for (int i = 0; i < threadCount; i++) - { - _threads[i] = new Thread(() => ThreadBasedDispatchLoop(threadInit, threadFinally), threadMaxStackSize) - { - Priority = threadPriority, - IsBackground = !useForegroundThreads, - }; - if (threadName != null) _threads[i].Name = threadName + " (" + i + ")"; - _threads[i].SetApartmentState(threadApartmentState); - } - - // Start all of the threads - foreach (var thread in _threads) thread.Start(); - } - - /// The dispatch loop run by all threads in this scheduler. - /// An initialization routine to run when the thread begins. - /// A finalization routine to run before the thread ends. - private void ThreadBasedDispatchLoop(Action threadInit, Action threadFinally) - { - _taskProcessingThread.Value = true; - if (threadInit != null) threadInit(); - try - { - // If the scheduler is disposed, the cancellation token will be set and - // we'll receive an OperationCanceledException. That OCE should not crash the process. - try - { - // If a thread abort occurs, we'll try to reset it and continue running. - while (true) - { - try - { - // For each task queued to the scheduler, try to execute it. - foreach (var task in _blockingTaskQueue.GetConsumingEnumerable(_disposeCancellation.Token)) - { - // If the task is not null, that means it was queued to this scheduler directly. - // Run it. - if (task != null) - { - TryExecuteTask(task); - } - // If the task is null, that means it's just a placeholder for a task - // queued to one of the subschedulers. Find the next task based on - // priority and fairness and run it. - else - { - // Find the next task based on our ordering rules... - Task targetTask; - QueuedTaskSchedulerQueue queueForTargetTask; - lock (_queueGroups) FindNextTask_NeedsLock(out targetTask, out queueForTargetTask); - - // ... and if we found one, run it - if (targetTask != null) queueForTargetTask.ExecuteTask(targetTask); - } - } - } - catch (ThreadAbortException) - { - // If we received a thread abort, and that thread abort was due to shutting down - // or unloading, let it pass through. Otherwise, reset the abort so we can - // continue processing work items. - if (!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload()) - { - Thread.ResetAbort(); - } - } - } - } - catch (OperationCanceledException) { } - } - finally - { - // Run a cleanup routine if there was one - if (threadFinally != null) threadFinally(); - _taskProcessingThread.Value = false; - } - } - - /// Gets the number of queues currently activated. - private int DebugQueueCount - { - get - { - int count = 0; - foreach (var group in _queueGroups) count += group.Value.Count; - return count; - } - } - - /// Gets the number of tasks currently scheduled. - private int DebugTaskCount - { - get - { - return (_targetScheduler != null ? - (IEnumerable)_nonthreadsafeTaskQueue : (IEnumerable)_blockingTaskQueue) - .Where(t => t != null).Count(); - } - } - - /// Find the next task that should be executed, based on priorities and fairness and the like. - /// The found task, or null if none was found. - /// - /// The scheduler associated with the found task. Due to security checks inside of TPL, - /// this scheduler needs to be used to execute that task. - /// - private void FindNextTask_NeedsLock(out Task targetTask, out QueuedTaskSchedulerQueue queueForTargetTask) - { - targetTask = null; - queueForTargetTask = null; - - // Look through each of our queue groups in sorted order. - // This ordering is based on the priority of the queues. - foreach (var queueGroup in _queueGroups) - { - var queues = queueGroup.Value; - - // Within each group, iterate through the queues in a round-robin - // fashion. Every time we iterate again and successfully find a task, - // we'll start in the next location in the group. - foreach (int i in queues.CreateSearchOrder()) - { - queueForTargetTask = queues[i]; - var items = queueForTargetTask._workItems; - if (items.Count > 0) - { - targetTask = items.Dequeue(); - if (queueForTargetTask._disposed && items.Count == 0) - { - RemoveQueue_NeedsLock(queueForTargetTask); - } - queues.NextQueueIndex = (queues.NextQueueIndex + 1) % queueGroup.Value.Count; - return; - } - } - } - } - - /// Queues a task to the scheduler. - /// The task to be queued. - protected override void QueueTask(Task task) - { - // If we've been disposed, no one should be queueing - if (_disposeCancellation.IsCancellationRequested) throw new ObjectDisposedException(GetType().Name); - - // If the target scheduler is null (meaning we're using our own threads), - // add the task to the blocking queue - if (_targetScheduler == null) - { - _blockingTaskQueue.Add(task); - } - // Otherwise, add the task to the non-blocking queue, - // and if there isn't already an executing processing task, - // start one up - else - { - // Queue the task and check whether we should launch a processing - // task (noting it if we do, so that other threads don't result - // in queueing up too many). - bool launchTask = false; - lock (_nonthreadsafeTaskQueue) - { - _nonthreadsafeTaskQueue.Enqueue(task); - if (_delegatesQueuedOrRunning < _concurrencyLevel) - { - ++_delegatesQueuedOrRunning; - launchTask = true; - } - } - - // If necessary, start processing asynchronously - if (launchTask) - { - Task.Factory.StartNew(ProcessPrioritizedAndBatchedTasks, - CancellationToken.None, TaskCreationOptions.None, _targetScheduler); - } - } - } - - /// - /// Process tasks one at a time in the best order. - /// This should be run in a Task generated by QueueTask. - /// It's been separated out into its own method to show up better in Parallel Tasks. - /// - private void ProcessPrioritizedAndBatchedTasks() - { - bool continueProcessing = true; - while (!_disposeCancellation.IsCancellationRequested && continueProcessing) - { - try - { - // Note that we're processing tasks on this thread - _taskProcessingThread.Value = true; - - // Until there are no more tasks to process - while (!_disposeCancellation.IsCancellationRequested) - { - // Try to get the next task. If there aren't any more, we're done. - Task targetTask; - lock (_nonthreadsafeTaskQueue) - { - if (_nonthreadsafeTaskQueue.Count == 0) return; - targetTask = _nonthreadsafeTaskQueue.Dequeue(); - } - - // If the task is null, it's a placeholder for a task in the round-robin queues. - // Find the next one that should be processed. - QueuedTaskSchedulerQueue queueForTargetTask = null; - if (targetTask == null) - { - lock (_queueGroups) FindNextTask_NeedsLock(out targetTask, out queueForTargetTask); - } - - // Now if we finally have a task, run it. If the task - // was associated with one of the round-robin schedulers, we need to use it - // as a thunk to execute its task. - if (targetTask != null) - { - if (queueForTargetTask != null) queueForTargetTask.ExecuteTask(targetTask); - else TryExecuteTask(targetTask); - } - } - } - finally - { - // Now that we think we're done, verify that there really is - // no more work to do. If there's not, highlight - // that we're now less parallel than we were a moment ago. - lock (_nonthreadsafeTaskQueue) - { - if (_nonthreadsafeTaskQueue.Count == 0) - { - _delegatesQueuedOrRunning--; - continueProcessing = false; - _taskProcessingThread.Value = false; - } - } - } - } - } - - /// Notifies the pool that there's a new item to be executed in one of the round-robin queues. - private void NotifyNewWorkItem() { QueueTask(null); } - - /// Tries to execute a task synchronously on the current thread. - /// The task to execute. - /// Whether the task was previously queued. - /// true if the task was executed; otherwise, false. - protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) - { - // If we're already running tasks on this threads, enable inlining - return _taskProcessingThread.Value && TryExecuteTask(task); - } - - /// Gets the tasks scheduled to this scheduler. - /// An enumerable of all tasks queued to this scheduler. - /// This does not include the tasks on sub-schedulers. Those will be retrieved by the debugger separately. - protected override IEnumerable GetScheduledTasks() - { - // If we're running on our own threads, get the tasks from the blocking queue... - if (_targetScheduler == null) - { - // Get all of the tasks, filtering out nulls, which are just placeholders - // for tasks in other sub-schedulers - return _blockingTaskQueue.Where(t => t != null).ToList(); - } - // otherwise get them from the non-blocking queue... - else - { - return _nonthreadsafeTaskQueue.Where(t => t != null).ToList(); - } - } - - /// Gets the maximum concurrency level to use when processing tasks. - public override int MaximumConcurrencyLevel { get { return _concurrencyLevel; } } - - /// Initiates shutdown of the scheduler. - public void Dispose() - { - _disposeCancellation.Cancel(); - } - - /// Creates and activates a new scheduling queue for this scheduler. - /// The newly created and activated queue at priority 0. - public TaskScheduler ActivateNewQueue() { return ActivateNewQueue(0); } - - /// Creates and activates a new scheduling queue for this scheduler. - /// The priority level for the new queue. - /// The newly created and activated queue at the specified priority. - public TaskScheduler ActivateNewQueue(int priority) - { - // Create the queue - var createdQueue = new QueuedTaskSchedulerQueue(priority, this); - - // Add the queue to the appropriate queue group based on priority - lock (_queueGroups) - { - QueueGroup list; - if (!_queueGroups.TryGetValue(priority, out list)) - { - list = new QueueGroup(); - _queueGroups.Add(priority, list); - } - list.Add(createdQueue); - } - - // Hand the new queue back - return createdQueue; - } - - /// Removes a scheduler from the group. - /// The scheduler to be removed. - private void RemoveQueue_NeedsLock(QueuedTaskSchedulerQueue queue) - { - // Find the group that contains the queue and the queue's index within the group - var queueGroup = _queueGroups[queue._priority]; - int index = queueGroup.IndexOf(queue); - - // We're about to remove the queue, so adjust the index of the next - // round-robin starting location if it'll be affected by the removal - if (queueGroup.NextQueueIndex >= index) queueGroup.NextQueueIndex--; - - // Remove it - queueGroup.RemoveAt(index); - } - - /// A group of queues a the same priority level. - private class QueueGroup : List - { - /// The starting index for the next round-robin traversal. - public int NextQueueIndex = 0; - - /// Creates a search order through this group. - /// An enumerable of indices for this group. - public IEnumerable CreateSearchOrder() - { - for (int i = NextQueueIndex; i < Count; i++) yield return i; - for (int i = 0; i < NextQueueIndex; i++) yield return i; - } - } - - /// Provides a scheduling queue associatd with a QueuedTaskScheduler. - [DebuggerDisplay("QueuePriority = {_priority}, WaitingTasks = {WaitingTasks}")] - [DebuggerTypeProxy(typeof(QueuedTaskSchedulerQueueDebugView))] - private sealed class QueuedTaskSchedulerQueue : TaskScheduler, IDisposable - { - /// A debug view for the queue. - private sealed class QueuedTaskSchedulerQueueDebugView - { - /// The queue. - private readonly QueuedTaskSchedulerQueue _queue; - - /// Initializes the debug view. - /// The queue to be debugged. - public QueuedTaskSchedulerQueueDebugView(QueuedTaskSchedulerQueue queue) - { - if (queue == null) throw new ArgumentNullException("queue"); - _queue = queue; - } - - /// Gets the priority of this queue in its associated scheduler. - public int Priority { get { return _queue._priority; } } - /// Gets the ID of this scheduler. - public int Id { get { return _queue.Id; } } - /// Gets all of the tasks scheduled to this queue. - public IEnumerable ScheduledTasks { get { return _queue.GetScheduledTasks(); } } - /// Gets the QueuedTaskScheduler with which this queue is associated. - public QueuedTaskScheduler AssociatedScheduler { get { return _queue._pool; } } - } - - /// The scheduler with which this pool is associated. - private readonly QueuedTaskScheduler _pool; - /// The work items stored in this queue. - internal readonly Queue _workItems; - /// Whether this queue has been disposed. - internal bool _disposed; - /// Gets the priority for this queue. - internal int _priority; - - /// Initializes the queue. - /// The priority associated with this queue. - /// The scheduler with which this queue is associated. - internal QueuedTaskSchedulerQueue(int priority, QueuedTaskScheduler pool) - { - _priority = priority; - _pool = pool; - _workItems = new Queue(); - } - - /// Gets the number of tasks waiting in this scheduler. - internal int WaitingTasks { get { return _workItems.Count; } } - - /// Gets the tasks scheduled to this scheduler. - /// An enumerable of all tasks queued to this scheduler. - protected override IEnumerable GetScheduledTasks() { return _workItems.ToList(); } - - /// Queues a task to the scheduler. - /// The task to be queued. - protected override void QueueTask(Task task) - { - if (_disposed) throw new ObjectDisposedException(GetType().Name); - - // Queue up the task locally to this queue, and then notify - // the parent scheduler that there's work available - lock (_pool._queueGroups) _workItems.Enqueue(task); - _pool.NotifyNewWorkItem(); - } - - /// Tries to execute a task synchronously on the current thread. - /// The task to execute. - /// Whether the task was previously queued. - /// true if the task was executed; otherwise, false. - protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) - { - // If we're using our own threads and if this is being called from one of them, - // or if we're currently processing another task on this thread, try running it inline. - return _taskProcessingThread.Value && TryExecuteTask(task); - } - - /// Runs the specified ask. - /// The task to execute. - internal void ExecuteTask(Task task) { TryExecuteTask(task); } - - /// Gets the maximum concurrency level to use when processing tasks. - public override int MaximumConcurrencyLevel { get { return _pool.MaximumConcurrencyLevel; } } - - /// Signals that the queue should be removed from the scheduler as soon as the queue is empty. - public void Dispose() - { - if (!_disposed) - { - lock (_pool._queueGroups) - { - // We only remove the queue if it's empty. If it's not empty, - // we still mark it as disposed, and the associated QueuedTaskScheduler - // will remove the queue when its count hits 0 and its _disposed is true. - if (_workItems.Count == 0) - { - _pool.RemoveQueue_NeedsLock(this); - } - } - _disposed = true; - } - } - } - } -} \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/TestBitSet.cs b/runtime/CSharp/Antlr4.Runtime.Test/TestBitSet.cs deleted file mode 100644 index a289f3404..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/TestBitSet.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace Antlr4.Runtime.Test -{ - using Microsoft.VisualStudio.TestTools.UnitTesting; - using Sharpen; - - [TestClass] - public class TestBitSet - { - [TestMethod] - public void TestCardinality1() - { - BitSet set = new BitSet(); - Assert.AreEqual(0, set.Cardinality()); - for (int i = 0; i < 128; i++) - { - set.Set(i); - Assert.AreEqual(i + 1, set.Cardinality()); - Assert.AreEqual(0, set.NextSetBit(0)); - if (i > 0) - Assert.AreEqual(i * 1 - 1, set.NextSetBit(i * 1 - 1)); - } - } - - [TestMethod] - public void TestCardinality2() - { - BitSet set = new BitSet(); - Assert.AreEqual(0, set.Cardinality()); - for (int i = 0; i < 128; i++) - { - set.Set(i * 2); - Assert.AreEqual(i + 1, set.Cardinality()); - Assert.AreEqual(0, set.NextSetBit(0)); - if (i > 0) - Assert.AreEqual(i * 2, set.NextSetBit(i * 2 - 1)); - } - } - - [TestMethod] - public void TestCardinality7() - { - BitSet set = new BitSet(); - Assert.AreEqual(0, set.Cardinality()); - for (int i = 0; i < 128; i++) - { - set.Set(i * 7); - Assert.AreEqual(i + 1, set.Cardinality()); - Assert.AreEqual(0, set.NextSetBit(0)); - if (i > 0) - Assert.AreEqual(i * 7, set.NextSetBit(i * 7 - 1)); - } - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime.Test/TestGraphNodes.cs b/runtime/CSharp/Antlr4.Runtime.Test/TestGraphNodes.cs deleted file mode 100644 index 41acd1eb0..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/TestGraphNodes.cs +++ /dev/null @@ -1,1046 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -namespace Antlr4.Runtime.Test -{ - using System; - using System.Collections.Generic; - using System.Runtime.CompilerServices; - using System.Text; - using Antlr4.Runtime.Atn; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - [TestClass] - public class TestGraphNodes - { - private PredictionContextCache _contextCache; - - [TestInitialize] - public void SetUp() - { - _contextCache = new PredictionContextCache(); - } - - public bool RootIsWildcard - { - get - { - return true; - } - } - - public bool FullContext - { - get - { - return false; - } - } - - [TestMethod] - public void Test_dollar_dollar() - { - PredictionContext r = _contextCache.Join(PredictionContext.EmptyLocal, - PredictionContext.EmptyLocal); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"*\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_dollar_dollar_fullctx() - { - PredictionContext r = _contextCache.Join(PredictionContext.EmptyFull, - PredictionContext.EmptyFull); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"$\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_x_dollar() - { - PredictionContext r = _contextCache.Join(X(false), PredictionContext.EmptyLocal); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"*\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_x_dollar_fullctx() - { - PredictionContext r = _contextCache.Join(X(true), PredictionContext.EmptyFull); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|$\"];" + Environment.NewLine + - " s1[label=\"$\"];" + Environment.NewLine + - " s0:p0->s1[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_dollar_x() - { - PredictionContext r = _contextCache.Join(PredictionContext.EmptyLocal, X(false)); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"*\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_dollar_x_fullctx() - { - PredictionContext r = _contextCache.Join(PredictionContext.EmptyFull, X(true)); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|$\"];" + Environment.NewLine + - " s1[label=\"$\"];" + Environment.NewLine + - " s0:p0->s1[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_a_a() - { - PredictionContext r = _contextCache.Join(A(false), A(false)); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_adollar_ax() - { - PredictionContext a1 = A(false); - PredictionContext x = X(false); - PredictionContext a2 = CreateSingleton(x, 1); - PredictionContext r = _contextCache.Join(a1, a2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_adollar_ax_fullctx() - { - PredictionContext a1 = A(true); - PredictionContext x = X(true); - PredictionContext a2 = CreateSingleton(x, 1); - PredictionContext r = _contextCache.Join(a1, a2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[shape=record, label=\"|$\"];" + Environment.NewLine + - " s2[label=\"$\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - " s1:p0->s2[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_axdollar_adollar() - { - PredictionContext x = X(false); - PredictionContext a1 = CreateSingleton(x, 1); - PredictionContext a2 = A(false); - PredictionContext r = _contextCache.Join(a1, a2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_aadollar_adollar_dollar_fullCtx() - { - PredictionContext empty = PredictionContext.EmptyFull; - PredictionContext child1 = CreateSingleton(empty, 8); - PredictionContext right = _contextCache.Join(empty, child1); - PredictionContext left = CreateSingleton(right, 8); - PredictionContext merged = _contextCache.Join(left, right); - String actual = ToDotString(merged); - Console.WriteLine(actual); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|$\"];" + Environment.NewLine + - " s1[shape=record, label=\"|$\"];" + Environment.NewLine + - " s2[label=\"$\"];" + Environment.NewLine + - " s0:p0->s1[label=\"8\"];" + Environment.NewLine + - " s1:p0->s2[label=\"8\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, actual); - } - - [TestMethod] - public void Test_axdollar_adollar_fullctx() - { - PredictionContext x = X(true); - PredictionContext a1 = CreateSingleton(x, 1); - PredictionContext a2 = A(true); - PredictionContext r = _contextCache.Join(a1, a2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[shape=record, label=\"|$\"];" + Environment.NewLine + - " s2[label=\"$\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - " s1:p0->s2[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_a_b() - { - PredictionContext r = _contextCache.Join(A(false), B(false)); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_ax_ax_same() - { - PredictionContext x = X(false); - PredictionContext a1 = CreateSingleton(x, 1); - PredictionContext a2 = CreateSingleton(x, 1); - PredictionContext r = _contextCache.Join(a1, a2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s2[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - " s1->s2[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_ax_ax() - { - PredictionContext x1 = X(false); - PredictionContext x2 = X(false); - PredictionContext a1 = CreateSingleton(x1, 1); - PredictionContext a2 = CreateSingleton(x2, 1); - PredictionContext r = _contextCache.Join(a1, a2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s2[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - " s1->s2[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_abx_abx() - { - PredictionContext x1 = X(false); - PredictionContext x2 = X(false); - PredictionContext b1 = CreateSingleton(x1, 2); - PredictionContext b2 = CreateSingleton(x2, 2); - PredictionContext a1 = CreateSingleton(b1, 1); - PredictionContext a2 = CreateSingleton(b2, 1); - PredictionContext r = _contextCache.Join(a1, a2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s3[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - " s1->s2[label=\"2\"];" + Environment.NewLine + - " s2->s3[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_abx_acx() - { - PredictionContext x1 = X(false); - PredictionContext x2 = X(false); - PredictionContext b = CreateSingleton(x1, 2); - PredictionContext c = CreateSingleton(x2, 3); - PredictionContext a1 = CreateSingleton(b, 1); - PredictionContext a2 = CreateSingleton(c, 1); - PredictionContext r = _contextCache.Join(a1, a2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[shape=record, label=\"|\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s3[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - " s1:p0->s2[label=\"2\"];" + Environment.NewLine + - " s1:p1->s2[label=\"3\"];" + Environment.NewLine + - " s2->s3[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_ax_bx_same() - { - PredictionContext x = X(false); - PredictionContext a = CreateSingleton(x, 1); - PredictionContext b = CreateSingleton(x, 2); - PredictionContext r = _contextCache.Join(a, b); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s2[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - " s1->s2[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_ax_bx() - { - PredictionContext x1 = X(false); - PredictionContext x2 = X(false); - PredictionContext a = CreateSingleton(x1, 1); - PredictionContext b = CreateSingleton(x2, 2); - PredictionContext r = _contextCache.Join(a, b); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s2[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - " s1->s2[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_ax_by() - { - PredictionContext a = CreateSingleton(X(false), 1); - PredictionContext b = CreateSingleton(Y(false), 2); - PredictionContext r = _contextCache.Join(a, b); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s3[label=\"*\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s2->s3[label=\"10\"];" + Environment.NewLine + - " s1->s3[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_adollar_bx() - { - PredictionContext x2 = X(false); - PredictionContext a = A(false); - PredictionContext b = CreateSingleton(x2, 2); - PredictionContext r = _contextCache.Join(a, b); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s2->s1[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_adollar_bx_fullctx() - { - PredictionContext x2 = X(true); - PredictionContext a = A(true); - PredictionContext b = CreateSingleton(x2, 2); - PredictionContext r = _contextCache.Join(a, b); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s1[label=\"$\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s2->s1[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_aex_bfx() - { - PredictionContext x1 = X(false); - PredictionContext x2 = X(false); - PredictionContext e = CreateSingleton(x1, 5); - PredictionContext f = CreateSingleton(x2, 6); - PredictionContext a = CreateSingleton(e, 1); - PredictionContext b = CreateSingleton(f, 2); - PredictionContext r = _contextCache.Join(a, b); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s3[label=\"3\"];" + Environment.NewLine + - " s4[label=\"*\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s2->s3[label=\"6\"];" + Environment.NewLine + - " s3->s4[label=\"9\"];" + Environment.NewLine + - " s1->s3[label=\"5\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - // Array merges - - [TestMethod] - public void Test_Adollar_Adollar_fullctx() - { - PredictionContext A1 = Array(PredictionContext.EmptyFull); - PredictionContext A2 = Array(PredictionContext.EmptyFull); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"$\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aab_Ac() - { // a,b + c - PredictionContext a = A(false); - PredictionContext b = B(false); - PredictionContext c = C(false); - PredictionContext A1 = Array(a, b); - PredictionContext A2 = Array(c); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"||\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - " s0:p2->s1[label=\"3\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aa_Aa() - { - PredictionContext a1 = A(false); - PredictionContext a2 = A(false); - PredictionContext A1 = Array(a1); - PredictionContext A2 = Array(a2); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aa_Abc() - { // a + b,c - PredictionContext a = A(false); - PredictionContext b = B(false); - PredictionContext c = C(false); - PredictionContext A1 = Array(a); - PredictionContext A2 = Array(b, c); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"||\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - " s0:p2->s1[label=\"3\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aac_Ab() - { // a,c + b - PredictionContext a = A(false); - PredictionContext b = B(false); - PredictionContext c = C(false); - PredictionContext A1 = Array(a, c); - PredictionContext A2 = Array(b); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"||\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - " s0:p2->s1[label=\"3\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aab_Aa() - { // a,b + a - PredictionContext A1 = Array(A(false), B(false)); - PredictionContext A2 = Array(A(false)); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aab_Ab() - { // a,b + b - PredictionContext A1 = Array(A(false), B(false)); - PredictionContext A2 = Array(B(false)); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s1[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aax_Aby() - { // ax + by but in arrays - PredictionContext a = CreateSingleton(X(false), 1); - PredictionContext b = CreateSingleton(Y(false), 2); - PredictionContext A1 = Array(a); - PredictionContext A2 = Array(b); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s3[label=\"*\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s2->s3[label=\"10\"];" + Environment.NewLine + - " s1->s3[label=\"9\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aax_Aay() - { // ax + ay -> merged singleton a, array parent - PredictionContext a1 = CreateSingleton(X(false), 1); - PredictionContext a2 = CreateSingleton(Y(false), 1); - PredictionContext A1 = Array(a1); - PredictionContext A2 = Array(a2); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[label=\"0\"];" + Environment.NewLine + - " s1[shape=record, label=\"|\"];" + Environment.NewLine + - " s2[label=\"*\"];" + Environment.NewLine + - " s0->s1[label=\"1\"];" + Environment.NewLine + - " s1:p0->s2[label=\"9\"];" + Environment.NewLine + - " s1:p1->s2[label=\"10\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aaxc_Aayd() - { // ax,c + ay,d -> merged a, array parent - PredictionContext a1 = CreateSingleton(X(false), 1); - PredictionContext a2 = CreateSingleton(Y(false), 1); - PredictionContext A1 = Array(a1, C(false)); - PredictionContext A2 = Array(a2, D(false)); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"||\"];" + Environment.NewLine + - " s2[label=\"*\"];" + Environment.NewLine + - " s1[shape=record, label=\"|\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"3\"];" + Environment.NewLine + - " s0:p2->s2[label=\"4\"];" + Environment.NewLine + - " s1:p0->s2[label=\"9\"];" + Environment.NewLine + - " s1:p1->s2[label=\"10\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aaubv_Acwdx() - { // au,bv + cw,dx -> [a,b,c,d]->[u,v,w,x] - PredictionContext a = CreateSingleton(U(false), 1); - PredictionContext b = CreateSingleton(V(false), 2); - PredictionContext c = CreateSingleton(W(false), 3); - PredictionContext d = CreateSingleton(X(false), 4); - PredictionContext A1 = Array(a, b); - PredictionContext A2 = Array(c, d); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|||\"];" + Environment.NewLine + - " s4[label=\"4\"];" + Environment.NewLine + - " s5[label=\"*\"];" + Environment.NewLine + - " s3[label=\"3\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s0:p2->s3[label=\"3\"];" + Environment.NewLine + - " s0:p3->s4[label=\"4\"];" + Environment.NewLine + - " s4->s5[label=\"9\"];" + Environment.NewLine + - " s3->s5[label=\"8\"];" + Environment.NewLine + - " s2->s5[label=\"7\"];" + Environment.NewLine + - " s1->s5[label=\"6\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aaubv_Abvdx() - { // au,bv + bv,dx -> [a,b,d]->[u,v,x] - PredictionContext a = CreateSingleton(U(false), 1); - PredictionContext b1 = CreateSingleton(V(false), 2); - PredictionContext b2 = CreateSingleton(V(false), 2); - PredictionContext d = CreateSingleton(X(false), 4); - PredictionContext A1 = Array(a, b1); - PredictionContext A2 = Array(b2, d); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"||\"];" + Environment.NewLine + - " s3[label=\"3\"];" + Environment.NewLine + - " s4[label=\"*\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s0:p2->s3[label=\"4\"];" + Environment.NewLine + - " s3->s4[label=\"9\"];" + Environment.NewLine + - " s2->s4[label=\"7\"];" + Environment.NewLine + - " s1->s4[label=\"6\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aaubv_Abwdx() - { // au,bv + bw,dx -> [a,b,d]->[u,[v,w],x] - PredictionContext a = CreateSingleton(U(false), 1); - PredictionContext b1 = CreateSingleton(V(false), 2); - PredictionContext b2 = CreateSingleton(W(false), 2); - PredictionContext d = CreateSingleton(X(false), 4); - PredictionContext A1 = Array(a, b1); - PredictionContext A2 = Array(b2, d); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"||\"];" + Environment.NewLine + - " s3[label=\"3\"];" + Environment.NewLine + - " s4[label=\"*\"];" + Environment.NewLine + - " s2[shape=record, label=\"|\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s0:p2->s3[label=\"4\"];" + Environment.NewLine + - " s3->s4[label=\"9\"];" + Environment.NewLine + - " s2:p0->s4[label=\"7\"];" + Environment.NewLine + - " s2:p1->s4[label=\"8\"];" + Environment.NewLine + - " s1->s4[label=\"6\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aaubv_Abvdu() - { // au,bv + bv,du -> [a,b,d]->[u,v,u]; u,v shared - PredictionContext a = CreateSingleton(U(false), 1); - PredictionContext b1 = CreateSingleton(V(false), 2); - PredictionContext b2 = CreateSingleton(V(false), 2); - PredictionContext d = CreateSingleton(U(false), 4); - PredictionContext A1 = Array(a, b1); - PredictionContext A2 = Array(b2, d); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"||\"];" + Environment.NewLine + - " s2[label=\"2\"];" + Environment.NewLine + - " s3[label=\"*\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s2[label=\"2\"];" + Environment.NewLine + - " s0:p2->s1[label=\"4\"];" + Environment.NewLine + - " s2->s3[label=\"7\"];" + Environment.NewLine + - " s1->s3[label=\"6\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - [TestMethod] - public void Test_Aaubu_Acudu() - { // au,bu + cu,du -> [a,b,c,d]->[u,u,u,u] - PredictionContext a = CreateSingleton(U(false), 1); - PredictionContext b = CreateSingleton(U(false), 2); - PredictionContext c = CreateSingleton(U(false), 3); - PredictionContext d = CreateSingleton(U(false), 4); - PredictionContext A1 = Array(a, b); - PredictionContext A2 = Array(c, d); - PredictionContext r = _contextCache.Join(A1, A2); - Console.WriteLine(ToDotString(r)); - String expecting = - "digraph G {" + Environment.NewLine + - "rankdir=LR;" + Environment.NewLine + - " s0[shape=record, label=\"|||\"];" + Environment.NewLine + - " s1[label=\"1\"];" + Environment.NewLine + - " s2[label=\"*\"];" + Environment.NewLine + - " s0:p0->s1[label=\"1\"];" + Environment.NewLine + - " s0:p1->s1[label=\"2\"];" + Environment.NewLine + - " s0:p2->s1[label=\"3\"];" + Environment.NewLine + - " s0:p3->s1[label=\"4\"];" + Environment.NewLine + - " s1->s2[label=\"6\"];" + Environment.NewLine + - "}" + Environment.NewLine; - Assert.AreEqual(expecting, ToDotString(r)); - } - - - // ------------ SUPPORT ------------------------- - - protected PredictionContext A(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 1); - } - - private PredictionContext B(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 2); - } - - private PredictionContext C(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 3); - } - - private PredictionContext D(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 4); - } - - private PredictionContext U(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 6); - } - - private PredictionContext V(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 7); - } - - private PredictionContext W(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 8); - } - - private PredictionContext X(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 9); - } - - private PredictionContext Y(bool fullContext) - { - return CreateSingleton(fullContext ? PredictionContext.EmptyFull : PredictionContext.EmptyLocal, 10); - } - - public PredictionContext CreateSingleton(PredictionContext parent, int payload) - { - PredictionContext a = _contextCache.GetChild(parent, payload); - return a; - } - - public PredictionContext Array(params PredictionContext[] nodes) - { - PredictionContext result = nodes[0]; - for (int i = 1; i < nodes.Length; i++) - { - result = _contextCache.Join(result, nodes[i]); - } - - return result; - } - - private static String ToDotString(PredictionContext context) - { - StringBuilder nodes = new StringBuilder(); - StringBuilder edges = new StringBuilder(); - IDictionary visited = new IdentityHashMap(); - IDictionary contextIds = new IdentityHashMap(); - Stack workList = new Stack(); - visited[context] = context; - contextIds[context] = contextIds.Count; - workList.Push(context); - while (workList.Count > 0) - { - PredictionContext current = workList.Pop(); - nodes.Append(" s").Append(contextIds[current]).Append('['); - - if (current.Size > 1) - { - nodes.Append("shape=record, "); - } - - nodes.Append("label=\""); - - if (current.IsEmpty) - { - nodes.Append(PredictionContext.IsEmptyLocal(current) ? '*' : '$'); - } - else if (current.Size > 1) - { - for (int i = 0; i < current.Size; i++) - { - if (i > 0) - { - nodes.Append('|'); - } - - nodes.Append("'); - if (current.GetReturnState(i) == PredictionContext.EmptyFullStateKey) - { - nodes.Append('$'); - } - else if (current.GetReturnState(i) == PredictionContext.EmptyLocalStateKey) - { - nodes.Append('*'); - } - } - } - else - { - nodes.Append(contextIds[current]); - } - - nodes.AppendLine("\"];"); - - for (int i = 0; i < current.Size; i++) - { - if (current.GetReturnState(i) == PredictionContext.EmptyFullStateKey - || current.GetReturnState(i) == PredictionContext.EmptyLocalStateKey) - { - continue; - } - - if (!visited.ContainsKey(current.GetParent(i))) - { - visited[current.GetParent(i)] = current.GetParent(i); - contextIds[current.GetParent(i)] = contextIds.Count; - workList.Push(current.GetParent(i)); - } - - edges.Append(" s").Append(contextIds[current]); - if (current.Size > 1) - { - edges.Append(":p").Append(i); - } - - edges.Append("->"); - edges.Append('s').Append(contextIds[current.GetParent(i)]); - edges.Append("[label=\"").Append(current.GetReturnState(i)).Append("\"]"); - edges.AppendLine(";"); - } - } - - StringBuilder builder = new StringBuilder(); - builder.AppendLine("digraph G {"); - builder.AppendLine("rankdir=LR;"); - builder.Append(nodes); - builder.Append(edges); - builder.AppendLine("}"); - return builder.ToString(); - } - - private class IdentityHashMap : Dictionary - where TKey : class - { - public IdentityHashMap() - : base(IdentityEqualityComparer.Default) - { - } - } - - private class IdentityEqualityComparer : IEqualityComparer - where T : class - { - private static readonly IdentityEqualityComparer _default = new IdentityEqualityComparer(); - - public static IdentityEqualityComparer Default - { - get - { - return _default; - } - } - - public bool Equals(T x, T y) - { - return x == y; - } - - public int GetHashCode(T obj) - { - return RuntimeHelpers.GetHashCode(obj); - } - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime.Test/TestIntervalSet.cs b/runtime/CSharp/Antlr4.Runtime.Test/TestIntervalSet.cs deleted file mode 100644 index 2e5f67a27..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/TestIntervalSet.cs +++ /dev/null @@ -1,508 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -namespace Antlr4.Runtime.Test -{ - using System; - using System.Collections.Generic; - using System.Linq; - using Antlr4.Runtime.Misc; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - [TestClass] - public class TestIntervalSet - { - [TestMethod] - public void TestSingleElement() - { - IntervalSet s = IntervalSet.Of(99); - String expecting = "99"; - Assert.AreEqual(s.ToString(), expecting); - } - - [TestMethod] - public void TestIsolatedElements() - { - IntervalSet s = new IntervalSet(); - s.Add(1); - s.Add('z'); - s.Add('\uFFF0'); - String expecting = "{1, 122, 65520}"; - Assert.AreEqual(s.ToString(), expecting); - } - - [TestMethod] - public void TestMixedRangesAndElements() - { - IntervalSet s = new IntervalSet(); - s.Add(1); - s.Add('a', 'z'); - s.Add('0', '9'); - String expecting = "{1, 48..57, 97..122}"; - Assert.AreEqual(s.ToString(), expecting); - } - - [TestMethod] - public void TestSimpleAnd() - { - IntervalSet s = IntervalSet.Of(10, 20); - IntervalSet s2 = IntervalSet.Of(13, 15); - String expecting = "{13..15}"; - String result = (s.And(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestRangeAndIsolatedElement() - { - IntervalSet s = IntervalSet.Of('a', 'z'); - IntervalSet s2 = IntervalSet.Of('d'); - String expecting = "100"; - String result = (s.And(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestEmptyIntersection() - { - IntervalSet s = IntervalSet.Of('a', 'z'); - IntervalSet s2 = IntervalSet.Of('0', '9'); - String expecting = "{}"; - String result = (s.And(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestEmptyIntersectionSingleElements() - { - IntervalSet s = IntervalSet.Of('a'); - IntervalSet s2 = IntervalSet.Of('d'); - String expecting = "{}"; - String result = (s.And(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestNotSingleElement() - { - IntervalSet vocabulary = IntervalSet.Of(1, 1000); - vocabulary.Add(2000, 3000); - IntervalSet s = IntervalSet.Of(50, 50); - String expecting = "{1..49, 51..1000, 2000..3000}"; - String result = (s.Complement(vocabulary)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestNotSet() - { - IntervalSet vocabulary = IntervalSet.Of(1, 1000); - IntervalSet s = IntervalSet.Of(50, 60); - s.Add(5); - s.Add(250, 300); - String expecting = "{1..4, 6..49, 61..249, 301..1000}"; - String result = (s.Complement(vocabulary)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestNotEqualSet() - { - IntervalSet vocabulary = IntervalSet.Of(1, 1000); - IntervalSet s = IntervalSet.Of(1, 1000); - String expecting = "{}"; - String result = (s.Complement(vocabulary)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestNotSetEdgeElement() - { - IntervalSet vocabulary = IntervalSet.Of(1, 2); - IntervalSet s = IntervalSet.Of(1); - String expecting = "2"; - String result = (s.Complement(vocabulary)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestNotSetFragmentedVocabulary() - { - IntervalSet vocabulary = IntervalSet.Of(1, 255); - vocabulary.Add(1000, 2000); - vocabulary.Add(9999); - IntervalSet s = IntervalSet.Of(50, 60); - s.Add(3); - s.Add(250, 300); - s.Add(10000); // this is outside range of vocab and should be ignored - String expecting = "{1..2, 4..49, 61..249, 1000..2000, 9999}"; - String result = (s.Complement(vocabulary)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestSubtractOfCompletelyContainedRange() - { - IntervalSet s = IntervalSet.Of(10, 20); - IntervalSet s2 = IntervalSet.Of(12, 15); - String expecting = "{10..11, 16..20}"; - String result = (s.Subtract(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestSubtractOfOverlappingRangeFromLeft() - { - IntervalSet s = IntervalSet.Of(10, 20); - IntervalSet s2 = IntervalSet.Of(5, 11); - String expecting = "{12..20}"; - String result = (s.Subtract(s2)).ToString(); - Assert.AreEqual(expecting, result); - - IntervalSet s3 = IntervalSet.Of(5, 10); - expecting = "{11..20}"; - result = (s.Subtract(s3)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestSubtractOfOverlappingRangeFromRight() - { - IntervalSet s = IntervalSet.Of(10, 20); - IntervalSet s2 = IntervalSet.Of(15, 25); - String expecting = "{10..14}"; - String result = (s.Subtract(s2)).ToString(); - Assert.AreEqual(expecting, result); - - IntervalSet s3 = IntervalSet.Of(20, 25); - expecting = "{10..19}"; - result = (s.Subtract(s3)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestSubtractOfCompletelyCoveredRange() - { - IntervalSet s = IntervalSet.Of(10, 20); - IntervalSet s2 = IntervalSet.Of(1, 25); - String expecting = "{}"; - String result = (s.Subtract(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestSubtractOfRangeSpanningMultipleRanges() - { - IntervalSet s = IntervalSet.Of(10, 20); - s.Add(30, 40); - s.Add(50, 60); // s has 3 ranges now: 10..20, 30..40, 50..60 - IntervalSet s2 = IntervalSet.Of(5, 55); // covers one and touches 2nd range - String expecting = "{56..60}"; - String result = (s.Subtract(s2)).ToString(); - Assert.AreEqual(expecting, result); - - IntervalSet s3 = IntervalSet.Of(15, 55); // touches both - expecting = "{10..14, 56..60}"; - result = (s.Subtract(s3)).ToString(); - Assert.AreEqual(expecting, result); - } - - /** The following was broken: - {0..113, 115..65534}-{0..115, 117..65534}=116..65534 - */ - [TestMethod] - public void TestSubtractOfWackyRange() - { - IntervalSet s = IntervalSet.Of(0, 113); - s.Add(115, 200); - IntervalSet s2 = IntervalSet.Of(0, 115); - s2.Add(117, 200); - String expecting = "116"; - String result = (s.Subtract(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestSimpleEquals() - { - IntervalSet s = IntervalSet.Of(10, 20); - IntervalSet s2 = IntervalSet.Of(10, 20); - Assert.AreEqual(s, s2); - - IntervalSet s3 = IntervalSet.Of(15, 55); - Assert.AreNotEqual(s, s3); - } - - [TestMethod] - public void TestEquals() - { - IntervalSet s = IntervalSet.Of(10, 20); - s.Add(2); - s.Add(499, 501); - IntervalSet s2 = IntervalSet.Of(10, 20); - s2.Add(2); - s2.Add(499, 501); - Assert.AreEqual(s, s2); - - IntervalSet s3 = IntervalSet.Of(10, 20); - s3.Add(2); - Assert.AreNotEqual(s, s3); - } - - [TestMethod] - public void TestSingleElementMinusDisjointSet() - { - IntervalSet s = IntervalSet.Of(15, 15); - IntervalSet s2 = IntervalSet.Of(1, 5); - s2.Add(10, 20); - String expecting = "{}"; // 15 - {1..5, 10..20} = {} - String result = s.Subtract(s2).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestMembership() - { - IntervalSet s = IntervalSet.Of(15, 15); - s.Add(50, 60); - Assert.IsFalse(s.Contains(0)); - Assert.IsFalse(s.Contains(20)); - Assert.IsFalse(s.Contains(100)); - Assert.IsTrue(s.Contains(15)); - Assert.IsTrue(s.Contains(55)); - Assert.IsTrue(s.Contains(50)); - Assert.IsTrue(s.Contains(60)); - } - - // {2,15,18} & 10..20 - [TestMethod] - public void TestIntersectionWithTwoContainedElements() - { - IntervalSet s = IntervalSet.Of(10, 20); - IntervalSet s2 = IntervalSet.Of(2, 2); - s2.Add(15); - s2.Add(18); - String expecting = "{15, 18}"; - String result = (s.And(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestIntersectionWithTwoContainedElementsReversed() - { - IntervalSet s = IntervalSet.Of(10, 20); - IntervalSet s2 = IntervalSet.Of(2, 2); - s2.Add(15); - s2.Add(18); - String expecting = "{15, 18}"; - String result = (s2.And(s)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestComplement() - { - IntervalSet s = IntervalSet.Of(100, 100); - s.Add(101, 101); - IntervalSet s2 = IntervalSet.Of(100, 102); - String expecting = "102"; - String result = (s.Complement(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestComplement2() - { - IntervalSet s = IntervalSet.Of(100, 101); - IntervalSet s2 = IntervalSet.Of(100, 102); - String expecting = "102"; - String result = (s.Complement(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestComplement3() - { - IntervalSet s = IntervalSet.Of(1, 96); - s.Add(99, Lexer.MaxCharValue); - String expecting = "{97..98}"; - String result = (s.Complement(1, Lexer.MaxCharValue)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestMergeOfRangesAndSingleValues() - { - // {0..41, 42, 43..65534} - IntervalSet s = IntervalSet.Of(0, 41); - s.Add(42); - s.Add(43, 65534); - String expecting = "{0..65534}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestMergeOfRangesAndSingleValuesReverse() - { - IntervalSet s = IntervalSet.Of(43, 65534); - s.Add(42); - s.Add(0, 41); - String expecting = "{0..65534}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestMergeWhereAdditionMergesTwoExistingIntervals() - { - // 42, 10, {0..9, 11..41, 43..65534} - IntervalSet s = IntervalSet.Of(42); - s.Add(10); - s.Add(0, 9); - s.Add(43, 65534); - s.Add(11, 41); - String expecting = "{0..65534}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - - /** - * This case is responsible for antlr/antlr4#153. - * https://github.com/antlr/antlr4/issues/153 - */ - [TestMethod] - public void TestMergeWhereAdditionMergesThreeExistingIntervals() - { - IntervalSet s = new IntervalSet(); - s.Add(0); - s.Add(3); - s.Add(5); - s.Add(0, 7); - String expecting = "{0..7}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestMergeWithDoubleOverlap() - { - IntervalSet s = IntervalSet.Of(1, 10); - s.Add(20, 30); - s.Add(5, 25); // overlaps two! - String expecting = "{1..30}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestSize() - { - IntervalSet s = IntervalSet.Of(20, 30); - s.Add(50, 55); - s.Add(5, 19); - String expecting = "32"; - String result = s.Count.ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestToList() - { - IntervalSet s = IntervalSet.Of(20, 25); - s.Add(50, 55); - s.Add(5, 5); - int[] expecting = { 5, 20, 21, 22, 23, 24, 25, 50, 51, 52, 53, 54, 55 }; - IList result = s.ToList(); - CollectionAssert.AreEquivalent(expecting, result.ToArray()); - } - - /** The following was broken: - * {'\u0000'..'s', 'u'..'\uFFFE'} & {'\u0000'..'q', 's'..'\uFFFE'}= - * {'\u0000'..'q', 's'}!!!! broken... - * 'q' is 113 ascii - * 'u' is 117 - */ - [TestMethod] - public void TestNotRIntersectionNotT() - { - IntervalSet s = IntervalSet.Of(0, 's'); - s.Add('u', 200); - IntervalSet s2 = IntervalSet.Of(0, 'q'); - s2.Add('s', 200); - String expecting = "{0..113, 115, 117..200}"; - String result = (s.And(s2)).ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestRmSingleElement() - { - IntervalSet s = IntervalSet.Of(1, 10); - s.Add(-3, -3); - s.Remove(-3); - String expecting = "{1..10}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestRmLeftSide() - { - IntervalSet s = IntervalSet.Of(1, 10); - s.Add(-3, -3); - s.Remove(1); - String expecting = "{-3, 2..10}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestRmRightSide() - { - IntervalSet s = IntervalSet.Of(1, 10); - s.Add(-3, -3); - s.Remove(10); - String expecting = "{-3, 1..9}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - - [TestMethod] - public void TestRmMiddleRange() - { - IntervalSet s = IntervalSet.Of(1, 10); - s.Add(-3, -3); - s.Remove(5); - String expecting = "{-3, 1..4, 6..10}"; - String result = s.ToString(); - Assert.AreEqual(expecting, result); - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime.Test/TestPerformance.cs b/runtime/CSharp/Antlr4.Runtime.Test/TestPerformance.cs deleted file mode 100644 index b852fabc0..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/TestPerformance.cs +++ /dev/null @@ -1,1198 +0,0 @@ -namespace Antlr4.Runtime.Test -{ - using System; - using System.Collections.Generic; - using System.Reflection; - using System.Text; - using Antlr4.Runtime; - using Antlr4.Runtime.Atn; - using Antlr4.Runtime.Dfa; - using Antlr4.Runtime.Misc; - using Antlr4.Runtime.Tree; - using Microsoft.VisualStudio.TestTools.UnitTesting; - using BitSet = Sharpen.BitSet; - using Checksum = Sharpen.Checksum; - using CRC32 = Sharpen.CRC32; - using Debug = System.Diagnostics.Debug; - using DirectoryInfo = System.IO.DirectoryInfo; - using File = System.IO.File; - using FileInfo = System.IO.FileInfo; - using Interlocked = System.Threading.Interlocked; - using IOException = System.IO.IOException; - using Path = System.IO.Path; - using SearchOption = System.IO.SearchOption; - using Stopwatch = System.Diagnostics.Stopwatch; - using Stream = System.IO.Stream; - using StreamReader = System.IO.StreamReader; - using Thread = System.Threading.Thread; - -#if NET40PLUS - using System.Collections.Concurrent; - using System.Threading.Tasks; - using System.Threading.Tasks.Schedulers; - using CancellationToken = System.Threading.CancellationToken; -#endif - - [TestClass] - public class TestPerformance : BaseTest - { - /** - * Parse all java files under this package within the JDK_SOURCE_ROOT - * (environment variable or property defined on the Java command line). - */ - private static readonly string TOP_PACKAGE = "java.lang"; - /** - * {@code true} to load java files from sub-packages of - * {@link #TOP_PACKAGE}. - */ - private static readonly bool RECURSIVE = true; - /** - * {@code true} to read all source files from disk into memory before - * starting the parse. The default value is {@code true} to help prevent - * drive speed from affecting the performance results. This value may be set - * to {@code false} to support parsing large input sets which would not - * otherwise fit into memory. - */ - private static readonly bool PRELOAD_SOURCES = true; - /** - * The encoding to use when reading source files. - */ - private static readonly Encoding ENCODING = Encoding.UTF8; - - /** - * {@code true} to use the Java grammar with expressions in the v4 - * left-recursive syntax (Java-LR.g4). {@code false} to use the standard - * grammar (Java.g4). In either case, the grammar is renamed in the - * temporary directory to Java.g4 before compiling. - */ - private static readonly bool USE_LR_GRAMMAR = true; - /** - * {@code true} to specify the {@code -Xforce-atn} option when generating - * the grammar, forcing all decisions in {@code JavaParser} to be handled by - * {@link ParserATNSimulator#adaptivePredict}. - */ - private static readonly bool FORCE_ATN = false; - /** - * {@code true} to specify the {@code -atn} option when generating the - * grammar. This will cause ANTLR to export the ATN for each decision as a - * DOT (GraphViz) file. - */ - private static readonly bool EXPORT_ATN_GRAPHS = true; - /** - * {@code true} to specify the {@code -XdbgST} option when generating the - * grammar. - */ - private static readonly bool DEBUG_TEMPLATES = false; - /** - * {@code true} to specify the {@code -XdbgSTWait} option when generating the - * grammar. - */ - private static readonly bool DEBUG_TEMPLATES_WAIT = DEBUG_TEMPLATES; - /** - * {@code true} to delete temporary (generated and compiled) files when the - * test completes. - */ - private static readonly bool DELETE_TEMP_FILES = true; - - /** - * {@code true} to call {@link System#gc} and then wait for 5 seconds at the - * end of the test to make it easier for a profiler to grab a heap dump at - * the end of the test run. - */ - private static readonly bool PAUSE_FOR_HEAP_DUMP = false; - - /** - * Parse each file with {@code JavaParser.compilationUnit}. - */ - private static readonly bool RUN_PARSER = true; - /** - * {@code true} to use {@link BailErrorStrategy}, {@code false} to use - * {@link DefaultErrorStrategy}. - */ - private static readonly bool BAIL_ON_ERROR = false; - /** - * {@code true} to compute a checksum for verifying consistency across - * optimizations and multiple passes. - */ - private static readonly bool COMPUTE_CHECKSUM = true; - /** - * This value is passed to {@link Parser#setBuildParseTree}. - */ - private static readonly bool BUILD_PARSE_TREES = false; - /** - * Use - * {@link ParseTreeWalker#DEFAULT}{@code .}{@link ParseTreeWalker#walk walk} - * with the {@code JavaParserBaseListener} to show parse tree walking - * overhead. If {@link #BUILD_PARSE_TREES} is {@code false}, the listener - * will instead be called during the parsing process via - * {@link Parser#addParseListener}. - */ - private static readonly bool BLANK_LISTENER = false; - - private static readonly bool EXPORT_LARGEST_CONFIG_CONTEXTS = false; - - /** - * Shows the number of {@link DFAState} and {@link ATNConfig} instances in - * the DFA cache at the end of each pass. If {@link #REUSE_LEXER_DFA} and/or - * {@link #REUSE_PARSER_DFA} are false, the corresponding instance numbers - * will only apply to one file (the last file if {@link #NUMBER_OF_THREADS} - * is 0, otherwise the last file which was parsed on the first thread). - */ - private static readonly bool SHOW_DFA_STATE_STATS = true; - - private static readonly bool ENABLE_LEXER_DFA = true; - - private static readonly bool ENABLE_PARSER_DFA = true; - - private static readonly PredictionMode PREDICTION_MODE = PredictionMode.Ll; - private static readonly bool FORCE_GLOBAL_CONTEXT = false; - private static readonly bool TRY_LOCAL_CONTEXT_FIRST = true; - private static readonly bool OPTIMIZE_LL1 = true; - private static readonly bool OPTIMIZE_UNIQUE_CLOSURE = true; - private static readonly bool OPTIMIZE_TAIL_CALLS = true; - private static readonly bool TAIL_CALL_PRESERVES_SLL = true; - private static readonly bool TREAT_SLLK1_CONFLICT_AS_AMBIGUITY = false; - - private static readonly bool TWO_STAGE_PARSING = true; - - private static readonly bool SHOW_CONFIG_STATS = false; - - private static readonly bool REPORT_SYNTAX_ERRORS = true; - private static readonly bool REPORT_AMBIGUITIES = false; - private static readonly bool REPORT_FULL_CONTEXT = false; - private static readonly bool REPORT_CONTEXT_SENSITIVITY = REPORT_FULL_CONTEXT; - - /** - * If {@code true}, a single {@code JavaLexer} will be used, and - * {@link Lexer#setInputStream} will be called to initialize it for each - * source file. Otherwise, a new instance will be created for each file. - */ - private static readonly bool REUSE_LEXER = false; - /** - * If {@code true}, a single DFA will be used for lexing which is shared - * across all threads and files. Otherwise, each file will be lexed with its - * own DFA which is accomplished by creating one ATN instance per thread and - * clearing its DFA cache before lexing each file. - */ - private static readonly bool REUSE_LEXER_DFA = true; - /** - * If {@code true}, a single {@code JavaParser} will be used, and - * {@link Parser#setInputStream} will be called to initialize it for each - * source file. Otherwise, a new instance will be created for each file. - */ - private static readonly bool REUSE_PARSER = false; - /** - * If {@code true}, a single DFA will be used for parsing which is shared - * across all threads and files. Otherwise, each file will be parsed with - * its own DFA which is accomplished by creating one ATN instance per thread - * and clearing its DFA cache before parsing each file. - */ - private static readonly bool REUSE_PARSER_DFA = true; - /** - * If {@code true}, the shared lexer and parser are reset after each pass. - * If {@code false}, all passes after the first will be fully "warmed up", - * which makes them faster and can compare them to the first warm-up pass, - * but it will not distinguish bytecode load/JIT time from warm-up time - * during the first pass. - */ - private static readonly bool CLEAR_DFA = false; - /** - * Total number of passes to make over the source. - */ - private static readonly int PASSES = 4; - - /** - * Number of parser threads to use. - * - * - * This value is ignored for .NET Framework 3.5 and earlier. - * - */ - private static readonly int NUMBER_OF_THREADS = 1; - - private static readonly Lexer[] sharedLexers = new Lexer[NUMBER_OF_THREADS]; - private static readonly ATN[] sharedLexerATNs = new ATN[NUMBER_OF_THREADS]; - - private static readonly Parser[] sharedParsers = new Parser[NUMBER_OF_THREADS]; - private static readonly ATN[] sharedParserATNs = new ATN[NUMBER_OF_THREADS]; - - private static readonly IParseTreeListener[] sharedListeners = new IParseTreeListener[NUMBER_OF_THREADS]; - - private static int tokenCount; - private int currentPass; - - [TestMethod] - //[Ignore] - public void compileJdk() - { - string jdkSourceRoot = getSourceRoot("JDK"); - Assert.IsTrue(jdkSourceRoot != null && !string.IsNullOrEmpty(jdkSourceRoot), "The JDK_SOURCE_ROOT environment variable must be set for performance testing."); - - compileJavaParser(USE_LR_GRAMMAR); - string lexerName = "JavaLexer"; - string parserName = "JavaParser"; - string listenerName = "JavaBaseListener"; - string entryPoint = "compilationUnit"; - ParserFactory factory = getParserFactory(lexerName, parserName, listenerName, entryPoint); - - if (!string.IsNullOrEmpty(TOP_PACKAGE)) - { - jdkSourceRoot = jdkSourceRoot + '/' + TOP_PACKAGE.Replace('.', '/'); - } - - DirectoryInfo directory = new DirectoryInfo(jdkSourceRoot); - Assert.IsTrue(directory.Exists); - - IEnumerable sources = LoadSources(directory, "*.java", RECURSIVE); - - Console.Out.Write(getOptionsDescription(TOP_PACKAGE)); - - currentPass = 0; - parse1(factory, sources); - for (int i = 0; i < PASSES - 1; i++) - { - currentPass = i + 1; - if (CLEAR_DFA) - { - if (sharedLexers.Length > 0) - { - sharedLexers[0].Atn.ClearDFA(); - } - - if (sharedParsers.Length > 0) - { - sharedParsers[0].Atn.ClearDFA(); - } - - for (int j = 0; j < sharedLexers.Length; j++) - sharedLexers[j] = null; - for (int j = 0; j < sharedParsers.Length; j++) - sharedParsers[j] = null; - } - - parse2(factory, sources); - } - - sources = null; - if (PAUSE_FOR_HEAP_DUMP) - { - GC.Collect(); - Console.Out.WriteLine("Pausing before application exit."); - Thread.Sleep(4000); - } - } - - private string getSourceRoot(string prefix) - { - string sourceRoot = Environment.GetEnvironmentVariable(prefix + "_SOURCE_ROOT"); - return sourceRoot; - } - - protected override void eraseTempDir() - { - if (DELETE_TEMP_FILES) - { - base.eraseTempDir(); - } - } - - public static string getOptionsDescription(string topPackage) - { - StringBuilder builder = new StringBuilder(); - builder.Append("Input="); - if (string.IsNullOrEmpty(topPackage)) - { - builder.Append("*"); - } - else - { - builder.Append(topPackage).Append(".*"); - } - - builder.Append(", Grammar=").Append(USE_LR_GRAMMAR ? "LR" : "Standard"); - builder.Append(", ForceAtn=").Append(FORCE_ATN); - builder.Append(", Lexer:").Append(ENABLE_LEXER_DFA ? "DFA" : "ATN"); - builder.Append(", Parser:").Append(ENABLE_PARSER_DFA ? "DFA" : "ATN"); - - builder.AppendLine(); - - builder.Append("Op=Lex").Append(RUN_PARSER ? "+Parse" : " only"); - builder.Append(", Strategy=").Append(BAIL_ON_ERROR ? typeof(BailErrorStrategy).Name : typeof(DefaultErrorStrategy).Name); - builder.Append(", BuildParseTree=").Append(BUILD_PARSE_TREES); - builder.Append(", WalkBlankListener=").Append(BLANK_LISTENER); - - builder.AppendLine(); - - builder.Append("Lexer=").Append(REUSE_LEXER ? "setInputStream" : "newInstance"); - builder.Append(", Parser=").Append(REUSE_PARSER ? "setInputStream" : "newInstance"); - builder.Append(", AfterPass=").Append(CLEAR_DFA ? "newInstance" : "setInputStream"); - - builder.AppendLine(); - - builder.Append("UniqueClosure=").Append(OPTIMIZE_UNIQUE_CLOSURE ? "optimize" : "complete"); - - builder.AppendLine(); - - return builder.ToString(); - } - - /** - * This method is separate from {@link #parse2} so the first pass can be distinguished when analyzing - * profiler results. - */ - protected void parse1(ParserFactory factory, IEnumerable sources) - { - GC.Collect(); - parseSources(factory, sources); - } - - /** - * This method is separate from {@link #parse1} so the first pass can be distinguished when analyzing - * profiler results. - */ - protected void parse2(ParserFactory factory, IEnumerable sources) - { - GC.Collect(); - parseSources(factory, sources); - } - - protected IList LoadSources(DirectoryInfo directory, string filter, bool recursive) - { - IList result = new List(); - LoadSources(directory, filter, recursive, result); - return result; - } - - protected void LoadSources(DirectoryInfo directory, string filter, bool recursive, ICollection result) - { - Debug.Assert(directory.Exists); - - FileInfo[] sources = directory.GetFiles(filter, recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); - foreach (FileInfo file in sources) - { - result.Add(new InputDescriptor(file.FullName)); - } - } - - int configOutputSize = 0; - - protected void parseSources(ParserFactory factory, IEnumerable sources) - { - Stopwatch startTime = Stopwatch.StartNew(); - Thread.VolatileWrite(ref tokenCount, 0); - int sourceCount = 0; - int inputSize = 0; - -#if NET40PLUS - BlockingCollection threadIdentifiers = new BlockingCollection(); - for (int i = 0; i < NUMBER_OF_THREADS; i++) - threadIdentifiers.Add(i); - - ICollection> results = new List>(); - QueuedTaskScheduler executorServiceHost = new QueuedTaskScheduler(NUMBER_OF_THREADS); - TaskScheduler executorService = executorServiceHost.ActivateNewQueue(); -#else - ICollection> results = new List>(); -#endif - foreach (InputDescriptor inputDescriptor in sources) - { - ICharStream input = inputDescriptor.GetInputStream(); - sourceCount++; - input.Seek(0); - inputSize += input.Size; -#if NET40PLUS - Task futureChecksum = Task.Factory.StartNew(new Callable_1(input, factory, threadIdentifiers).call, CancellationToken.None, TaskCreationOptions.None, executorService); -#else - Func futureChecksum = new Callable_1(input, factory).call; -#endif - results.Add(futureChecksum); - } - - Checksum checksum = new CRC32(); - foreach (var future in results) - { -#if NET40PLUS - int value = future.Result; -#else - int value = future(); -#endif - if (COMPUTE_CHECKSUM) - { - updateChecksum(checksum, value); - } - } - -#if NET40PLUS - executorServiceHost.Dispose(); -#endif - - Console.Out.WriteLine("Total parse time for {0} files ({1} KB, {2} tokens, checksum 0x{3:X8}): {4}ms", - sourceCount, - inputSize / 1024, - Thread.VolatileRead(ref tokenCount), - COMPUTE_CHECKSUM ? checksum.Value : 0, - startTime.ElapsedMilliseconds); - - if (sharedLexers.Length > 0) - { - Lexer lexer = sharedLexers[0]; - LexerATNSimulator lexerInterpreter = lexer.Interpreter; - DFA[] modeToDFA = lexerInterpreter.atn.modeToDFA; - if (SHOW_DFA_STATE_STATS) - { - int states = 0; - int configs = 0; - HashSet uniqueConfigs = new HashSet(); - - for (int i = 0; i < modeToDFA.Length; i++) - { - DFA dfa = modeToDFA[i]; - if (dfa == null || dfa.states == null) - { - continue; - } - - states += dfa.states.Count; - foreach (DFAState state in dfa.states.Values) - { - configs += state.configs.Count; - uniqueConfigs.UnionWith(state.configs); - } - } - - Console.Out.WriteLine("There are {0} lexer DFAState instances, {1} configs ({2} unique), {3} prediction contexts.", states, configs, uniqueConfigs.Count, lexerInterpreter.atn.ContextCacheSize); - } - } - - if (RUN_PARSER && sharedParsers.Length > 0) - { - Parser parser = sharedParsers[0]; - // make sure the individual DFAState objects actually have unique ATNConfig arrays - ParserATNSimulator interpreter = parser.Interpreter; - DFA[] decisionToDFA = interpreter.atn.decisionToDFA; - - if (SHOW_DFA_STATE_STATS) - { - int states = 0; - int configs = 0; - HashSet uniqueConfigs = new HashSet(); - - for (int i = 0; i < decisionToDFA.Length; i++) - { - DFA dfa = decisionToDFA[i]; - if (dfa == null || dfa.states == null) - { - continue; - } - - states += dfa.states.Count; - foreach (DFAState state in dfa.states.Values) - { - configs += state.configs.Count; - uniqueConfigs.UnionWith(state.configs); - } - } - - Console.Out.WriteLine("There are {0} parser DFAState instances, {1} configs ({2} unique), {3} prediction contexts.", states, configs, uniqueConfigs.Count, interpreter.atn.ContextCacheSize); - } - - int localDfaCount = 0; - int globalDfaCount = 0; - int localConfigCount = 0; - int globalConfigCount = 0; - int[] contextsInDFAState = new int[0]; - - for (int i = 0; i < decisionToDFA.Length; i++) - { - DFA dfa = decisionToDFA[i]; - if (dfa == null || dfa.states == null) - { - continue; - } - - if (SHOW_CONFIG_STATS) - { - foreach (DFAState state in dfa.states.Keys) - { - if (state.configs.Count >= contextsInDFAState.Length) - { - Array.Resize(ref contextsInDFAState, state.configs.Count + 1); - } - - if (state.IsAcceptState) - { - bool hasGlobal = false; - foreach (ATNConfig config in state.configs) - { - if (config.ReachesIntoOuterContext) - { - globalConfigCount++; - hasGlobal = true; - } - else - { - localConfigCount++; - } - } - - if (hasGlobal) - { - globalDfaCount++; - } - else - { - localDfaCount++; - } - } - - contextsInDFAState[state.configs.Count]++; - } - } - - if (EXPORT_LARGEST_CONFIG_CONTEXTS) - { - foreach (DFAState state in dfa.states.Keys) - { - foreach (ATNConfig config in state.configs) - { - string configOutput = config.ToDotString(); - if (configOutput.Length <= configOutputSize) - { - continue; - } - - configOutputSize = configOutput.Length; - writeFile(tmpdir, "d" + dfa.decision + ".s" + state.stateNumber + ".a" + config.Alt + ".config.dot", configOutput); - } - } - } - } - - if (SHOW_CONFIG_STATS && currentPass == 0) - { - Console.Out.WriteLine(" DFA accept states: {0} total, {1} with only local context, {2} with a global context", localDfaCount + globalDfaCount, localDfaCount, globalDfaCount); - Console.Out.WriteLine(" Config stats: {0} total, {1} local, {2} global", localConfigCount + globalConfigCount, localConfigCount, globalConfigCount); - if (SHOW_DFA_STATE_STATS) - { - for (int i = 0; i < contextsInDFAState.Length; i++) - { - if (contextsInDFAState[i] != 0) - { - Console.Out.WriteLine(" {0} configs = {1}", i, contextsInDFAState[i]); - } - } - } - } - } - } - - private class Callable_1 - { - private readonly ICharStream input; - private readonly ParserFactory factory; -#if NET40PLUS - private readonly BlockingCollection threadNumbers; -#endif - -#if NET40PLUS - public Callable_1(ICharStream input, ParserFactory factory, BlockingCollection threadNumbers) -#else - public Callable_1(ICharStream input, ParserFactory factory) -#endif - { - this.input = input; - this.factory = factory; -#if NET40PLUS - this.threadNumbers = threadNumbers; -#endif - } - - public int call() - { - // this incurred a great deal of overhead and was causing significant variations in performance results. - //Console.Out.WriteLine("Parsing file {0}", input.getSourceName()); -#if NET40PLUS - int threadNumber = threadNumbers.Take(); -#else - int threadNumber = 0; -#endif - try - { - return factory.parseFile(input, threadNumber); - } - finally - { -#if NET40PLUS - threadNumbers.Add(threadNumber); -#endif - } - } - } - - protected void compileJavaParser(bool leftRecursive) - { - string grammarFileName = "Java.g4"; - string sourceName = leftRecursive ? "Java-LR.g4" : "Java.g4"; - string body = load(sourceName, null); - List extraOptions = new List(); - extraOptions.Add("-Werror"); - if (FORCE_ATN) - { - extraOptions.Add("-Xforce-atn"); - } - if (EXPORT_ATN_GRAPHS) - { - extraOptions.Add("-atn"); - } - if (DEBUG_TEMPLATES) - { - extraOptions.Add("-XdbgST"); - if (DEBUG_TEMPLATES_WAIT) - { - extraOptions.Add("-XdbgSTWait"); - } - } - extraOptions.Add("-visitor"); - string[] extraOptionsArray = extraOptions.ToArray(); - bool success = rawGenerateAndBuildRecognizer(grammarFileName, body, "JavaParser", "JavaLexer", true, extraOptionsArray); - Assert.IsTrue(success); - } - - protected string load(string fileName, [Nullable] Encoding encoding) - { - if (fileName == null) - { - return null; - } - - Stream stream = typeof(TestPerformance).Assembly.GetManifestResourceStream(typeof(TestPerformance), fileName); - if (encoding == null) - return new StreamReader(stream).ReadToEnd(); - else - return new StreamReader(stream, encoding).ReadToEnd(); - } - - private static void updateChecksum(Checksum checksum, int value) - { - checksum.Update((value) & 0xFF); - checksum.Update((int)((uint)value >> 8) & 0xFF); - checksum.Update((int)((uint)value >> 16) & 0xFF); - checksum.Update((int)((uint)value >> 24) & 0xFF); - } - - private static void updateChecksum(Checksum checksum, IToken token) - { - if (token == null) - { - checksum.Update(0); - return; - } - - updateChecksum(checksum, token.StartIndex); - updateChecksum(checksum, token.StopIndex); - updateChecksum(checksum, token.Line); - updateChecksum(checksum, token.Column); - updateChecksum(checksum, token.Type); - updateChecksum(checksum, token.Channel); - } - - protected ParserFactory getParserFactory(string lexerName, string parserName, string listenerName, string entryPoint) - { - Assembly loader = Assembly.LoadFile(Path.Combine(tmpdir, "Parser.dll")); - Type lexerClass = loader.GetType(lexerName); - Type parserClass = loader.GetType(parserName); - Type listenerClass = loader.GetType(listenerName); - - ConstructorInfo lexerCtor = lexerClass.GetConstructor(new Type[] { typeof(ICharStream) }); - ConstructorInfo parserCtor = parserClass.GetConstructor(new Type[] { typeof(ITokenStream) }); - - // construct initial instances of the lexer and parser to deserialize their ATNs - ITokenSource tokenSource = (ITokenSource)lexerCtor.Invoke(new object[] { new AntlrInputStream("") }); - parserCtor.Invoke(new object[] { new CommonTokenStream(tokenSource) }); - - if (!REUSE_LEXER_DFA) - { - FieldInfo lexerSerializedATNField = lexerClass.GetField("_serializedATN"); - string lexerSerializedATN = (string)lexerSerializedATNField.GetValue(null); - for (int i = 0; i < NUMBER_OF_THREADS; i++) - { - sharedLexerATNs[i] = new ATNDeserializer().Deserialize(lexerSerializedATN.ToCharArray()); - } - } - - if (RUN_PARSER && !REUSE_PARSER_DFA) - { - FieldInfo parserSerializedATNField = parserClass.GetField("_serializedATN"); - string parserSerializedATN = (string)parserSerializedATNField.GetValue(null); - for (int i = 0; i < NUMBER_OF_THREADS; i++) - { - sharedParserATNs[i] = new ATNDeserializer().Deserialize(parserSerializedATN.ToCharArray()); - } - } - - return new ParserFactory_1(listenerClass, parserClass, lexerCtor, parserCtor, entryPoint); - } - - private class ParserFactory_1 : ParserFactory - { - private readonly Type listenerClass; - private readonly Type parserClass; - - private readonly ConstructorInfo lexerCtor; - private readonly ConstructorInfo parserCtor; - - private readonly string entryPoint; - - public ParserFactory_1(Type listenerClass, Type parserClass, ConstructorInfo lexerCtor, ConstructorInfo parserCtor, string entryPoint) - { - this.listenerClass = listenerClass; - this.parserClass = parserClass; - this.lexerCtor = lexerCtor; - this.parserCtor = parserCtor; - this.entryPoint = entryPoint; - } - - public int parseFile(ICharStream input, int thread) - { - Checksum checksum = new CRC32(); - - Debug.Assert(thread >= 0 && thread < NUMBER_OF_THREADS); - - try - { - IParseTreeListener listener = sharedListeners[thread]; - if (listener == null) - { - listener = (IParseTreeListener)Activator.CreateInstance(listenerClass); - sharedListeners[thread] = listener; - } - - Lexer lexer = sharedLexers[thread]; - if (REUSE_LEXER && lexer != null) - { - lexer.SetInputStream(input); - } - else - { - lexer = (Lexer)lexerCtor.Invoke(new object[] { input }); - sharedLexers[thread] = lexer; - if (!ENABLE_LEXER_DFA) - { - lexer.Interpreter = new NonCachingLexerATNSimulator(lexer, lexer.Atn); - } - else if (!REUSE_LEXER_DFA) - { - lexer.Interpreter = new LexerATNSimulator(lexer, sharedLexerATNs[thread]); - } - } - - lexer.Interpreter.optimize_tail_calls = OPTIMIZE_TAIL_CALLS; - if (ENABLE_LEXER_DFA && !REUSE_LEXER_DFA) - { - lexer.Interpreter.atn.ClearDFA(); - } - - CommonTokenStream tokens = new CommonTokenStream(lexer); - tokens.Fill(); - Interlocked.Add(ref tokenCount, tokens.Size); - - if (COMPUTE_CHECKSUM) - { - foreach (IToken token in tokens.GetTokens()) - { - updateChecksum(checksum, token); - } - } - - if (!RUN_PARSER) - { - return (int)checksum.Value; - } - - Parser parser = sharedParsers[thread]; - if (REUSE_PARSER && parser != null) - { - parser.SetInputStream(tokens); - } - else - { - Parser newParser = (Parser)parserCtor.Invoke(new object[] { tokens }); - parser = newParser; - sharedParsers[thread] = parser; - } - - parser.RemoveErrorListeners(); - if (!TWO_STAGE_PARSING) - { - parser.AddErrorListener(DescriptiveErrorListener.INSTANCE); - parser.AddErrorListener(new SummarizingDiagnosticErrorListener()); - } - - if (!ENABLE_PARSER_DFA) - { - parser.Interpreter = new NonCachingParserATNSimulator(parser, parser.Atn); - } - else if (!REUSE_PARSER_DFA) - { - parser.Interpreter = new ParserATNSimulator(parser, sharedParserATNs[thread]); - } - - if (ENABLE_PARSER_DFA && !REUSE_PARSER_DFA) - { - parser.Interpreter.atn.ClearDFA(); - } - - parser.Interpreter.PredictionMode = TWO_STAGE_PARSING ? PredictionMode.Sll : PREDICTION_MODE; - parser.Interpreter.force_global_context = FORCE_GLOBAL_CONTEXT && !TWO_STAGE_PARSING; - parser.Interpreter.always_try_local_context = TRY_LOCAL_CONTEXT_FIRST || TWO_STAGE_PARSING; - parser.Interpreter.optimize_ll1 = OPTIMIZE_LL1; - parser.Interpreter.optimize_unique_closure = OPTIMIZE_UNIQUE_CLOSURE; - parser.Interpreter.optimize_tail_calls = OPTIMIZE_TAIL_CALLS; - parser.Interpreter.tail_call_preserves_sll = TAIL_CALL_PRESERVES_SLL; - parser.Interpreter.treat_sllk1_conflict_as_ambiguity = TREAT_SLLK1_CONFLICT_AS_AMBIGUITY; - parser.BuildParseTree = BUILD_PARSE_TREES; - if (!BUILD_PARSE_TREES && BLANK_LISTENER) - { - parser.AddParseListener(listener); - } - if (BAIL_ON_ERROR || TWO_STAGE_PARSING) - { - parser.ErrorHandler = new BailErrorStrategy(); - } - - MethodInfo parseMethod = parserClass.GetMethod(entryPoint); - object parseResult; - - IParseTreeListener checksumParserListener = null; - - try - { - if (COMPUTE_CHECKSUM) - { - checksumParserListener = new ChecksumParseTreeListener(checksum); - parser.AddParseListener(checksumParserListener); - } - parseResult = parseMethod.Invoke(parser, null); - } - catch (TargetInvocationException ex) - { - if (!TWO_STAGE_PARSING) - { - throw; - } - - string sourceName = tokens.SourceName; - sourceName = !string.IsNullOrEmpty(sourceName) ? sourceName + ": " : ""; - Console.Error.WriteLine(sourceName + "Forced to retry with full context."); - - if (!(ex.InnerException is ParseCanceledException)) - { - throw; - } - - tokens.Reset(); - if (REUSE_PARSER && sharedParsers[thread] != null) - { - parser.SetInputStream(tokens); - } - else - { - Parser newParser = (Parser)parserCtor.Invoke(new object[] { tokens }); - parser = newParser; - sharedParsers[thread] = parser; - } - - parser.RemoveErrorListeners(); - parser.AddErrorListener(DescriptiveErrorListener.INSTANCE); - parser.AddErrorListener(new SummarizingDiagnosticErrorListener()); - if (!ENABLE_PARSER_DFA) - { - parser.Interpreter = new NonCachingParserATNSimulator(parser, parser.Atn); - } - parser.Interpreter.PredictionMode = PREDICTION_MODE; - parser.Interpreter.force_global_context = FORCE_GLOBAL_CONTEXT; - parser.Interpreter.always_try_local_context = TRY_LOCAL_CONTEXT_FIRST; - parser.Interpreter.optimize_ll1 = OPTIMIZE_LL1; - parser.Interpreter.optimize_unique_closure = OPTIMIZE_UNIQUE_CLOSURE; - parser.Interpreter.optimize_tail_calls = OPTIMIZE_TAIL_CALLS; - parser.Interpreter.tail_call_preserves_sll = TAIL_CALL_PRESERVES_SLL; - parser.Interpreter.treat_sllk1_conflict_as_ambiguity = TREAT_SLLK1_CONFLICT_AS_AMBIGUITY; - parser.BuildParseTree = BUILD_PARSE_TREES; - if (!BUILD_PARSE_TREES && BLANK_LISTENER) - { - parser.AddParseListener(listener); - } - if (BAIL_ON_ERROR) - { - parser.ErrorHandler = new BailErrorStrategy(); - } - - parseResult = parseMethod.Invoke(parser, null); - } - finally - { - if (checksumParserListener != null) - { - parser.RemoveParseListener(checksumParserListener); - } - } - - Assert.IsInstanceOfType(parseResult, typeof(IParseTree)); - if (BUILD_PARSE_TREES && BLANK_LISTENER) - { - ParseTreeWalker.Default.Walk(listener, (ParserRuleContext)parseResult); - } - } - catch (Exception e) - { - if (!REPORT_SYNTAX_ERRORS && e is ParseCanceledException) - { - return (int)checksum.Value; - } - - throw; - } - - return (int)checksum.Value; - } - } - - protected interface ParserFactory - { - int parseFile(ICharStream input, int thread); - } - - private class DescriptiveErrorListener : BaseErrorListener - { - public static DescriptiveErrorListener INSTANCE = new DescriptiveErrorListener(); - - public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e) - { - if (!REPORT_SYNTAX_ERRORS) - { - return; - } - - string sourceName = recognizer.InputStream.SourceName; - if (!string.IsNullOrEmpty(sourceName)) - { - sourceName = string.Format("{0}:{1}:{2}: ", sourceName, line, charPositionInLine); - } - - Console.Error.WriteLine(sourceName + "line " + line + ":" + charPositionInLine + " " + msg); - } - } - - private class SummarizingDiagnosticErrorListener : DiagnosticErrorListener - { - public override void ReportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, bool exact, BitSet ambigAlts, ATNConfigSet configs) - { - if (!REPORT_AMBIGUITIES) - { - return; - } - - base.ReportAmbiguity(recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs); - } - - public override void ReportAttemptingFullContext(Parser recognizer, DFA dfa, int startIndex, int stopIndex, BitSet conflictingAlts, SimulatorState initialState) - { - if (!REPORT_FULL_CONTEXT) - { - return; - } - - base.ReportAttemptingFullContext(recognizer, dfa, startIndex, stopIndex, conflictingAlts, initialState); - } - - public override void ReportContextSensitivity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, int prediction, SimulatorState acceptState) - { - if (!REPORT_CONTEXT_SENSITIVITY) - { - return; - } - - base.ReportContextSensitivity(recognizer, dfa, startIndex, stopIndex, prediction, acceptState); - } - - protected override string GetDecisionDescription(Parser recognizer, DFA dfa) - { - string format = "{0}({1})"; - string ruleName = recognizer.RuleNames[recognizer.Atn.decisionToState[dfa.decision].ruleIndex]; - return string.Format(format, dfa.decision, ruleName); - } - } - - protected class NonCachingLexerATNSimulator : LexerATNSimulator - { - public NonCachingLexerATNSimulator(Lexer recog, ATN atn) - : base(recog, atn) - { - } - - protected override DFAState AddDFAState(ATNConfigSet configs) - { - return null; - } - } - - protected class NonCachingParserATNSimulator : ParserATNSimulator - { - private static readonly EmptyEdgeMap emptyMap = new EmptyEdgeMap(-1, -1); - - public NonCachingParserATNSimulator(Parser parser, ATN atn) - : base(parser, atn) - { - } - - [return: NotNull] - protected override DFAState CreateDFAState([NotNull] DFA dfa, [NotNull] ATNConfigSet configs) - { - return new DFAState(emptyMap, dfa.EmptyContextEdgeMap, configs); - } - } - - internal class ChecksumParseTreeListener : IParseTreeListener - { - private const int VISIT_TERMINAL = 1; - private const int VISIT_ERROR_NODE = 2; - private const int ENTER_RULE = 3; - private const int EXIT_RULE = 4; - - private readonly Checksum checksum; - - public ChecksumParseTreeListener(Checksum checksum) - { - this.checksum = checksum; - } - - public void VisitTerminal(ITerminalNode node) - { - checksum.Update(VISIT_TERMINAL); - updateChecksum(checksum, node.Symbol); - } - - public void VisitErrorNode(IErrorNode node) - { - checksum.Update(VISIT_ERROR_NODE); - updateChecksum(checksum, node.Symbol); - } - - public void EnterEveryRule(ParserRuleContext ctx) - { - checksum.Update(ENTER_RULE); - updateChecksum(checksum, ctx.RuleIndex); - updateChecksum(checksum, ctx.Start); - } - - public void ExitEveryRule(ParserRuleContext ctx) - { - checksum.Update(EXIT_RULE); - updateChecksum(checksum, ctx.RuleIndex); - updateChecksum(checksum, ctx.Stop); - } - } - - protected sealed class InputDescriptor - { - private readonly string source; - private WeakReference inputStream; - private CloneableAntlrFileStream strongInputStream; - - public InputDescriptor([NotNull] String source) - { - this.source = source; - if (PRELOAD_SOURCES) - { - GetInputStream(); - } - } - - [return: NotNull] - public ICharStream GetInputStream() - { - CloneableAntlrFileStream stream; - if (!TryGetTarget(out stream)) - { - stream = new CloneableAntlrFileStream(source, ENCODING); - SetTarget(stream); - } - - return new JavaUnicodeInputStream(stream.CreateCopy()); - } - - private void SetTarget(CloneableAntlrFileStream stream) - { - if (PRELOAD_SOURCES) - { - strongInputStream = stream; - } - else - { - inputStream = new WeakReference(stream); - } - } - - private bool TryGetTarget(out CloneableAntlrFileStream stream) - { - if (PRELOAD_SOURCES) - { - stream = strongInputStream; - return strongInputStream != null; - } - else - { - if (inputStream == null) - { - stream = null; - return false; - } - - return inputStream.TryGetTarget(out stream); - } - } - } - -#if PORTABLE - protected class CloneableAntlrFileStream : AntlrInputStream -#else - protected class CloneableAntlrFileStream : AntlrFileStream -#endif - { - public CloneableAntlrFileStream(String fileName, Encoding encoding) -#if PORTABLE - : base(File.ReadAllText(fileName, encoding)) -#else - : base(fileName, encoding) -#endif - { - } - - public AntlrInputStream CreateCopy() - { - AntlrInputStream stream = new AntlrInputStream(this.data, this.n); - stream.name = this.SourceName; - return stream; - } - } - -#if !NET45 - private sealed class WeakReference - where T : class - { - private readonly WeakReference _reference; - - public WeakReference(T reference) - { - _reference = new WeakReference(reference); - } - - public bool TryGetTarget(out T reference) - { - reference = (T)_reference.Target; - return reference != null; - } - } -#endif - } -} diff --git a/runtime/CSharp/Antlr4.Runtime.Test/TestingKey.snk b/runtime/CSharp/Antlr4.Runtime.Test/TestingKey.snk deleted file mode 100644 index 7d54a3e2b06ebfcbaedeba41dce8ef5c0d91e02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa5009806okYj!PaRmGhQSHsU5q!C;b?)t=7KU zV8rX|O7*9IFvnvnDY zBxueSt6$O8XJ6w>N<%`TLdIUtL2cI{FfbuXC$&Kmj~N(_D5GEssPJvG?Z=ENKKx#%a1hqzvsA z)o{d~C5(|QWmRq#;j;)y)~Cg6U?0N)4yR5K^FTCWO-3CnR^E$0WY5~x7ZMb!pCU#L z>NLT5zRwJr;2~n8zV*{U z3QEu7x2x)8AaP$1xKLgVB@ZZ6kn(pI#p-)XwT i6NZ`&mG2?^v=1S|RSO(x5|UdsubEKBmYii)_^}PVm>4_& diff --git a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net20.config b/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net20.config deleted file mode 100644 index ba2302468..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net20.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net30.config b/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net30.config deleted file mode 100644 index 553a3b3e6..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net30.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net35-client.config b/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net35-client.config deleted file mode 100644 index be6a59602..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net35-client.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net40-client.config b/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net40-client.config deleted file mode 100644 index 9d7ab9386..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net40-client.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net45.config b/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net45.config deleted file mode 100644 index 475fe0d0c..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.net45.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.portable-net40.config b/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.portable-net40.config deleted file mode 100644 index 79cfba0a1..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.portable-net40.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.portable-net45.config b/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.portable-net45.config deleted file mode 100644 index 39d4c91d2..000000000 --- a/runtime/CSharp/Antlr4.Runtime.Test/packages.Antlr4.Runtime.Test.portable-net45.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net30.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net30.csproj deleted file mode 100644 index 9fa40db8b..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net30.csproj +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - Debug - AnyCPU - {EBBDCC35-43CC-416C-860B-9FC115F1EB42} - Library - Properties - Antlr4.Runtime - Antlr4.Runtime - v3.0 - 512 - obj\net30\ - ..\ - true - - - true - full - false - bin\net30\Debug\ - $(OutputPath)$(AssemblyName).xml - DEBUG;TRACE;NET30;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - pdbonly - true - bin\net30\Release\ - $(OutputPath)$(AssemblyName).xml - TRACE;NET30;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-net30.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - antlr-net30.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net35-cf.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net35-cf.csproj deleted file mode 100644 index ec3a282b8..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net35-cf.csproj +++ /dev/null @@ -1,293 +0,0 @@ - - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {C5F9C476-200F-4440-9524-C5C3F9BE16D7} - Library - Properties - Antlr4.Runtime - Antlr4.Runtime - {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - WindowsCE - E2BECB1F-8C8C-41ba-B736-9BE7D946A398 - 5.0 - Antlr4.Runtime.net35-cf - v3.5 - Windows CE - - - 512 - obj\net35-cf\ - ..\ - true - - - true - full - false - bin\net35-cf\Debug\ - $(OutputPath)\$(AssemblyName).xml - DEBUG;TRACE;$(PlatformFamilyName);COMPACT;NET35;NET35PLUS;NET30PLUS;NET20PLUS - true - true - prompt - 4 - true - Off - 1591 - - - pdbonly - true - bin\net35-cf\Release\ - $(OutputPath)\$(AssemblyName).xml - TRACE;$(PlatformFamilyName);COMPACT;NET35;NET35PLUS;NET30PLUS;NET20PLUS - true - true - prompt - 4 - true - Off - 1591 - - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-net35-cf.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - antlr-net35-cf.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net35-client.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net35-client.csproj deleted file mode 100644 index c0c4feb9a..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net35-client.csproj +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - Debug - AnyCPU - {E186FDA3-1411-47EE-94C7-9F3745F0474B} - Library - Properties - Antlr4.Runtime - Antlr4.Runtime - v3.5 - Client - 512 - obj\net35-client\ - ..\ - true - - - true - full - false - bin\net35-client\Debug\ - $(OutputPath)$(AssemblyName).xml - DEBUG;TRACE;NET35;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - pdbonly - true - bin\net35-client\Release\ - $(OutputPath)$(AssemblyName).xml - TRACE;NET35;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-net35-client.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - antlr-net35-client.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net40-client.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net40-client.csproj deleted file mode 100644 index 4fa768730..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net40-client.csproj +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - Debug - AnyCPU - {423978DF-85A4-409E-A16C-453683FE3969} - Library - Properties - Antlr4.Runtime - Antlr4.Runtime - v4.0 - Client - 512 - obj\net40-client\ - ..\ - true - - - true - full - false - bin\net40-client\Debug\ - $(OutputPath)$(AssemblyName).xml - TRACE;DEBUG;NET40;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - pdbonly - true - bin\net40-client\Release\ - $(OutputPath)$(AssemblyName).xml - TRACE;NET40;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-net40-client.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - antlr-net40-client.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net45.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net45.csproj deleted file mode 100644 index 63a906833..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net45.csproj +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - Debug - AnyCPU - {E1D192DE-5347-48C4-A9F4-A8CBA2AF3869} - Library - Properties - Antlr4.Runtime - Antlr4.Runtime - v4.5 - 512 - obj\net45\ - ..\ - true - - - true - full - false - bin\net45\Debug\ - $(OutputPath)$(AssemblyName).xml - TRACE;DEBUG;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - pdbonly - true - bin\net45\Release\ - $(OutputPath)$(AssemblyName).xml - TRACE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-net45.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - antlr-net45.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.netcore45.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.netcore45.csproj deleted file mode 100644 index 71dd360a1..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.netcore45.csproj +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - Debug - AnyCPU - {F3145DCA-EA26-4482-80D6-5232A79E2A3A} - {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - Antlr4.Runtime - Antlr4.Runtime - 512 - obj\netcore45\ - ..\ - true - - - true - full - false - bin\netcore45\Debug\ - $(OutputPath)$(AssemblyName).xml - TRACE;DEBUG;WINRT;PORTABLE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - pdbonly - true - bin\netcore45\Release\ - $(OutputPath)$(AssemblyName).xml - TRACE;WINRT;PORTABLE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-netcore45.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - antlr-netcore45.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.portable-net40.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.portable-net40.csproj deleted file mode 100644 index 482c3f86a..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.portable-net40.csproj +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - 10.0 - Debug - AnyCPU - {06C182C5-095C-4D43-9C33-C87E305C6BC2} - Library - Properties - Antlr4.Runtime - Antlr4.Runtime - v4.0 - Profile328 - 512 - obj\portable-net40\ - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - ..\ - true - - - true - full - false - bin\portable-net40\Debug\ - $(OutputPath)$(AssemblyName).xml - TRACE;DEBUG;PORTABLE;NET40;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - pdbonly - true - bin\portable-net40\Release\ - $(OutputPath)$(AssemblyName).xml - TRACE;PORTABLE;NET40;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-portable-net40.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - antlr-portable-net40.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.portable-net45.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.portable-net45.csproj deleted file mode 100644 index 4ceae4dd0..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.portable-net45.csproj +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - 11.0 - Debug - AnyCPU - {12269283-EE92-4FAA-B849-53CD24F341FA} - Library - Properties - Antlr4.Runtime - Antlr4.Runtime - v4.5 - Profile259 - 512 - obj\portable-net45\ - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - ..\ - true - - - true - full - false - bin\portable-net45\Debug\ - $(OutputPath)$(AssemblyName).xml - TRACE;DEBUG;PORTABLE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - pdbonly - true - bin\portable-net45\Release\ - $(OutputPath)$(AssemblyName).xml - TRACE;PORTABLE;NET45;NET45PLUS;NET40PLUS;NET35PLUS;NET30PLUS;NET20PLUS - prompt - 4 - 1591 - - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-portable-net45.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - antlr-portable-net45.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net20.csproj b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.vs2013.csproj similarity index 83% rename from runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net20.csproj rename to runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.vs2013.csproj index e36e5000d..aaa0562dd 100644 --- a/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.net20.csproj +++ b/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.vs2013.csproj @@ -1,6 +1,5 @@  - Debug @@ -15,6 +14,7 @@ obj\net20\ ..\ true + true @@ -37,15 +37,8 @@ 4 1591 - - true - - - ..\..\..\..\..\..\keys\antlr\antlr-net20.snk - - @@ -64,8 +57,9 @@ + + - @@ -164,9 +158,6 @@ - - antlr-net20.snk - @@ -190,7 +181,6 @@ - @@ -248,29 +238,6 @@ - - - MSBuild:Compile - Antlr4.Runtime.Tree.Xpath - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/Atn/ATNSerializer.cs b/runtime/CSharp/Antlr4.Runtime/Atn/ATNSerializer.cs deleted file mode 100644 index 97672cb16..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Atn/ATNSerializer.cs +++ /dev/null @@ -1,720 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text; -using Antlr4.Runtime.Atn; -using Antlr4.Runtime.Misc; -using Antlr4.Runtime.Sharpen; - -namespace Antlr4.Runtime.Atn -{ - public class ATNSerializer - { - public ATN atn; - - private IList ruleNames; - - private IList tokenNames; - - public ATNSerializer(ATN atn, IList ruleNames) - { - System.Diagnostics.Debug.Assert(atn.grammarType != null); - this.atn = atn; - this.ruleNames = ruleNames; - } - - public ATNSerializer(ATN atn, IList ruleNames, IList tokenNames) - { - System.Diagnostics.Debug.Assert(atn.grammarType != null); - this.atn = atn; - this.ruleNames = ruleNames; - this.tokenNames = tokenNames; - } - - /// - /// Serialize state descriptors, edge descriptors, and decision→state map - /// into list of ints: - /// grammar-type, (ANTLRParser.LEXER, ...) - /// max token type, - /// num states, - /// state-0-type ruleIndex, state-1-type ruleIndex, ... - /// - /// - /// Serialize state descriptors, edge descriptors, and decision→state map - /// into list of ints: - /// grammar-type, (ANTLRParser.LEXER, ...) - /// max token type, - /// num states, - /// state-0-type ruleIndex, state-1-type ruleIndex, ... state-i-type ruleIndex optional-arg ... - /// num rules, - /// rule-1-start-state rule-1-args, rule-2-start-state rule-2-args, ... - /// (args are token type,actionIndex in lexer else 0,0) - /// num modes, - /// mode-0-start-state, mode-1-start-state, ... (parser has 0 modes) - /// num sets - /// set-0-interval-count intervals, set-1-interval-count intervals, ... - /// num total edges, - /// src, trg, edge-type, edge arg1, optional edge arg2 (present always), ... - /// num decisions, - /// decision-0-start-state, decision-1-start-state, ... - /// Convenient to pack into unsigned shorts to make as Java string. - /// - public virtual List Serialize() - { - List data = new List(); - data.Add(ATNDeserializer.SerializedVersion); - SerializeUUID(data, ATNDeserializer.SerializedUuid); - // convert grammar type to ATN const to avoid dependence on ANTLRParser - data.Add((int)(atn.grammarType)); - data.Add(atn.maxTokenType); - int nedges = 0; - IDictionary setIndices = new Dictionary(); - IList sets = new List(); - // dump states, count edges and collect sets while doing so - List nonGreedyStates = new List(); - List sllStates = new List(); - List precedenceStates = new List(); - data.Add(atn.states.Count); - foreach (ATNState s in atn.states) - { - if (s == null) - { - // might be optimized away - data.Add((int)(StateType.InvalidType)); - continue; - } - StateType stateType = s.StateType; - if (s is DecisionState) - { - DecisionState decisionState = (DecisionState)s; - if (decisionState.nonGreedy) - { - nonGreedyStates.Add(s.stateNumber); - } - if (decisionState.sll) - { - sllStates.Add(s.stateNumber); - } - } - if (s is RuleStartState && ((RuleStartState)s).isPrecedenceRule) - { - precedenceStates.Add(s.stateNumber); - } - data.Add((int)(stateType)); - if (s.ruleIndex == -1) - { - data.Add(char.MaxValue); - } - else - { - data.Add(s.ruleIndex); - } - if (s.StateType == StateType.LoopEnd) - { - data.Add(((LoopEndState)s).loopBackState.stateNumber); - } - else - { - if (s is BlockStartState) - { - data.Add(((BlockStartState)s).endState.stateNumber); - } - } - if (s.StateType != StateType.RuleStop) - { - // the deserializer can trivially derive these edges, so there's no need to serialize them - nedges += s.NumberOfTransitions; - } - for (int i = 0; i < s.NumberOfTransitions; i++) - { - Transition t = s.Transition(i); - TransitionType edgeType = Transition.serializationTypes.Get(t.GetType()); - if (edgeType == TransitionType.Set || edgeType == TransitionType.NotSet) - { - SetTransition st = (SetTransition)t; - if (!setIndices.ContainsKey(st.set)) - { - sets.Add(st.set); - setIndices.Put(st.set, sets.Count - 1); - } - } - } - } - // non-greedy states - data.Add(nonGreedyStates.Size()); - for (int i_1 = 0; i_1 < nonGreedyStates.Size(); i_1++) - { - data.Add(nonGreedyStates.Get(i_1)); - } - // SLL decisions - data.Add(sllStates.Size()); - for (int i_2 = 0; i_2 < sllStates.Size(); i_2++) - { - data.Add(sllStates.Get(i_2)); - } - // precedence states - data.Add(precedenceStates.Size()); - for (int i_3 = 0; i_3 < precedenceStates.Size(); i_3++) - { - data.Add(precedenceStates.Get(i_3)); - } - int nrules = atn.ruleToStartState.Length; - data.Add(nrules); - for (int r = 0; r < nrules; r++) - { - ATNState ruleStartState = atn.ruleToStartState[r]; - data.Add(ruleStartState.stateNumber); - bool leftFactored = ruleNames[ruleStartState.ruleIndex].IndexOf(ATNSimulator.RuleVariantDelimiter) >= 0; - data.Add(leftFactored ? 1 : 0); - if (atn.grammarType == ATNType.Lexer) - { - if (atn.ruleToTokenType[r] == TokenConstants.Eof) - { - data.Add(char.MaxValue); - } - else - { - data.Add(atn.ruleToTokenType[r]); - } - } - } - int nmodes = atn.modeToStartState.Count; - data.Add(nmodes); - if (nmodes > 0) - { - foreach (ATNState modeStartState in atn.modeToStartState) - { - data.Add(modeStartState.stateNumber); - } - } - int nsets = sets.Count; - data.Add(nsets); - foreach (IntervalSet set in sets) - { - bool containsEof = set.Contains(TokenConstants.Eof); - if (containsEof && set.GetIntervals()[0].b == TokenConstants.Eof) - { - data.Add(set.GetIntervals().Count - 1); - } - else - { - data.Add(set.GetIntervals().Count); - } - data.Add(containsEof ? 1 : 0); - foreach (Interval I in set.GetIntervals()) - { - if (I.a == TokenConstants.Eof) - { - if (I.b == TokenConstants.Eof) - { - continue; - } - else - { - data.Add(0); - } - } - else - { - data.Add(I.a); - } - data.Add(I.b); - } - } - data.Add(nedges); - foreach (ATNState s_1 in atn.states) - { - if (s_1 == null) - { - // might be optimized away - continue; - } - if (s_1.StateType == StateType.RuleStop) - { - continue; - } - for (int i = 0; i_3 < s_1.NumberOfTransitions; i_3++) - { - Transition t = s_1.Transition(i_3); - if (atn.states[t.target.stateNumber] == null) - { - throw new InvalidOperationException("Cannot serialize a transition to a removed state."); - } - int src = s_1.stateNumber; - int trg = t.target.stateNumber; - TransitionType edgeType = Transition.serializationTypes.Get(t.GetType()); - int arg1 = 0; - int arg2 = 0; - int arg3 = 0; - switch (edgeType) - { - case TransitionType.Rule: - { - trg = ((RuleTransition)t).followState.stateNumber; - arg1 = ((RuleTransition)t).target.stateNumber; - arg2 = ((RuleTransition)t).ruleIndex; - arg3 = ((RuleTransition)t).precedence; - break; - } - - case TransitionType.Precedence: - { - PrecedencePredicateTransition ppt = (PrecedencePredicateTransition)t; - arg1 = ppt.precedence; - break; - } - - case TransitionType.Predicate: - { - PredicateTransition pt = (PredicateTransition)t; - arg1 = pt.ruleIndex; - arg2 = pt.predIndex; - arg3 = pt.isCtxDependent ? 1 : 0; - break; - } - - case TransitionType.Range: - { - arg1 = ((RangeTransition)t).from; - arg2 = ((RangeTransition)t).to; - if (arg1 == TokenConstants.Eof) - { - arg1 = 0; - arg3 = 1; - } - break; - } - - case TransitionType.Atom: - { - arg1 = ((AtomTransition)t).label; - if (arg1 == TokenConstants.Eof) - { - arg1 = 0; - arg3 = 1; - } - break; - } - - case TransitionType.Action: - { - ActionTransition at = (ActionTransition)t; - arg1 = at.ruleIndex; - arg2 = at.actionIndex; - if (arg2 == -1) - { - arg2 = unchecked((int)(0xFFFF)); - } - arg3 = at.isCtxDependent ? 1 : 0; - break; - } - - case TransitionType.Set: - { - arg1 = setIndices.Get(((SetTransition)t).set); - break; - } - - case TransitionType.NotSet: - { - arg1 = setIndices.Get(((SetTransition)t).set); - break; - } - - case TransitionType.Wildcard: - { - break; - } - } - data.Add(src); - data.Add(trg); - data.Add((int)(edgeType)); - data.Add(arg1); - data.Add(arg2); - data.Add(arg3); - } - } - int ndecisions = atn.decisionToState.Count; - data.Add(ndecisions); - foreach (DecisionState decStartState in atn.decisionToState) - { - data.Add(decStartState.stateNumber); - } - // - // LEXER ACTIONS - // - if (atn.grammarType == ATNType.Lexer) - { - data.Add(atn.lexerActions.Length); - foreach (ILexerAction action in atn.lexerActions) - { - data.Add((int)(action.ActionType)); - switch (action.ActionType) - { - case LexerActionType.Channel: - { - int channel = ((LexerChannelAction)action).Channel; - data.Add(channel != -1 ? channel : unchecked((int)(0xFFFF))); - data.Add(0); - break; - } - - case LexerActionType.Custom: - { - int ruleIndex = ((LexerCustomAction)action).RuleIndex; - int actionIndex = ((LexerCustomAction)action).ActionIndex; - data.Add(ruleIndex != -1 ? ruleIndex : unchecked((int)(0xFFFF))); - data.Add(actionIndex != -1 ? actionIndex : unchecked((int)(0xFFFF))); - break; - } - - case LexerActionType.Mode: - { - int mode = ((LexerModeAction)action).Mode; - data.Add(mode != -1 ? mode : unchecked((int)(0xFFFF))); - data.Add(0); - break; - } - - case LexerActionType.More: - { - data.Add(0); - data.Add(0); - break; - } - - case LexerActionType.PopMode: - { - data.Add(0); - data.Add(0); - break; - } - - case LexerActionType.PushMode: - { - mode = ((LexerPushModeAction)action).Mode; - data.Add(mode != -1 ? mode : unchecked((int)(0xFFFF))); - data.Add(0); - break; - } - - case LexerActionType.Skip: - { - data.Add(0); - data.Add(0); - break; - } - - case LexerActionType.Type: - { - int type = ((LexerTypeAction)action).Type; - data.Add(type != -1 ? type : unchecked((int)(0xFFFF))); - data.Add(0); - break; - } - - default: - { - string message = string.Format(CultureInfo.CurrentCulture, "The specified lexer action type {0} is not valid.", action.ActionType); - throw new ArgumentException(message); - } - } - } - } - // don't adjust the first value since that's the version number - for (int i_4 = 1; i_4 < data.Size(); i_4++) - { - if (data.Get(i_4) < char.MinValue || data.Get(i_4) > char.MaxValue) - { - throw new NotSupportedException("Serialized ATN data element out of range."); - } - int value = (data.Get(i_4) + 2) & unchecked((int)(0xFFFF)); - data.Set(i_4, value); - } - return data; - } - - public virtual string Decode(char[] data) - { - data = data.Clone(); - // don't adjust the first value since that's the version number - for (int i = 1; i < data.Length; i++) - { - data[i] = (char)(data[i] - 2); - } - StringBuilder buf = new StringBuilder(); - int p = 0; - int version = ATNDeserializer.ToInt(data[p++]); - if (version != ATNDeserializer.SerializedVersion) - { - string reason = string.Format("Could not deserialize ATN with version {0} (expected {1}).", version, ATNDeserializer.SerializedVersion); - throw new NotSupportedException(new InvalidClassException(typeof(ATN).FullName, reason)); - } - Guid uuid = ATNDeserializer.ToUUID(data, p); - p += 8; - if (!uuid.Equals(ATNDeserializer.SerializedUuid)) - { - string reason = string.Format(CultureInfo.CurrentCulture, "Could not deserialize ATN with UUID {0} (expected {1}).", uuid, ATNDeserializer.SerializedUuid); - throw new NotSupportedException(new InvalidClassException(typeof(ATN).FullName, reason)); - } - p++; - // skip grammarType - int maxType = ATNDeserializer.ToInt(data[p++]); - buf.Append("max type ").Append(maxType).Append("\n"); - int nstates = ATNDeserializer.ToInt(data[p++]); - for (int i_1 = 0; i_1 < nstates; i_1++) - { - StateType stype = StateType.Values()[ATNDeserializer.ToInt(data[p++])]; - if (stype == StateType.InvalidType) - { - continue; - } - // ignore bad type of states - int ruleIndex = ATNDeserializer.ToInt(data[p++]); - if (ruleIndex == char.MaxValue) - { - ruleIndex = -1; - } - string arg = string.Empty; - if (stype == StateType.LoopEnd) - { - int loopBackStateNumber = ATNDeserializer.ToInt(data[p++]); - arg = " " + loopBackStateNumber; - } - else - { - if (stype == StateType.PlusBlockStart || stype == StateType.StarBlockStart || stype == StateType.BlockStart) - { - int endStateNumber = ATNDeserializer.ToInt(data[p++]); - arg = " " + endStateNumber; - } - } - buf.Append(i_1).Append(":").Append(ATNState.serializationNames[(int)(stype)]).Append(" ").Append(ruleIndex).Append(arg).Append("\n"); - } - int numNonGreedyStates = ATNDeserializer.ToInt(data[p++]); - for (int i_2 = 0; i_2 < numNonGreedyStates; i_2++) - { - int stateNumber = ATNDeserializer.ToInt(data[p++]); - } - int numSllStates = ATNDeserializer.ToInt(data[p++]); - for (int i_3 = 0; i_3 < numSllStates; i_3++) - { - int stateNumber = ATNDeserializer.ToInt(data[p++]); - } - int numPrecedenceStates = ATNDeserializer.ToInt(data[p++]); - for (int i_4 = 0; i_4 < numPrecedenceStates; i_4++) - { - int stateNumber = ATNDeserializer.ToInt(data[p++]); - } - int nrules = ATNDeserializer.ToInt(data[p++]); - for (int i_5 = 0; i_5 < nrules; i_5++) - { - int s = ATNDeserializer.ToInt(data[p++]); - bool leftFactored = ATNDeserializer.ToInt(data[p++]) != 0; - if (atn.grammarType == ATNType.Lexer) - { - int arg1 = ATNDeserializer.ToInt(data[p++]); - buf.Append("rule ").Append(i_5).Append(":").Append(s).Append(" ").Append(arg1).Append('\n'); - } - else - { - buf.Append("rule ").Append(i_5).Append(":").Append(s).Append('\n'); - } - } - int nmodes = ATNDeserializer.ToInt(data[p++]); - for (int i_6 = 0; i_6 < nmodes; i_6++) - { - int s = ATNDeserializer.ToInt(data[p++]); - buf.Append("mode ").Append(i_6).Append(":").Append(s).Append('\n'); - } - int nsets = ATNDeserializer.ToInt(data[p++]); - for (int i_7 = 0; i_7 < nsets; i_7++) - { - int nintervals = ATNDeserializer.ToInt(data[p++]); - buf.Append(i_7).Append(":"); - bool containsEof = data[p++] != 0; - if (containsEof) - { - buf.Append(GetTokenName(TokenConstants.Eof)); - } - for (int j = 0; j < nintervals; j++) - { - if (containsEof || j > 0) - { - buf.Append(", "); - } - buf.Append(GetTokenName(ATNDeserializer.ToInt(data[p]))).Append("..").Append(GetTokenName(ATNDeserializer.ToInt(data[p + 1]))); - p += 2; - } - buf.Append("\n"); - } - int nedges = ATNDeserializer.ToInt(data[p++]); - for (int i_8 = 0; i_8 < nedges; i_8++) - { - int src = ATNDeserializer.ToInt(data[p]); - int trg = ATNDeserializer.ToInt(data[p + 1]); - int ttype = ATNDeserializer.ToInt(data[p + 2]); - int arg1 = ATNDeserializer.ToInt(data[p + 3]); - int arg2 = ATNDeserializer.ToInt(data[p + 4]); - int arg3 = ATNDeserializer.ToInt(data[p + 5]); - buf.Append(src).Append("->").Append(trg).Append(" ").Append(Transition.serializationNames[ttype]).Append(" ").Append(arg1).Append(",").Append(arg2).Append(",").Append(arg3).Append("\n"); - p += 6; - } - int ndecisions = ATNDeserializer.ToInt(data[p++]); - for (int i_9 = 0; i_9 < ndecisions; i_9++) - { - int s = ATNDeserializer.ToInt(data[p++]); - buf.Append(i_9).Append(":").Append(s).Append("\n"); - } - if (atn.grammarType == ATNType.Lexer) - { - int lexerActionCount = ATNDeserializer.ToInt(data[p++]); - for (int i_10 = 0; i_10 < lexerActionCount; i_10++) - { - LexerActionType actionType = LexerActionType.Values()[ATNDeserializer.ToInt(data[p++])]; - int data1 = ATNDeserializer.ToInt(data[p++]); - int data2 = ATNDeserializer.ToInt(data[p++]); - } - } - return buf.ToString(); - } - - public virtual string GetTokenName(int t) - { - if (t == -1) - { - return "EOF"; - } - if (atn.grammarType == ATNType.Lexer && t >= char.MinValue && t <= char.MaxValue) - { - switch (t) - { - case '\n': - { - return "'\\n'"; - } - - case '\r': - { - return "'\\r'"; - } - - case '\t': - { - return "'\\t'"; - } - - case '\b': - { - return "'\\b'"; - } - - case '\f': - { - return "'\\f'"; - } - - case '\\': - { - return "'\\\\'"; - } - - case '\'': - { - return "'\\''"; - } - - default: - { - if (Character.UnicodeBlock.Of((char)t) == Character.UnicodeBlock.BasicLatin && !char.IsISOControl((char)t)) - { - return '\'' + char.ToString((char)t) + '\''; - } - // turn on the bit above max "\uFFFF" value so that we pad with zeros - // then only take last 4 digits - string hex = Sharpen.Runtime.Substring(Antlr4.Runtime.Sharpen.Extensions.ToHexString(t | unchecked((int)(0x10000))).ToUpper(), 1, 5); - string unicodeStr = "'\\u" + hex + "'"; - return unicodeStr; - } - } - } - if (tokenNames != null && t >= 0 && t < tokenNames.Count) - { - return tokenNames[t]; - } - return t.ToString(); - } - - /// Used by Java target to encode short/int array as chars in string. - /// Used by Java target to encode short/int array as chars in string. - public static string GetSerializedAsString(ATN atn, IList ruleNames) - { - return new string(GetSerializedAsChars(atn, ruleNames)); - } - - public static List GetSerialized(ATN atn, IList ruleNames) - { - return new Antlr4.Runtime.Atn.ATNSerializer(atn, ruleNames).Serialize(); - } - - public static char[] GetSerializedAsChars(ATN atn, IList ruleNames) - { - return Utils.ToCharArray(GetSerialized(atn, ruleNames)); - } - - public static string GetDecoded(ATN atn, IList ruleNames, IList tokenNames) - { - List serialized = GetSerialized(atn, ruleNames); - char[] data = Utils.ToCharArray(serialized); - return new Antlr4.Runtime.Atn.ATNSerializer(atn, ruleNames, tokenNames).Decode(data); - } - - private void SerializeUUID(List data, Guid uuid) - { - SerializeLong(data, uuid.GetLeastSignificantBits()); - SerializeLong(data, uuid.GetMostSignificantBits()); - } - - private void SerializeLong(List data, long value) - { - SerializeInt(data, (int)value); - SerializeInt(data, (int)(value >> 32)); - } - - private void SerializeInt(List data, int value) - { - data.Add((char)value); - data.Add((char)(value >> 16)); - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime/Atn/DecisionInfo.cs b/runtime/CSharp/Antlr4.Runtime/Atn/DecisionInfo.cs index 86a347658..9cd92543a 100644 --- a/runtime/CSharp/Antlr4.Runtime/Atn/DecisionInfo.cs +++ b/runtime/CSharp/Antlr4.Runtime/Atn/DecisionInfo.cs @@ -31,9 +31,7 @@ using System.Collections.Generic; using Antlr4.Runtime.Atn; using Antlr4.Runtime.Dfa; using Antlr4.Runtime.Sharpen; -#if !PORTABLE || NET45PLUS -using Stopwatch = System.Diagnostics.Stopwatch; -#endif + namespace Antlr4.Runtime.Atn { @@ -66,24 +64,6 @@ namespace Antlr4.Runtime.Atn /// public long invocations; -#if !PORTABLE || NET45PLUS - /// - /// The total time spent in - /// - /// for - /// this decision, in nanoseconds. - ///

- /// The value of this field is computed by , - /// and is not adjusted to compensate for JIT - /// and/or garbage collection overhead. For best accuracy, perform profiling - /// in a separate process which is warmed up by parsing the input prior to - /// profiling. If desired, call - /// to reset the DFA cache to its initial - /// state before starting the profiling measurement pass.

- ///
- public long timeInPrediction; -#endif - /// The sum of the lookahead required for SLL prediction for this decision. /// /// The sum of the lookahead required for SLL prediction for this decision. diff --git a/runtime/CSharp/Antlr4.Runtime/Atn/ParseInfo.cs b/runtime/CSharp/Antlr4.Runtime/Atn/ParseInfo.cs index 13c8d850b..17f9a5c42 100644 --- a/runtime/CSharp/Antlr4.Runtime/Atn/ParseInfo.cs +++ b/runtime/CSharp/Antlr4.Runtime/Atn/ParseInfo.cs @@ -81,7 +81,7 @@ namespace Antlr4.Runtime.Atn /// /// Gets the decision numbers for decisions that required one or more /// full-context predictions during parsing. These are decisions for which - /// + /// /// is non-zero. /// /// @@ -104,29 +104,6 @@ namespace Antlr4.Runtime.Atn return Ll; } -#if !PORTABLE || NET45PLUS - /// - /// Gets the total time spent during prediction across all decisions made - /// during parsing. - /// - /// - /// Gets the total time spent during prediction across all decisions made - /// during parsing. This value is the sum of - /// - /// for all decisions. - /// - public virtual long GetTotalTimeInPrediction() - { - Antlr4.Runtime.Atn.DecisionInfo[] decisions = atnSimulator.DecisionInfo; - long t = 0; - for (int i = 0; i < decisions.Length; i++) - { - t += decisions[i].timeInPrediction; - } - return t; - } -#endif - /// /// Gets the total number of SLL lookahead operations across all decisions /// made during parsing. @@ -134,7 +111,7 @@ namespace Antlr4.Runtime.Atn /// /// Gets the total number of SLL lookahead operations across all decisions /// made during parsing. This value is the sum of - /// + /// /// for all decisions. /// public virtual long GetTotalSLLLookaheadOps() @@ -155,7 +132,7 @@ namespace Antlr4.Runtime.Atn /// /// Gets the total number of LL lookahead operations across all decisions /// made during parsing. This value is the sum of - /// + /// /// for all decisions. /// public virtual long GetTotalLLLookaheadOps() diff --git a/runtime/CSharp/Antlr4.Runtime/Atn/ParserATNSimulator.cs b/runtime/CSharp/Antlr4.Runtime/Atn/ParserATNSimulator.cs index 5f338e0cf..1a587cbc0 100644 --- a/runtime/CSharp/Antlr4.Runtime/Atn/ParserATNSimulator.cs +++ b/runtime/CSharp/Antlr4.Runtime/Atn/ParserATNSimulator.cs @@ -246,7 +246,6 @@ namespace Antlr4.Runtime.Atn /// ) /// ; /// parser. - /// /// (new /// /// ()); @@ -737,7 +736,7 @@ namespace Antlr4.Runtime.Atn /// and /// /// is - /// + /// /// . In that case, only /// conflict states where /// diff --git a/runtime/CSharp/Antlr4.Runtime/Atn/ProfilingATNSimulator.cs b/runtime/CSharp/Antlr4.Runtime/Atn/ProfilingATNSimulator.cs index 1e394750e..50c3cc0aa 100644 --- a/runtime/CSharp/Antlr4.Runtime/Atn/ProfilingATNSimulator.cs +++ b/runtime/CSharp/Antlr4.Runtime/Atn/ProfilingATNSimulator.cs @@ -32,9 +32,6 @@ using Antlr4.Runtime; using Antlr4.Runtime.Atn; using Antlr4.Runtime.Dfa; using Antlr4.Runtime.Sharpen; -#if !PORTABLE || NET45PLUS -using Stopwatch = System.Diagnostics.Stopwatch; -#endif namespace Antlr4.Runtime.Atn { @@ -100,14 +97,8 @@ namespace Antlr4.Runtime.Atn this.currentDecision = decision; this.currentState = null; this.conflictingAltResolvedBySLL = ATN.InvalidAltNumber; -#if !PORTABLE || NET45PLUS - Stopwatch stopwatch = Stopwatch.StartNew(); -#endif // expensive but useful info int alt = base.AdaptivePredict(input, decision, outerContext); -#if !PORTABLE || NET45PLUS - decisions[decision].timeInPrediction += stopwatch.ElapsedTicks * 100; -#endif decisions[decision].invocations++; int SLL_k = _sllStopIndex - _startIndex + 1; decisions[decision].SLL_TotalLook += SLL_k; diff --git a/runtime/CSharp/Antlr4.Runtime/BufferedTokenStream.cs b/runtime/CSharp/Antlr4.Runtime/BufferedTokenStream.cs index 5fa17ba60..7442d3037 100644 --- a/runtime/CSharp/Antlr4.Runtime/BufferedTokenStream.cs +++ b/runtime/CSharp/Antlr4.Runtime/BufferedTokenStream.cs @@ -106,7 +106,7 @@ namespace Antlr4.Runtime /// Indicates whether the /// /// token has been fetched from - /// + /// /// and added to /// /// . This field improves diff --git a/runtime/CSharp/Antlr4.Runtime/CommonToken.cs b/runtime/CSharp/Antlr4.Runtime/CommonToken.cs index 711815097..090b37183 100644 --- a/runtime/CSharp/Antlr4.Runtime/CommonToken.cs +++ b/runtime/CSharp/Antlr4.Runtime/CommonToken.cs @@ -164,14 +164,14 @@ namespace Antlr4.Runtime /// /// instance, the newly /// constructed token will share a reference to the - /// + /// /// field and /// the /// /// stored in /// /// . Otherwise, - /// + /// /// will /// be assigned the result of calling /// diff --git a/runtime/CSharp/Antlr4.Runtime/Dfa/DFA.cs b/runtime/CSharp/Antlr4.Runtime/Dfa/DFA.cs index a751ab8d1..2a8d6bbf2 100644 --- a/runtime/CSharp/Antlr4.Runtime/Dfa/DFA.cs +++ b/runtime/CSharp/Antlr4.Runtime/Dfa/DFA.cs @@ -234,6 +234,7 @@ namespace Antlr4.Runtime.Dfa /// Get the start state for a specific precedence value. /// Get the start state for a specific precedence value. /// The current precedence. + /// Whether to get from local of full context. /// /// The start state corresponding to the specified precedence, or /// @@ -260,6 +261,7 @@ namespace Antlr4.Runtime.Dfa /// Set the start state for a specific precedence value. /// Set the start state for a specific precedence value. /// The current precedence. + /// Whether to set local of full context. /// /// The start state corresponding to the specified /// precedence. diff --git a/runtime/CSharp/Antlr4.Runtime/Misc/Array2DHashSet`1.cs b/runtime/CSharp/Antlr4.Runtime/Misc/Array2DHashSet`1.cs deleted file mode 100644 index 5ddb06fc0..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Misc/Array2DHashSet`1.cs +++ /dev/null @@ -1,689 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.Text; -using Antlr4.Runtime.Misc; -using Antlr4.Runtime.Sharpen; - -namespace Antlr4.Runtime.Misc -{ - /// - /// - /// implementation with closed hashing (open addressing). - /// - public class Array2DHashSet : HashSet - { - public const int InitalCapacity = 16; - - public const int InitalBucketCapacity = 8; - - public const double LoadFactor = 0.75; - - [NotNull] - protected internal readonly EqualityComparer comparator; - - protected internal T[][] buckets; - - /// How many elements in set - protected internal int n = 0; - - protected internal int threshold = (int)(InitalCapacity * LoadFactor); - - protected internal int currentPrime = 1; - - protected internal int initialBucketCapacity = InitalBucketCapacity; - - public Array2DHashSet() - : this(null, InitalCapacity, InitalBucketCapacity) - { - } - - public Array2DHashSet(EqualityComparer comparator) - : this(comparator, InitalCapacity, InitalBucketCapacity) - { - } - - public Array2DHashSet(EqualityComparer comparator, int initialCapacity, int initialBucketCapacity) - { - // must be power of 2 - // when to expand - // jump by 4 primes each expand or whatever - if (comparator == null) - { - comparator = ObjectEqualityComparator.Instance; - } - this.comparator = comparator; - this.buckets = CreateBuckets(initialCapacity); - this.initialBucketCapacity = initialBucketCapacity; - } - - /// - /// Add - /// - /// to set if not there; return existing value if already - /// there. This method performs the same operation as - /// - /// aside from - /// the return value. - /// - public T GetOrAdd(T o) - { - if (n > threshold) - { - Expand(); - } - return GetOrAddImpl(o); - } - - protected internal virtual T GetOrAddImpl(T o) - { - int b = GetBucket(o); - T[] bucket = buckets[b]; - // NEW BUCKET - if (bucket == null) - { - bucket = CreateBucket(initialBucketCapacity); - bucket[0] = o; - buckets[b] = bucket; - n++; - return o; - } - // LOOK FOR IT IN BUCKET - for (int i = 0; i < bucket.Length; i++) - { - T existing = bucket[i]; - if (existing == null) - { - // empty slot; not there, add. - bucket[i] = o; - n++; - return o; - } - if (comparator.Equals(existing, o)) - { - return existing; - } - } - // found existing, quit - // FULL BUCKET, expand and add to end - int oldLength = bucket.Length; - bucket = Arrays.CopyOf(bucket, bucket.Length * 2); - buckets[b] = bucket; - bucket[oldLength] = o; - // add to end - n++; - return o; - } - - public virtual T Get(T o) - { - if (o == null) - { - return o; - } - int b = GetBucket(o); - T[] bucket = buckets[b]; - if (bucket == null) - { - return null; - } - // no bucket - foreach (T e in bucket) - { - if (e == null) - { - return null; - } - // empty slot; not there - if (comparator.Equals(e, o)) - { - return e; - } - } - return null; - } - - protected internal int GetBucket(T o) - { - int hash = comparator.GetHashCode(o); - int b = hash & (buckets.Length - 1); - // assumes len is power of 2 - return b; - } - - public override int GetHashCode() - { - int hash = MurmurHash.Initialize(); - foreach (T[] bucket in buckets) - { - if (bucket == null) - { - continue; - } - foreach (T o in bucket) - { - if (o == null) - { - break; - } - hash = MurmurHash.Update(hash, comparator.GetHashCode(o)); - } - } - hash = MurmurHash.Finish(hash, Count); - return hash; - } - - public override bool Equals(object o) - { - if (o == this) - { - return true; - } - if (!(o is Antlr4.Runtime.Misc.Array2DHashSet)) - { - return false; - } - Antlr4.Runtime.Misc.Array2DHashSet other = (Antlr4.Runtime.Misc.Array2DHashSet)o; - if (other.Count != Count) - { - return false; - } - bool same = this.ContainsAll(other); - return same; - } - - protected internal virtual void Expand() - { - T[][] old = buckets; - currentPrime += 4; - int newCapacity = buckets.Length * 2; - T[][] newTable = CreateBuckets(newCapacity); - int[] newBucketLengths = new int[newTable.Length]; - buckets = newTable; - threshold = (int)(newCapacity * LoadFactor); - // System.out.println("new size="+newCapacity+", thres="+threshold); - // rehash all existing entries - int oldSize = Count; - foreach (T[] bucket in old) - { - if (bucket == null) - { - continue; - } - foreach (T o in bucket) - { - if (o == null) - { - break; - } - int b = GetBucket(o); - int bucketLength = newBucketLengths[b]; - T[] newBucket; - if (bucketLength == 0) - { - // new bucket - newBucket = CreateBucket(initialBucketCapacity); - newTable[b] = newBucket; - } - else - { - newBucket = newTable[b]; - if (bucketLength == newBucket.Length) - { - // expand - newBucket = Arrays.CopyOf(newBucket, newBucket.Length * 2); - newTable[b] = newBucket; - } - } - newBucket[bucketLength] = o; - newBucketLengths[b]++; - } - } - System.Diagnostics.Debug.Assert(n == oldSize); - } - - public bool Add(T t) - { - T existing = GetOrAdd(t); - return existing == t; - } - - public int Count - { - get - { - return n; - } - } - - public bool IsEmpty() - { - return n == 0; - } - - public bool Contains(object o) - { - return ContainsFast(AsElementType(o)); - } - - public virtual bool ContainsFast(T obj) - { - if (obj == null) - { - return false; - } - return Get(obj) != null; - } - - public virtual IEnumerator GetEnumerator() - { - return new Array2DHashSet.SetIterator(this, Sharpen.Collections.ToArray(this)); - } - - public virtual T[] ToArray() - { - T[] a = CreateBucket(Count); - int i = 0; - foreach (T[] bucket in buckets) - { - if (bucket == null) - { - continue; - } - foreach (T o in bucket) - { - if (o == null) - { - break; - } - a[i++] = o; - } - } - return a; - } - - public virtual U[] ToArray(U[] a) - { - if (a.Length < Count) - { - a = Arrays.CopyOf(a, Count); - } - int i = 0; - foreach (T[] bucket in buckets) - { - if (bucket == null) - { - continue; - } - foreach (T o in bucket) - { - if (o == null) - { - break; - } - U targetElement = (U)o; - // array store will check this - a[i++] = targetElement; - } - } - return a; - } - - public bool Remove(object o) - { - return RemoveFast(AsElementType(o)); - } - - public virtual bool RemoveFast(T obj) - { - if (obj == null) - { - return false; - } - int b = GetBucket(obj); - T[] bucket = buckets[b]; - if (bucket == null) - { - // no bucket - return false; - } - for (int i = 0; i < bucket.Length; i++) - { - T e = bucket[i]; - if (e == null) - { - // empty slot; not there - return false; - } - if (comparator.Equals(e, obj)) - { - // found it - // shift all elements to the right down one - System.Array.Copy(bucket, i + 1, bucket, i, bucket.Length - i - 1); - bucket[bucket.Length - 1] = null; - n--; - return true; - } - } - return false; - } - - public virtual bool ContainsAll<_T0>(ICollection<_T0> collection) - { - if (collection is Antlr4.Runtime.Misc.Array2DHashSet) - { - Antlr4.Runtime.Misc.Array2DHashSet s = (Antlr4.Runtime.Misc.Array2DHashSet)collection; - foreach (object[] bucket in s.buckets) - { - if (bucket == null) - { - continue; - } - foreach (object o in bucket) - { - if (o == null) - { - break; - } - if (!this.ContainsFast(AsElementType(o))) - { - return false; - } - } - } - } - else - { - foreach (object o in collection) - { - if (!this.ContainsFast(AsElementType(o))) - { - return false; - } - } - } - return true; - } - - public virtual bool AddAll<_T0>(ICollection<_T0> c) - where _T0 : T - { - bool changed = false; - foreach (T o in c) - { - T existing = GetOrAdd(o); - if (existing != o) - { - changed = true; - } - } - return changed; - } - - public virtual bool RetainAll<_T0>(ICollection<_T0> c) - { - int newsize = 0; - foreach (T[] bucket in buckets) - { - if (bucket == null) - { - continue; - } - int i; - int j; - for (i = 0, j = 0; i < bucket.Length; i++) - { - if (bucket[i] == null) - { - break; - } - if (!c.Contains(bucket[i])) - { - // removed - continue; - } - // keep - if (i != j) - { - bucket[j] = bucket[i]; - } - j++; - newsize++; - } - newsize += j; - while (j < i) - { - bucket[j] = null; - j++; - } - } - bool changed = newsize != n; - n = newsize; - return changed; - } - - public virtual bool RemoveAll<_T0>(ICollection<_T0> c) - { - bool changed = false; - foreach (object o in c) - { - changed |= RemoveFast(AsElementType(o)); - } - return changed; - } - - public virtual void Clear() - { - buckets = CreateBuckets(InitalCapacity); - n = 0; - } - - public override string ToString() - { - if (Count == 0) - { - return "{}"; - } - StringBuilder buf = new StringBuilder(); - buf.Append('{'); - bool first = true; - foreach (T[] bucket in buckets) - { - if (bucket == null) - { - continue; - } - foreach (T o in bucket) - { - if (o == null) - { - break; - } - if (first) - { - first = false; - } - else - { - buf.Append(", "); - } - buf.Append(o.ToString()); - } - } - buf.Append('}'); - return buf.ToString(); - } - - public virtual string ToTableString() - { - StringBuilder buf = new StringBuilder(); - foreach (T[] bucket in buckets) - { - if (bucket == null) - { - buf.Append("null\n"); - continue; - } - buf.Append('['); - bool first = true; - foreach (T o in bucket) - { - if (first) - { - first = false; - } - else - { - buf.Append(" "); - } - if (o == null) - { - buf.Append("_"); - } - else - { - buf.Append(o.ToString()); - } - } - buf.Append("]\n"); - } - return buf.ToString(); - } - - /// - /// Return - /// - /// as an instance of the element type - /// T - /// . If - /// - /// is non-null but known to not be an instance of - /// T - /// , this - /// method returns - /// - /// . The base implementation does not perform any - /// type checks; override this method to provide strong type checks for the - /// - /// and - /// - /// methods to ensure the arguments to - /// the - /// - /// for the set always have the expected - /// types. - /// - /// the object to try and cast to the element type of the set - /// - /// - /// - /// if it could be an instance of - /// T - /// , otherwise - /// - /// . - /// - protected internal virtual T AsElementType(object o) - { - return (T)o; - } - - /// - /// Return an array of - /// T[] - /// with length - /// - /// . - /// - /// the length of the array to return - /// the newly constructed array - protected internal virtual T[][] CreateBuckets(int capacity) - { - return new T[capacity][]; - } - - /// - /// Return an array of - /// T - /// with length - /// - /// . - /// - /// the length of the array to return - /// the newly constructed array - protected internal virtual T[] CreateBucket(int capacity) - { - return new T[capacity]; - } - - protected internal class SetIterator : IEnumerator - { - internal readonly T[] data; - - internal int nextIndex = 0; - - internal bool removed = true; - - public SetIterator(Array2DHashSet _enclosing, T[] data) - { - this._enclosing = _enclosing; - this.data = data; - } - - public virtual bool HasNext() - { - return this.nextIndex < this.data.Length; - } - - public virtual T Next() - { - if (!this.HasNext()) - { - throw new InvalidOperationException(); - } - this.removed = false; - return this.data[this.nextIndex++]; - } - - public virtual void Remove() - { - if (this.removed) - { - throw new InvalidOperationException(); - } - this._enclosing._enclosing.Remove(this.data[this.nextIndex - 1]); - this.removed = true; - } - - private readonly Array2DHashSet _enclosing; - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime/Misc/DoubleKeyMap`3.cs b/runtime/CSharp/Antlr4.Runtime/Misc/DoubleKeyMap`3.cs deleted file mode 100644 index c061597f0..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Misc/DoubleKeyMap`3.cs +++ /dev/null @@ -1,106 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System.Collections.Generic; -using Antlr4.Runtime.Misc; -using Antlr4.Runtime.Sharpen; - -namespace Antlr4.Runtime.Misc -{ - /// Sometimes we need to map a key to a value but key is two pieces of data. - /// - /// Sometimes we need to map a key to a value but key is two pieces of data. - /// This nested hash table saves creating a single key each time we access - /// map; avoids mem creation. - /// - public class DoubleKeyMap - { - internal IDictionary> data = new LinkedHashMap>(); - - public virtual Value Put(Key1 k1, Key2 k2, Value v) - { - IDictionary data2 = data.Get(k1); - Value prev = null; - if (data2 == null) - { - data2 = new LinkedHashMap(); - data.Put(k1, data2); - } - else - { - prev = data2.Get(k2); - } - data2.Put(k2, v); - return prev; - } - - public virtual Value Get(Key1 k1, Key2 k2) - { - IDictionary data2 = data.Get(k1); - if (data2 == null) - { - return null; - } - return data2.Get(k2); - } - - public virtual IDictionary Get(Key1 k1) - { - return data.Get(k1); - } - - /// Get all values associated with primary key - public virtual ICollection Values(Key1 k1) - { - IDictionary data2 = data.Get(k1); - if (data2 == null) - { - return null; - } - return data2.Values; - } - - /// get all primary keys - public virtual HashSet KeySet() - { - return data.Keys; - } - - /// get all secondary keys associated with a primary key - public virtual HashSet KeySet(Key1 k1) - { - IDictionary data2 = data.Get(k1); - if (data2 == null) - { - return null; - } - return data2.Keys; - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime/Misc/OrderedHashSet`1.cs b/runtime/CSharp/Antlr4.Runtime/Misc/OrderedHashSet`1.cs deleted file mode 100644 index 37de8630e..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Misc/OrderedHashSet`1.cs +++ /dev/null @@ -1,166 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using Antlr4.Runtime.Misc; -using Antlr4.Runtime.Sharpen; - -namespace Antlr4.Runtime.Misc -{ - /// A HashMap that remembers the order that the elements were added. - /// - /// A HashMap that remembers the order that the elements were added. - /// You can alter the ith element with set(i,value) too :) Unique list. - /// I need the replace/set-element-i functionality so I'm subclassing - /// LinkedHashSet. - /// - [System.Serializable] - public class OrderedHashSet : LinkedHashSet - { - private const long serialVersionUID = 5281944403755906761L; - - /// Track the elements as they are added to the set - protected internal List elements = new List(); - - public virtual T Get(int i) - { - return elements[i]; - } - - /// - /// Replace an existing value with a new value; updates the element - /// list and the hash table, but not the key as that has not changed. - /// - /// - /// Replace an existing value with a new value; updates the element - /// list and the hash table, but not the key as that has not changed. - /// - public virtual T Set(int i, T value) - { - T oldElement = elements[i]; - elements.Set(i, value); - // update list - base.Remove(oldElement); - // now update the set: remove/add - base.Add(value); - return oldElement; - } - - public virtual bool Remove(int i) - { - T o = elements.RemoveAt(i); - return base.Remove(o); - } - - /// - /// Add a value to list; keep in hashtable for consistency also; - /// Key is object itself. - /// - /// - /// Add a value to list; keep in hashtable for consistency also; - /// Key is object itself. Good for say asking if a certain string is in - /// a list of strings. - /// - public override bool Add(T value) - { - bool result = base.Add(value); - if (result) - { - // only track if new element not in set - elements.Add(value); - } - return result; - } - - public override bool Remove(object o) - { - throw new NotSupportedException(); - } - - public override void Clear() - { - elements.Clear(); - base.Clear(); - } - - public override int GetHashCode() - { - return elements.GetHashCode(); - } - - public override bool Equals(object o) - { - if (!(o is OrderedHashSet)) - { - return false; - } - // System.out.print("equals " + this + ", " + o+" = "); - bool same = elements != null && elements.Equals(((OrderedHashSet)o).elements); - // System.out.println(same); - return same; - } - - public override IEnumerator GetEnumerator() - { - return elements.GetEnumerator(); - } - - /// Return the List holding list of table elements. - /// - /// Return the List holding list of table elements. Note that you are - /// NOT getting a copy so don't write to the list. - /// - public virtual IList Elements - { - get - { - return elements; - } - } - - public override object Clone() - { - OrderedHashSet dup = (OrderedHashSet)base.Clone(); - // safe (result of clone) - dup.elements = new List(this.elements); - return dup; - } - - public override object[] ToArray() - { - return Sharpen.Collections.ToArray(elements); - } - - public override string ToString() - { - return elements.ToString(); - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime/Misc/RuleDependencyProcessor.cs b/runtime/CSharp/Antlr4.Runtime/Misc/RuleDependencyProcessor.cs deleted file mode 100644 index 887626544..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Misc/RuleDependencyProcessor.cs +++ /dev/null @@ -1,789 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections; -using System.Collections.Generic; -using Antlr4.Runtime; -using Antlr4.Runtime.Atn; -using Antlr4.Runtime.Misc; -using Antlr4.Runtime.Sharpen; -using Antlr4.Runtime.Sharpen.Annotation; -using Javax.Annotation.Processing; -using Javax.Lang.Model; -using Javax.Lang.Model.Element; -using Javax.Lang.Model.Type; -using Javax.Tools; - -namespace Antlr4.Runtime.Misc -{ - /// A compile-time validator for rule dependencies. - /// A compile-time validator for rule dependencies. - /// - /// - /// Sam Harwell - public class RuleDependencyProcessor : AbstractProcessor - { - public const string RuleDependencyClassName = "org.antlr.v4.runtime.RuleDependency"; - - public const string RuleDependenciesClassName = "org.antlr.v4.runtime.RuleDependencies"; - - public const string RuleVersionClassName = "org.antlr.v4.runtime.RuleVersion"; - - public RuleDependencyProcessor() - { - } - - public override SourceVersion GetSupportedSourceVersion() - { - SourceVersion latestSupported = SourceVersion.LatestSupported(); - if ((int)(latestSupported) <= 6) - { - return SourceVersion.Release6; - } - else - { - if ((int)(latestSupported) <= 8) - { - return latestSupported; - } - else - { - // this annotation processor is tested through Java 8 - return SourceVersion.Values()[8]; - } - } - } - - public override bool Process<_T0>(HashSet<_T0> annotations, IRoundEnvironment roundEnv) - { - if (!CheckClassNameConstants()) - { - return true; - } - IList> dependencies = GetDependencies(roundEnv); - IDictionary>> recognizerDependencies = new Dictionary>>(); - foreach (Tuple dependency in dependencies) - { - ITypeMirror recognizerType = GetRecognizerType(dependency.Item1); - IList> list = recognizerDependencies.Get(recognizerType); - if (list == null) - { - list = new List>(); - recognizerDependencies.Put(recognizerType, list); - } - list.Add(dependency); - } - foreach (KeyValuePair>> entry in recognizerDependencies.EntrySet()) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Note, string.Format("ANTLR 4: Validating {0} dependencies on rules in {1}.", entry.Value.Count, entry.Key.ToString())); - CheckDependencies(entry.Value, entry.Key); - } - return true; - } - - private bool CheckClassNameConstants() - { - bool success = CheckClassNameConstant(RuleDependencyClassName, typeof(RuleDependency)); - success &= CheckClassNameConstant(RuleDependenciesClassName, typeof(RuleDependencies)); - success &= CheckClassNameConstant(RuleVersionClassName, typeof(RuleVersion)); - return success; - } - - private bool CheckClassNameConstant<_T0>(string className, System.Type<_T0> clazz) - { - Args.NotNull("className", className); - Args.NotNull("clazz", clazz); - if (!className.Equals(clazz.GetCanonicalName())) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, string.Format("Unable to process rule dependencies due to class name mismatch: {0} != {1}", className, clazz.GetCanonicalName())); - return false; - } - return true; - } - - private static ITypeMirror GetRecognizerType(RuleDependency dependency) - { - try - { - dependency.Recognizer(); - string message = string.Format("Expected {0} to get the {1}.", typeof(MirroredTypeException).Name, typeof(ITypeMirror).Name); - throw new NotSupportedException(message); - } - catch (MirroredTypeException ex) - { - return ex.GetTypeMirror(); - } - } - - private void CheckDependencies(IList> dependencies, ITypeMirror recognizerType) - { - string[] ruleNames = GetRuleNames(recognizerType); - int[] ruleVersions = GetRuleVersions(recognizerType, ruleNames); - RuleDependencyProcessor.RuleRelations relations = ExtractRuleRelations(recognizerType); - foreach (Tuple dependency in dependencies) - { - try - { - if (!processingEnv.GetTypeUtils().IsAssignable(GetRecognizerType(dependency.Item1), recognizerType)) - { - continue; - } - // this is the rule in the dependency set with the highest version number - int effectiveRule = dependency.Item1.Rule(); - if (effectiveRule < 0 || effectiveRule >= ruleVersions.Length) - { - Tuple ruleReferenceElement = FindRuleDependencyProperty(dependency, RuleDependencyProcessor.RuleDependencyProperty.Rule); - string message = string.Format("Rule dependency on unknown rule {0}@{1} in {2}", dependency.Item1.Rule(), dependency.Item1.Version(), GetRecognizerType(dependency.Item1).ToString()); - if (ruleReferenceElement != null) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, dependency.Item2, ruleReferenceElement.Item1, ruleReferenceElement.Item2); - } - else - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, dependency.Item2); - } - continue; - } - EnumSet dependents = EnumSet.Of(Dependents.Self, dependency.Item1.Dependents()); - ReportUnimplementedDependents(dependency, dependents); - BitSet @checked = new BitSet(); - int highestRequiredDependency = CheckDependencyVersion(dependency, ruleNames, ruleVersions, effectiveRule, null); - if (dependents.Contains(Dependents.Parents)) - { - BitSet parents = relations.parents[dependency.Item1.Rule()]; - for (int parent = parents.NextSetBit(0); parent >= 0; parent = parents.NextSetBit(parent + 1)) - { - if (parent < 0 || parent >= ruleVersions.Length || @checked.Get(parent)) - { - continue; - } - @checked.Set(parent); - int required = CheckDependencyVersion(dependency, ruleNames, ruleVersions, parent, "parent"); - highestRequiredDependency = Math.Max(highestRequiredDependency, required); - } - } - if (dependents.Contains(Dependents.Children)) - { - BitSet children = relations.children[dependency.Item1.Rule()]; - for (int child = children.NextSetBit(0); child >= 0; child = children.NextSetBit(child + 1)) - { - if (child < 0 || child >= ruleVersions.Length || @checked.Get(child)) - { - continue; - } - @checked.Set(child); - int required = CheckDependencyVersion(dependency, ruleNames, ruleVersions, child, "child"); - highestRequiredDependency = Math.Max(highestRequiredDependency, required); - } - } - if (dependents.Contains(Dependents.Ancestors)) - { - BitSet ancestors = relations.GetAncestors(dependency.Item1.Rule()); - for (int ancestor = ancestors.NextSetBit(0); ancestor >= 0; ancestor = ancestors.NextSetBit(ancestor + 1)) - { - if (ancestor < 0 || ancestor >= ruleVersions.Length || @checked.Get(ancestor)) - { - continue; - } - @checked.Set(ancestor); - int required = CheckDependencyVersion(dependency, ruleNames, ruleVersions, ancestor, "ancestor"); - highestRequiredDependency = Math.Max(highestRequiredDependency, required); - } - } - if (dependents.Contains(Dependents.Descendants)) - { - BitSet descendants = relations.GetDescendants(dependency.Item1.Rule()); - for (int descendant = descendants.NextSetBit(0); descendant >= 0; descendant = descendants.NextSetBit(descendant + 1)) - { - if (descendant < 0 || descendant >= ruleVersions.Length || @checked.Get(descendant)) - { - continue; - } - @checked.Set(descendant); - int required = CheckDependencyVersion(dependency, ruleNames, ruleVersions, descendant, "descendant"); - highestRequiredDependency = Math.Max(highestRequiredDependency, required); - } - } - int declaredVersion = dependency.Item1.Version(); - if (declaredVersion > highestRequiredDependency) - { - Tuple versionElement = FindRuleDependencyProperty(dependency, RuleDependencyProcessor.RuleDependencyProperty.Version); - string message = string.Format("Rule dependency version mismatch: {0} has maximum dependency version {1} (expected {2}) in {3}", ruleNames[dependency.Item1.Rule()], highestRequiredDependency, declaredVersion, GetRecognizerType(dependency.Item1).ToString()); - if (versionElement != null) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, dependency.Item2, versionElement.Item1, versionElement.Item2); - } - else - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, dependency.Item2); - } - } - } - catch (AnnotationTypeMismatchException) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, string.Format("Could not validate rule dependencies for element {0}", dependency.Item2.ToString()), dependency.Item2); - } - } - } - - private static readonly HashSet ImplementedDependents = EnumSet.Of(Dependents.Self, Dependents.Parents, Dependents.Children, Dependents.Ancestors, Dependents.Descendants); - - private void ReportUnimplementedDependents(Tuple dependency, EnumSet dependents) - { - EnumSet unimplemented = dependents.Clone(); - unimplemented.RemoveAll(ImplementedDependents); - if (!unimplemented.IsEmpty()) - { - Tuple dependentsElement = FindRuleDependencyProperty(dependency, RuleDependencyProcessor.RuleDependencyProperty.Dependents); - if (dependentsElement == null) - { - dependentsElement = FindRuleDependencyProperty(dependency, RuleDependencyProcessor.RuleDependencyProperty.Rule); - } - string message = string.Format("Cannot validate the following dependents of rule {0}: {1}", dependency.Item1.Rule(), unimplemented); - if (dependentsElement != null) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, message, dependency.Item2, dependentsElement.Item1, dependentsElement.Item2); - } - else - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, message, dependency.Item2); - } - } - } - - private int CheckDependencyVersion(Tuple dependency, string[] ruleNames, int[] ruleVersions, int relatedRule, string relation) - { - string ruleName = ruleNames[dependency.Item1.Rule()]; - string path; - if (relation == null) - { - path = ruleName; - } - else - { - string mismatchedRuleName = ruleNames[relatedRule]; - path = string.Format("rule {0} ({1} of {2})", mismatchedRuleName, relation, ruleName); - } - int declaredVersion = dependency.Item1.Version(); - int actualVersion = ruleVersions[relatedRule]; - if (actualVersion > declaredVersion) - { - Tuple versionElement = FindRuleDependencyProperty(dependency, RuleDependencyProcessor.RuleDependencyProperty.Version); - string message = string.Format("Rule dependency version mismatch: {0} has version {1} (expected <= {2}) in {3}", path, actualVersion, declaredVersion, GetRecognizerType(dependency.Item1).ToString()); - if (versionElement != null) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, dependency.Item2, versionElement.Item1, versionElement.Item2); - } - else - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, dependency.Item2); - } - } - return actualVersion; - } - - private int[] GetRuleVersions(ITypeMirror recognizerClass, string[] ruleNames) - { - int[] versions = new int[ruleNames.Length]; - IList elements = processingEnv.GetElementUtils().GetAllMembers((ITypeElement)processingEnv.GetTypeUtils().AsElement(recognizerClass)); - foreach (IElement element in elements) - { - if (element.GetKind() != ElementKind.Field) - { - continue; - } - IVariableElement field = (IVariableElement)element; - bool isStatic = element.GetModifiers().Contains(Modifier.Static); - object constantValue = field.GetConstantValue(); - bool isInteger = constantValue is int; - string name = field.GetSimpleName().ToString(); - if (isStatic && isInteger && name.StartsWith("RULE_")) - { - try - { - name = Sharpen.Runtime.Substring(name, "RULE_".Length); - if (name.IsEmpty() || !System.Char.IsLower(name[0])) - { - continue; - } - int index = (int)constantValue; - if (index < 0 || index >= versions.Length) - { - string message = string.Format("Rule index {0} for rule '{1}' out of bounds for recognizer {2}.", index, name, recognizerClass.ToString()); - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, element); - continue; - } - if (name.IndexOf(ATNSimulator.RuleVariantDelimiter) >= 0) - { - // ignore left-factored pseudo-rules - continue; - } - IExecutableElement ruleMethod = GetRuleMethod(recognizerClass, name); - if (ruleMethod == null) - { - string message = string.Format("Could not find rule method for rule '{0}' in recognizer {1}.", name, recognizerClass.ToString()); - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, message, element); - continue; - } - RuleVersion ruleVersion = ruleMethod.GetAnnotation(); - int version = ruleVersion != null ? ruleVersion.Value() : 0; - versions[index] = version; - } - catch (ArgumentException) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, "Exception occurred while validating rule dependencies.", element); - } - } - } - return versions; - } - - private IExecutableElement GetRuleMethod(ITypeMirror recognizerClass, string name) - { - IList elements = processingEnv.GetElementUtils().GetAllMembers((ITypeElement)processingEnv.GetTypeUtils().AsElement(recognizerClass)); - foreach (IElement element in elements) - { - if (element.GetKind() != ElementKind.Method) - { - continue; - } - IExecutableElement method = (IExecutableElement)element; - if (method.GetSimpleName().ContentEquals(name) && HasRuleVersionAnnotation(method)) - { - return method; - } - } - return null; - } - - private bool HasRuleVersionAnnotation(IExecutableElement method) - { - ITypeElement ruleVersionAnnotationElement = processingEnv.GetElementUtils().GetTypeElement(RuleVersionClassName); - if (ruleVersionAnnotationElement == null) - { - return false; - } - foreach (IAnnotationMirror annotation in method.GetAnnotationMirrors()) - { - if (processingEnv.GetTypeUtils().IsSameType(annotation.GetAnnotationType(), ruleVersionAnnotationElement.AsType())) - { - return true; - } - } - return false; - } - - private string[] GetRuleNames(ITypeMirror recognizerClass) - { - IList result = new List(); - IList elements = processingEnv.GetElementUtils().GetAllMembers((ITypeElement)processingEnv.GetTypeUtils().AsElement(recognizerClass)); - foreach (IElement element in elements) - { - if (element.GetKind() != ElementKind.Field) - { - continue; - } - IVariableElement field = (IVariableElement)element; - bool isStatic = element.GetModifiers().Contains(Modifier.Static); - object constantValue = field.GetConstantValue(); - bool isInteger = constantValue is int; - string name = field.GetSimpleName().ToString(); - if (isStatic && isInteger && name.StartsWith("RULE_")) - { - try - { - name = Sharpen.Runtime.Substring(name, "RULE_".Length); - if (name.IsEmpty() || !System.Char.IsLower(name[0])) - { - continue; - } - int index = (int)constantValue; - if (index < 0) - { - continue; - } - while (result.Count <= index) - { - result.Add(string.Empty); - } - result.Set(index, name); - } - catch (ArgumentException) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, "Exception occurred while validating rule dependencies.", element); - } - } - } - return Sharpen.Collections.ToArray(result, new string[result.Count]); - } - - public static IList> GetDependencies(IRoundEnvironment roundEnv) - { - IList> result = new List>(); - HashSet elements = roundEnv.GetElementsAnnotatedWith(typeof(RuleDependency)); - foreach (IElement element in elements) - { - RuleDependency dependency = element.GetAnnotation(); - if (dependency == null) - { - continue; - } - result.Add(Tuple.Create(dependency, element)); - } - elements = roundEnv.GetElementsAnnotatedWith(typeof(RuleDependencies)); - foreach (IElement element_1 in elements) - { - RuleDependencies dependencies = element_1.GetAnnotation(); - if (dependencies == null || dependencies.Value() == null) - { - continue; - } - foreach (RuleDependency dependency in dependencies.Value()) - { - result.Add(Tuple.Create(dependency, element_1)); - } - } - return result; - } - - public enum RuleDependencyProperty - { - Recognizer, - Rule, - Version, - Dependents - } - - [Nullable] - private Tuple FindRuleDependencyProperty(Tuple dependency, RuleDependencyProcessor.RuleDependencyProperty property) - { - ITypeElement ruleDependencyTypeElement = processingEnv.GetElementUtils().GetTypeElement(RuleDependencyClassName); - ITypeElement ruleDependenciesTypeElement = processingEnv.GetElementUtils().GetTypeElement(RuleDependenciesClassName); - IList mirrors = dependency.Item2.GetAnnotationMirrors(); - foreach (IAnnotationMirror annotationMirror in mirrors) - { - if (processingEnv.GetTypeUtils().IsSameType(ruleDependencyTypeElement.AsType(), annotationMirror.GetAnnotationType())) - { - IAnnotationValue element = FindRuleDependencyProperty(dependency, annotationMirror, property); - if (element != null) - { - return Tuple.Create(annotationMirror, element); - } - } - else - { - if (processingEnv.GetTypeUtils().IsSameType(ruleDependenciesTypeElement.AsType(), annotationMirror.GetAnnotationType())) - { - IDictionary values = annotationMirror.GetElementValues(); - foreach (KeyValuePair value in values.EntrySet()) - { - if ("value()".Equals(value.Key.ToString())) - { - IAnnotationValue annotationValue = value.Value; - if (!(annotationValue.GetValue() is IList)) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, "Expected array of RuleDependency annotations for annotation property 'value()'.", dependency.Item2, annotationMirror, annotationValue); - break; - } - IList annotationValueList = (IList)annotationValue.GetValue(); - foreach (object obj in annotationValueList) - { - if (!(obj is IAnnotationMirror)) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, "Expected RuleDependency annotation mirror for element of property 'value()'.", dependency.Item2, annotationMirror, annotationValue); - break; - } - IAnnotationValue element = FindRuleDependencyProperty(dependency, (IAnnotationMirror)obj, property); - if (element != null) - { - return Tuple.Create((IAnnotationMirror)obj, element); - } - } - } - else - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, string.Format("Unexpected annotation property {0}.", value.Key.ToString()), dependency.Item2, annotationMirror, value.Value); - } - } - } - } - } - return null; - } - - [Nullable] - private IAnnotationValue FindRuleDependencyProperty(Tuple dependency, IAnnotationMirror annotationMirror, RuleDependencyProcessor.RuleDependencyProperty property) - { - IAnnotationValue recognizerValue = null; - IAnnotationValue ruleValue = null; - IAnnotationValue versionValue = null; - IAnnotationValue dependentsValue = null; - IDictionary values = annotationMirror.GetElementValues(); - foreach (KeyValuePair value in values.EntrySet()) - { - IAnnotationValue annotationValue = value.Value; - if ("rule()".Equals(value.Key.ToString())) - { - ruleValue = annotationValue; - if (!(annotationValue.GetValue() is int)) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, "Expected int constant for annotation property 'rule()'.", dependency.Item2, annotationMirror, annotationValue); - return null; - } - if ((int)annotationValue.GetValue() != dependency.Item1.Rule()) - { - // this is a valid dependency annotation, but not the one we're looking for - return null; - } - } - else - { - if ("recognizer()".Equals(value.Key.ToString())) - { - recognizerValue = annotationValue; - if (!(annotationValue.GetValue() is ITypeMirror)) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, "Expected Class constant for annotation property 'recognizer()'.", dependency.Item2, annotationMirror, annotationValue); - return null; - } - ITypeMirror annotationRecognizer = (ITypeMirror)annotationValue.GetValue(); - ITypeMirror expectedRecognizer = GetRecognizerType(dependency.Item1); - if (!processingEnv.GetTypeUtils().IsSameType(expectedRecognizer, annotationRecognizer)) - { - // this is a valid dependency annotation, but not the one we're looking for - return null; - } - } - else - { - if ("version()".Equals(value.Key.ToString())) - { - versionValue = annotationValue; - if (!(annotationValue.GetValue() is int)) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, "Expected int constant for annotation property 'version()'.", dependency.Item2, annotationMirror, annotationValue); - return null; - } - if ((int)annotationValue.GetValue() != dependency.Item1.Version()) - { - // this is a valid dependency annotation, but not the one we're looking for - return null; - } - } - } - } - } - if (recognizerValue != null) - { - if (property == RuleDependencyProcessor.RuleDependencyProperty.Recognizer) - { - return recognizerValue; - } - else - { - if (ruleValue != null) - { - if (property == RuleDependencyProcessor.RuleDependencyProperty.Rule) - { - return ruleValue; - } - else - { - if (versionValue != null) - { - if (property == RuleDependencyProcessor.RuleDependencyProperty.Version) - { - return versionValue; - } - else - { - if (property == RuleDependencyProcessor.RuleDependencyProperty.Dependents) - { - return dependentsValue; - } - } - } - } - } - } - } - if (recognizerValue == null) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, "Could not find 'recognizer()' element in annotation.", dependency.Item2, annotationMirror); - } - if (property == RuleDependencyProcessor.RuleDependencyProperty.Recognizer) - { - return null; - } - if (ruleValue == null) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, "Could not find 'rule()' element in annotation.", dependency.Item2, annotationMirror); - } - if (property == RuleDependencyProcessor.RuleDependencyProperty.Rule) - { - return null; - } - if (versionValue == null) - { - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Warning, "Could not find 'version()' element in annotation.", dependency.Item2, annotationMirror); - } - return null; - } - - private RuleDependencyProcessor.RuleRelations ExtractRuleRelations(ITypeMirror recognizer) - { - string serializedATN = GetSerializedATN(recognizer); - if (serializedATN == null) - { - return null; - } - ATN atn = new ATNDeserializer().Deserialize(serializedATN.ToCharArray()); - RuleDependencyProcessor.RuleRelations relations = new RuleDependencyProcessor.RuleRelations(atn.ruleToStartState.Length); - foreach (ATNState state in atn.states) - { - if (!state.epsilonOnlyTransitions) - { - continue; - } - foreach (Transition transition in state.Transitions) - { - if (transition.TransitionType != TransitionType.Rule) - { - continue; - } - RuleTransition ruleTransition = (RuleTransition)transition; - relations.AddRuleInvocation(state.ruleIndex, ruleTransition.target.ruleIndex); - } - } - return relations; - } - - private string GetSerializedATN(ITypeMirror recognizerClass) - { - IList elements = processingEnv.GetElementUtils().GetAllMembers((ITypeElement)processingEnv.GetTypeUtils().AsElement(recognizerClass)); - foreach (IElement element in elements) - { - if (element.GetKind() != ElementKind.Field) - { - continue; - } - IVariableElement field = (IVariableElement)element; - bool isStatic = element.GetModifiers().Contains(Modifier.Static); - object constantValue = field.GetConstantValue(); - bool isString = constantValue is string; - string name = field.GetSimpleName().ToString(); - if (isStatic && isString && name.Equals("_serializedATN")) - { - return (string)constantValue; - } - } - processingEnv.GetMessager().PrintMessage(Diagnostic.Kind.Error, "Could not retrieve serialized ATN from grammar."); - return null; - } - - private sealed class RuleRelations - { - private readonly BitSet[] parents; - - private readonly BitSet[] children; - - public RuleRelations(int ruleCount) - { - parents = new BitSet[ruleCount]; - for (int i = 0; i < ruleCount; i++) - { - parents[i] = new BitSet(); - } - children = new BitSet[ruleCount]; - for (int i_1 = 0; i_1 < ruleCount; i_1++) - { - children[i_1] = new BitSet(); - } - } - - public bool AddRuleInvocation(int caller, int callee) - { - if (caller < 0) - { - // tokens rule - return false; - } - if (children[caller].Get(callee)) - { - // already added - return false; - } - children[caller].Set(callee); - parents[callee].Set(caller); - return true; - } - - public BitSet GetAncestors(int rule) - { - BitSet ancestors = new BitSet(); - ancestors.Or(parents[rule]); - while (true) - { - int cardinality = ancestors.Cardinality(); - for (int i = ancestors.NextSetBit(0); i >= 0; i = ancestors.NextSetBit(i + 1)) - { - ancestors.Or(parents[i]); - } - if (ancestors.Cardinality() == cardinality) - { - // nothing changed - break; - } - } - return ancestors; - } - - public BitSet GetDescendants(int rule) - { - BitSet descendants = new BitSet(); - descendants.Or(children[rule]); - while (true) - { - int cardinality = descendants.Cardinality(); - for (int i = descendants.NextSetBit(0); i >= 0; i = descendants.NextSetBit(i + 1)) - { - descendants.Or(children[i]); - } - if (descendants.Cardinality() == cardinality) - { - // nothing changed - break; - } - } - return descendants; - } - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime/Misc/TestRig.cs b/runtime/CSharp/Antlr4.Runtime/Misc/TestRig.cs deleted file mode 100644 index 8117beb81..000000000 --- a/runtime/CSharp/Antlr4.Runtime/Misc/TestRig.cs +++ /dev/null @@ -1,335 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Antlr4.Runtime; -using Antlr4.Runtime.Atn; -using Antlr4.Runtime.Sharpen; -using Antlr4.Runtime.Sharpen.Reflect; - -namespace Antlr4.Runtime.Misc -{ - /// - /// Run a lexer/parser combo, optionally printing tree string or generating - /// postscript file. - /// - /// - /// Run a lexer/parser combo, optionally printing tree string or generating - /// postscript file. Optionally taking input file. - /// $ java org.antlr.v4.runtime.misc.TestRig GrammarName startRuleName - /// [-tree] - /// [-tokens] [-gui] [-ps file.ps] - /// [-trace] - /// [-diagnostics] - /// [-SLL] - /// [input-filename(s)] - /// - public class TestRig - { - public const string LexerStartRuleName = "tokens"; - - protected internal string grammarName; - - protected internal string startRuleName; - - protected internal readonly IList inputFiles = new List(); - - protected internal bool printTree = false; - - protected internal bool gui = false; - - protected internal string psFile = null; - - protected internal bool showTokens = false; - - protected internal bool trace = false; - - protected internal bool diagnostics = false; - - protected internal string encoding = null; - - protected internal bool Sll = false; - - /// - public TestRig(string[] args) - { - if (args.Length < 2) - { - System.Console.Error.WriteLine("java org.antlr.v4.runtime.misc.TestRig GrammarName startRuleName\n" + " [-tokens] [-tree] [-gui] [-ps file.ps] [-encoding encodingname]\n" + " [-trace] [-diagnostics] [-SLL]\n" + " [input-filename(s)]"); - System.Console.Error.WriteLine("Use startRuleName='tokens' if GrammarName is a lexer grammar."); - System.Console.Error.WriteLine("Omitting input-filename makes rig read from stdin."); - return; - } - int i = 0; - grammarName = args[i]; - i++; - startRuleName = args[i]; - i++; - while (i < args.Length) - { - string arg = args[i]; - i++; - if (arg[0] != '-') - { - // input file name - inputFiles.Add(arg); - continue; - } - if (arg.Equals("-tree")) - { - printTree = true; - } - if (arg.Equals("-gui")) - { - gui = true; - } - if (arg.Equals("-tokens")) - { - showTokens = true; - } - else - { - if (arg.Equals("-trace")) - { - trace = true; - } - else - { - if (arg.Equals("-SLL")) - { - Sll = true; - } - else - { - if (arg.Equals("-diagnostics")) - { - diagnostics = true; - } - else - { - if (arg.Equals("-encoding")) - { - if (i >= args.Length) - { - System.Console.Error.WriteLine("missing encoding on -encoding"); - return; - } - encoding = args[i]; - i++; - } - else - { - if (arg.Equals("-ps")) - { - if (i >= args.Length) - { - System.Console.Error.WriteLine("missing filename on -ps"); - return; - } - psFile = args[i]; - i++; - } - } - } - } - } - } - } - } - - /// - public static void Main(string[] args) - { - Antlr4.Runtime.Misc.TestRig testRig = new Antlr4.Runtime.Misc.TestRig(args); - if (args.Length >= 2) - { - testRig.Process(); - } - } - - /// - public virtual void Process() - { - // System.out.println("exec "+grammarName+"."+startRuleName); - string lexerName = grammarName + "Lexer"; - ClassLoader cl = Antlr4.Runtime.Sharpen.Thread.CurrentThread().GetContextClassLoader(); - Type lexerClass = null; - try - { - lexerClass = cl.LoadClass(lexerName).AsSubclass(); - } - catch (TypeLoadException) - { - // might be pure lexer grammar; no Lexer suffix then - lexerName = grammarName; - try - { - lexerClass = cl.LoadClass(lexerName).AsSubclass(); - } - catch (TypeLoadException) - { - System.Console.Error.WriteLine("Can't load " + lexerName + " as lexer or parser"); - return; - } - } - Constructor lexerCtor = lexerClass.GetConstructor(typeof(ICharStream)); - Lexer lexer = lexerCtor.NewInstance((ICharStream)null); - Type parserClass = null; - Parser parser = null; - if (!startRuleName.Equals(LexerStartRuleName)) - { - string parserName = grammarName + "Parser"; - parserClass = cl.LoadClass(parserName).AsSubclass(); - if (parserClass == null) - { - System.Console.Error.WriteLine("Can't load " + parserName); - return; - } - Constructor parserCtor = parserClass.GetConstructor(typeof(ITokenStream)); - parser = parserCtor.NewInstance((ITokenStream)null); - } - if (inputFiles.IsEmpty()) - { - Stream @is = Sharpen.Runtime.@in; - TextReader r; - if (encoding != null) - { - r = new StreamReader(@is, encoding); - } - else - { - r = new StreamReader(@is); - } - Process(lexer, parserClass, parser, @is, r); - return; - } - foreach (string inputFile in inputFiles) - { - Stream @is = Sharpen.Runtime.@in; - if (inputFile != null) - { - @is = new FileInputStream(inputFile); - } - TextReader r; - if (encoding != null) - { - r = new StreamReader(@is, encoding); - } - else - { - r = new StreamReader(@is); - } - if (inputFiles.Count > 1) - { - System.Console.Error.WriteLine(inputFile); - } - Process(lexer, parserClass, parser, @is, r); - } - } - - /// - /// - /// - /// - protected internal virtual void Process<_T0>(Lexer lexer, Type<_T0> parserClass, Parser parser, Stream @is, TextReader r) - where _T0 : Parser - { - try - { - AntlrInputStream input = new AntlrInputStream(r); - lexer.SetInputStream(input); - CommonTokenStream tokens = new CommonTokenStream(lexer); - tokens.Fill(); - if (showTokens) - { - foreach (object tok in tokens.GetTokens()) - { - System.Console.Out.WriteLine(tok); - } - } - if (startRuleName.Equals(LexerStartRuleName)) - { - return; - } - if (diagnostics) - { - parser.AddErrorListener(new DiagnosticErrorListener()); - parser.Interpreter.PredictionMode = PredictionMode.LlExactAmbigDetection; - } - if (printTree || gui || psFile != null) - { - parser.BuildParseTree = true; - } - if (Sll) - { - // overrides diagnostics - parser.Interpreter.PredictionMode = PredictionMode.Sll; - } - parser.SetInputStream(tokens); - parser.Trace = trace; - try - { - MethodInfo startRule = parserClass.GetMethod(startRuleName, (Type[])null); - ParserRuleContext tree = (ParserRuleContext)startRule.Invoke(parser, (object[])null); - if (printTree) - { - System.Console.Out.WriteLine(tree.ToStringTree(parser)); - } - if (gui) - { - tree.Inspect(parser); - } - if (psFile != null) - { - tree.Save(parser, psFile); - } - } - catch (NoSuchMethodException) - { - // Generate postscript - System.Console.Error.WriteLine("No method for rule " + startRuleName + " or it has arguments"); - } - } - finally - { - if (r != null) - { - r.Close(); - } - if (@is != null) - { - @is.Close(); - } - } - } - } -} diff --git a/runtime/CSharp/Antlr4.Runtime/Parser.cs b/runtime/CSharp/Antlr4.Runtime/Parser.cs index 5514a19be..8d13cf52f 100644 --- a/runtime/CSharp/Antlr4.Runtime/Parser.cs +++ b/runtime/CSharp/Antlr4.Runtime/Parser.cs @@ -126,8 +126,7 @@ namespace Antlr4.Runtime /// The input stream. /// The input stream. /// - /// - private ITokenStream _input; + private ITokenStream _input; private readonly List _precedenceStack = new List { 0 }; diff --git a/runtime/CSharp/Antlr4.Runtime/Sharpen/Collections.cs b/runtime/CSharp/Antlr4.Runtime/Sharpen/Collections.cs index f6d3f642f..45cef1426 100644 --- a/runtime/CSharp/Antlr4.Runtime/Sharpen/Collections.cs +++ b/runtime/CSharp/Antlr4.Runtime/Sharpen/Collections.cs @@ -29,6 +29,7 @@ */ namespace Antlr4.Runtime.Sharpen { + using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -87,4 +88,5 @@ namespace Antlr4.Runtime.Sharpen #endif } } + } diff --git a/runtime/CSharp/Antlr4.Runtime/Tree/Xpath/XPathLexer.cs b/runtime/CSharp/Antlr4.Runtime/Tree/Xpath/XPathLexer.cs index cdd38a75a..b7bea17b8 100644 --- a/runtime/CSharp/Antlr4.Runtime/Tree/Xpath/XPathLexer.cs +++ b/runtime/CSharp/Antlr4.Runtime/Tree/Xpath/XPathLexer.cs @@ -25,7 +25,6 @@ using Antlr4.Runtime.Atn; using Antlr4.Runtime.Misc; using DFA = Antlr4.Runtime.Dfa.DFA; -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.4.1-dev")] [System.CLSCompliant(false)] public partial class XPathLexer : Lexer { public const int diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net20.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net20.config deleted file mode 100644 index ba2302468..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net20.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net30.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net30.config deleted file mode 100644 index 553a3b3e6..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net30.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net35-cf.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net35-cf.config deleted file mode 100644 index 892d710c5..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net35-cf.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net35-client.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net35-client.config deleted file mode 100644 index be6a59602..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net35-client.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net40-client.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net40-client.config deleted file mode 100644 index 9d7ab9386..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net40-client.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net45.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net45.config deleted file mode 100644 index 475fe0d0c..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.net45.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.netcore45.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.netcore45.config deleted file mode 100644 index 4f558beae..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.netcore45.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.portable-net40.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.portable-net40.config deleted file mode 100644 index a0e3698bc..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.portable-net40.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.portable-net45.config b/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.portable-net45.config deleted file mode 100644 index 39d4c91d2..000000000 --- a/runtime/CSharp/Antlr4.Runtime/packages.Antlr4.Runtime.portable-net45.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Test.mono/AssemblyInfo.cs b/runtime/CSharp/Antlr4.Test.mono/AssemblyInfo.cs deleted file mode 100644 index f67408625..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/AssemblyInfo.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle ("Antlr4.Test.mono")] -[assembly: AssemblyDescription ("")] -[assembly: AssemblyConfiguration ("")] -[assembly: AssemblyCompany ("")] -[assembly: AssemblyProduct ("")] -[assembly: AssemblyCopyright ("ericvergnaud")] -[assembly: AssemblyTrademark ("")] -[assembly: AssemblyCulture ("")] -[assembly: CLSCompliant (true)] -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion ("1.0.*")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/runtime/CSharp/Antlr4.Test.mono/T.g4 b/runtime/CSharp/Antlr4.Test.mono/T.g4 deleted file mode 100644 index e219dea4d..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/T.g4 +++ /dev/null @@ -1,13 +0,0 @@ -grammar T; -@members { -bool pred(bool v) { - Console.WriteLine("eval="+v.ToString().ToLower()); - return v; -} -} -s : e {this.pred(true)}? {Console.WriteLine("parse");} '!' ; -t : e {this.pred(false)}? ID ; -e : ID | ; // non-LL(1) so we use ATN -ID : 'a'..'z'+ ; -INT : '0'..'9'+; -WS : (' '|'\n') -> skip ; \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Test.mono/T.tokens b/runtime/CSharp/Antlr4.Test.mono/T.tokens deleted file mode 100644 index f1ce7da40..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/T.tokens +++ /dev/null @@ -1,5 +0,0 @@ -T__0=1 -ID=2 -INT=3 -WS=4 -'!'=1 diff --git a/runtime/CSharp/Antlr4.Test.mono/TBaseListener.cs b/runtime/CSharp/Antlr4.Test.mono/TBaseListener.cs deleted file mode 100644 index ec9351b26..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/TBaseListener.cs +++ /dev/null @@ -1,84 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// ANTLR Version: 4.4.1-dev -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// Generated from /users/ericvergnaud/Development/antlr4/antlr/antlr4-csharp/runtime/CSharp/Antlr4.Test.mono/T.g4 by ANTLR 4.4.1-dev - -// Unreachable code detected -#pragma warning disable 0162 -// The variable '...' is assigned but its value is never used -#pragma warning disable 0219 -// Missing XML comment for publicly visible type or member '...' -#pragma warning disable 1591 - - -using Antlr4.Runtime.Misc; -using IErrorNode = Antlr4.Runtime.Tree.IErrorNode; -using ITerminalNode = Antlr4.Runtime.Tree.ITerminalNode; -using IToken = Antlr4.Runtime.IToken; -using ParserRuleContext = Antlr4.Runtime.ParserRuleContext; - -/// -/// This class provides an empty implementation of , -/// which can be extended to create a listener which only needs to handle a subset -/// of the available methods. -/// -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.4.1-dev")] -[System.CLSCompliant(false)] -public partial class TBaseListener : ITListener { - /// - /// Enter a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void EnterS([NotNull] TParser.SContext context) { } - /// - /// Exit a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void ExitS([NotNull] TParser.SContext context) { } - /// - /// Enter a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void EnterT([NotNull] TParser.TContext context) { } - /// - /// Exit a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void ExitT([NotNull] TParser.TContext context) { } - /// - /// Enter a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void EnterE([NotNull] TParser.EContext context) { } - /// - /// Exit a parse tree produced by . - /// The default implementation does nothing. - /// - /// The parse tree. - public virtual void ExitE([NotNull] TParser.EContext context) { } - - /// - /// The default implementation does nothing. - public virtual void EnterEveryRule([NotNull] ParserRuleContext context) { } - /// - /// The default implementation does nothing. - public virtual void ExitEveryRule([NotNull] ParserRuleContext context) { } - /// - /// The default implementation does nothing. - public virtual void VisitTerminal([NotNull] ITerminalNode node) { } - /// - /// The default implementation does nothing. - public virtual void VisitErrorNode([NotNull] IErrorNode node) { } -} diff --git a/runtime/CSharp/Antlr4.Test.mono/TBaseVisitor.cs b/runtime/CSharp/Antlr4.Test.mono/TBaseVisitor.cs deleted file mode 100644 index 5339580ec..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/TBaseVisitor.cs +++ /dev/null @@ -1,64 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// ANTLR Version: 4.4.1-dev -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// Generated from /users/ericvergnaud/Development/antlr4/antlr/antlr4-csharp/runtime/CSharp/Antlr4.Test.mono/T.g4 by ANTLR 4.4.1-dev - -// Unreachable code detected -#pragma warning disable 0162 -// The variable '...' is assigned but its value is never used -#pragma warning disable 0219 -// Missing XML comment for publicly visible type or member '...' -#pragma warning disable 1591 - -using Antlr4.Runtime.Misc; -using Antlr4.Runtime.Tree; -using IToken = Antlr4.Runtime.IToken; -using ParserRuleContext = Antlr4.Runtime.ParserRuleContext; - -/// -/// This class provides an empty implementation of , -/// which can be extended to create a visitor which only needs to handle a subset -/// of the available methods. -/// -/// The return type of the visit operation. -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.4.1-dev")] -[System.CLSCompliant(false)] -public partial class TBaseVisitor : AbstractParseTreeVisitor, ITVisitor { - /// - /// Visit a parse tree produced by . - /// - /// The default implementation returns the result of calling - /// on . - /// - /// - /// The parse tree. - /// The visitor result. - public virtual Result VisitS([NotNull] TParser.SContext context) { return VisitChildren(context); } - /// - /// Visit a parse tree produced by . - /// - /// The default implementation returns the result of calling - /// on . - /// - /// - /// The parse tree. - /// The visitor result. - public virtual Result VisitT([NotNull] TParser.TContext context) { return VisitChildren(context); } - /// - /// Visit a parse tree produced by . - /// - /// The default implementation returns the result of calling - /// on . - /// - /// - /// The parse tree. - /// The visitor result. - public virtual Result VisitE([NotNull] TParser.EContext context) { return VisitChildren(context); } -} diff --git a/runtime/CSharp/Antlr4.Test.mono/TLexer.cs b/runtime/CSharp/Antlr4.Test.mono/TLexer.cs deleted file mode 100644 index bddedaa94..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/TLexer.cs +++ /dev/null @@ -1,92 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// ANTLR Version: 4.4.1-dev -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// Generated from /users/ericvergnaud/Development/antlr4/antlr/antlr4-csharp/runtime/CSharp/Antlr4.Test.mono/T.g4 by ANTLR 4.4.1-dev - -// Unreachable code detected -#pragma warning disable 0162 -// The variable '...' is assigned but its value is never used -#pragma warning disable 0219 -// Missing XML comment for publicly visible type or member '...' -#pragma warning disable 1591 - -using System; -using Antlr4.Runtime; -using Antlr4.Runtime.Atn; -using Antlr4.Runtime.Misc; -using DFA = Antlr4.Runtime.Dfa.DFA; - -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.4.1-dev")] -[System.CLSCompliant(false)] -public partial class TLexer : Lexer { - public const int - T__0=1, ID=2, INT=3, WS=4; - public static string[] modeNames = { - "DEFAULT_MODE" - }; - - public static readonly string[] ruleNames = { - "T__0", "ID", "INT", "WS" - }; - - - bool pred(bool v) { - Console.WriteLine("eval="+v.ToString().ToLower()); - return v; - } - - - public TLexer(ICharStream input) - : base(input) - { - Interpreter = new LexerATNSimulator(this,_ATN); - } - - private static readonly string[] _LiteralNames = { - null, "'!'" - }; - private static readonly string[] _SymbolicNames = { - null, null, "ID", "INT", "WS" - }; - public static readonly IVocabulary DefaultVocabulary = new Vocabulary(_LiteralNames, _SymbolicNames); - - [NotNull] - public override IVocabulary Vocabulary - { - get - { - return DefaultVocabulary; - } - } - - public override string GrammarFileName { get { return "T.g4"; } } - - public override string[] RuleNames { get { return ruleNames; } } - - public override string[] ModeNames { get { return modeNames; } } - - public override string SerializedAtn { get { return _serializedATN; } } - - public static readonly string _serializedATN = - "\x3\x430\xD6D1\x8206\xAD2D\x4417\xAEF1\x8D80\xAADD\x2\x6\x1B\b\x1\x4\x2"+ - "\t\x2\x4\x3\t\x3\x4\x4\t\x4\x4\x5\t\x5\x3\x2\x3\x2\x3\x3\x6\x3\xF\n\x3"+ - "\r\x3\xE\x3\x10\x3\x4\x6\x4\x14\n\x4\r\x4\xE\x4\x15\x3\x5\x3\x5\x3\x5"+ - "\x3\x5\x2\x2\x6\x3\x3\x5\x4\a\x5\t\x6\x3\x2\x3\x4\x2\f\f\"\"\x1C\x2\x3"+ - "\x3\x2\x2\x2\x2\x5\x3\x2\x2\x2\x2\a\x3\x2\x2\x2\x2\t\x3\x2\x2\x2\x3\v"+ - "\x3\x2\x2\x2\x5\xE\x3\x2\x2\x2\a\x13\x3\x2\x2\x2\t\x17\x3\x2\x2\x2\v\f"+ - "\a#\x2\x2\f\x4\x3\x2\x2\x2\r\xF\x4\x63|\x2\xE\r\x3\x2\x2\x2\xF\x10\x3"+ - "\x2\x2\x2\x10\xE\x3\x2\x2\x2\x10\x11\x3\x2\x2\x2\x11\x6\x3\x2\x2\x2\x12"+ - "\x14\x4\x32;\x2\x13\x12\x3\x2\x2\x2\x14\x15\x3\x2\x2\x2\x15\x13\x3\x2"+ - "\x2\x2\x15\x16\x3\x2\x2\x2\x16\b\x3\x2\x2\x2\x17\x18\t\x2\x2\x2\x18\x19"+ - "\x3\x2\x2\x2\x19\x1A\b\x5\x2\x2\x1A\n\x3\x2\x2\x2\x5\x2\x10\x15\x3\b\x2"+ - "\x2"; - public static readonly ATN _ATN = - new ATNDeserializer().Deserialize(_serializedATN.ToCharArray()); -} diff --git a/runtime/CSharp/Antlr4.Test.mono/TLexer.tokens b/runtime/CSharp/Antlr4.Test.mono/TLexer.tokens deleted file mode 100644 index f1ce7da40..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/TLexer.tokens +++ /dev/null @@ -1,5 +0,0 @@ -T__0=1 -ID=2 -INT=3 -WS=4 -'!'=1 diff --git a/runtime/CSharp/Antlr4.Test.mono/TListener.cs b/runtime/CSharp/Antlr4.Test.mono/TListener.cs deleted file mode 100644 index c90107f95..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/TListener.cs +++ /dev/null @@ -1,61 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// ANTLR Version: 4.4.1-dev -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// Generated from /users/ericvergnaud/Development/antlr4/antlr/antlr4-csharp/runtime/CSharp/Antlr4.Test.mono/T.g4 by ANTLR 4.4.1-dev - -// Unreachable code detected -#pragma warning disable 0162 -// The variable '...' is assigned but its value is never used -#pragma warning disable 0219 -// Missing XML comment for publicly visible type or member '...' -#pragma warning disable 1591 - -using Antlr4.Runtime.Misc; -using IParseTreeListener = Antlr4.Runtime.Tree.IParseTreeListener; -using IToken = Antlr4.Runtime.IToken; - -/// -/// This interface defines a complete listener for a parse tree produced by -/// . -/// -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.4.1-dev")] -[System.CLSCompliant(false)] -public interface ITListener : IParseTreeListener { - /// - /// Enter a parse tree produced by . - /// - /// The parse tree. - void EnterS([NotNull] TParser.SContext context); - /// - /// Exit a parse tree produced by . - /// - /// The parse tree. - void ExitS([NotNull] TParser.SContext context); - /// - /// Enter a parse tree produced by . - /// - /// The parse tree. - void EnterT([NotNull] TParser.TContext context); - /// - /// Exit a parse tree produced by . - /// - /// The parse tree. - void ExitT([NotNull] TParser.TContext context); - /// - /// Enter a parse tree produced by . - /// - /// The parse tree. - void EnterE([NotNull] TParser.EContext context); - /// - /// Exit a parse tree produced by . - /// - /// The parse tree. - void ExitE([NotNull] TParser.EContext context); -} diff --git a/runtime/CSharp/Antlr4.Test.mono/TParser.cs b/runtime/CSharp/Antlr4.Test.mono/TParser.cs deleted file mode 100644 index 4e67bc266..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/TParser.cs +++ /dev/null @@ -1,257 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// ANTLR Version: 4.4.1-dev -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// Generated from /users/ericvergnaud/Development/antlr4/antlr/antlr4-csharp/runtime/CSharp/Antlr4.Test.mono/T.g4 by ANTLR 4.4.1-dev - -// Unreachable code detected -#pragma warning disable 0162 -// The variable '...' is assigned but its value is never used -#pragma warning disable 0219 -// Missing XML comment for publicly visible type or member '...' -#pragma warning disable 1591 - -using System; -using System.Text; -using System.Diagnostics; -using System.Collections.Generic; -using Antlr4.Runtime; -using Antlr4.Runtime.Atn; -using Antlr4.Runtime.Misc; -using Antlr4.Runtime.Tree; -using DFA = Antlr4.Runtime.Dfa.DFA; - -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.4.1-dev")] -[System.CLSCompliant(false)] -public partial class TParser : Parser { - public const int - T__0=1, ID=2, INT=3, WS=4; - public const int - RULE_s = 0, RULE_t = 1, RULE_e = 2; - public static readonly string[] ruleNames = { - "s", "t", "e" - }; - - private static readonly string[] _LiteralNames = { - null, "'!'" - }; - private static readonly string[] _SymbolicNames = { - null, null, "ID", "INT", "WS" - }; - public static readonly IVocabulary DefaultVocabulary = new Vocabulary(_LiteralNames, _SymbolicNames); - - [NotNull] - public override IVocabulary Vocabulary - { - get - { - return DefaultVocabulary; - } - } - - public override string GrammarFileName { get { return "T.g4"; } } - - public override string[] RuleNames { get { return ruleNames; } } - - public override string SerializedAtn { get { return _serializedATN; } } - - - bool pred(bool v) { - Console.WriteLine("eval="+v.ToString().ToLower()); - return v; - } - - public TParser(ITokenStream input) - : base(input) - { - Interpreter = new ParserATNSimulator(this,_ATN); - } - public partial class SContext : ParserRuleContext { - public EContext e() { - return GetRuleContext(0); - } - public SContext(ParserRuleContext parent, int invokingState) - : base(parent, invokingState) - { - } - public override int RuleIndex { get { return RULE_s; } } - public override void EnterRule(IParseTreeListener listener) { - ITListener typedListener = listener as ITListener; - if (typedListener != null) typedListener.EnterS(this); - } - public override void ExitRule(IParseTreeListener listener) { - ITListener typedListener = listener as ITListener; - if (typedListener != null) typedListener.ExitS(this); - } - public override TResult Accept(IParseTreeVisitor visitor) { - ITVisitor typedVisitor = visitor as ITVisitor; - if (typedVisitor != null) return typedVisitor.VisitS(this); - else return visitor.VisitChildren(this); - } - } - - [RuleVersion(0)] - public SContext s() { - SContext _localctx = new SContext(Context, State); - EnterRule(_localctx, 0, RULE_s); - try { - EnterOuterAlt(_localctx, 1); - { - State = 6; e(); - State = 7; - if (!(this.pred(true))) throw new FailedPredicateException(this, "this.pred(true)"); - Console.WriteLine("parse"); - State = 9; Match(T__0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - ErrorHandler.ReportError(this, re); - ErrorHandler.Recover(this, re); - } - finally { - ExitRule(); - } - return _localctx; - } - - public partial class TContext : ParserRuleContext { - public EContext e() { - return GetRuleContext(0); - } - public ITerminalNode ID() { return GetToken(TParser.ID, 0); } - public TContext(ParserRuleContext parent, int invokingState) - : base(parent, invokingState) - { - } - public override int RuleIndex { get { return RULE_t; } } - public override void EnterRule(IParseTreeListener listener) { - ITListener typedListener = listener as ITListener; - if (typedListener != null) typedListener.EnterT(this); - } - public override void ExitRule(IParseTreeListener listener) { - ITListener typedListener = listener as ITListener; - if (typedListener != null) typedListener.ExitT(this); - } - public override TResult Accept(IParseTreeVisitor visitor) { - ITVisitor typedVisitor = visitor as ITVisitor; - if (typedVisitor != null) return typedVisitor.VisitT(this); - else return visitor.VisitChildren(this); - } - } - - [RuleVersion(0)] - public TContext t() { - TContext _localctx = new TContext(Context, State); - EnterRule(_localctx, 2, RULE_t); - try { - EnterOuterAlt(_localctx, 1); - { - State = 11; e(); - State = 12; - if (!(this.pred(false))) throw new FailedPredicateException(this, "this.pred(false)"); - State = 13; Match(ID); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - ErrorHandler.ReportError(this, re); - ErrorHandler.Recover(this, re); - } - finally { - ExitRule(); - } - return _localctx; - } - - public partial class EContext : ParserRuleContext { - public ITerminalNode ID() { return GetToken(TParser.ID, 0); } - public EContext(ParserRuleContext parent, int invokingState) - : base(parent, invokingState) - { - } - public override int RuleIndex { get { return RULE_e; } } - public override void EnterRule(IParseTreeListener listener) { - ITListener typedListener = listener as ITListener; - if (typedListener != null) typedListener.EnterE(this); - } - public override void ExitRule(IParseTreeListener listener) { - ITListener typedListener = listener as ITListener; - if (typedListener != null) typedListener.ExitE(this); - } - public override TResult Accept(IParseTreeVisitor visitor) { - ITVisitor typedVisitor = visitor as ITVisitor; - if (typedVisitor != null) return typedVisitor.VisitE(this); - else return visitor.VisitChildren(this); - } - } - - [RuleVersion(0)] - public EContext e() { - EContext _localctx = new EContext(Context, State); - EnterRule(_localctx, 4, RULE_e); - try { - State = 17; - switch ( Interpreter.AdaptivePredict(TokenStream,0,Context) ) { - case 1: - EnterOuterAlt(_localctx, 1); - { - State = 15; Match(ID); - } - break; - case 2: - EnterOuterAlt(_localctx, 2); - { - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - ErrorHandler.ReportError(this, re); - ErrorHandler.Recover(this, re); - } - finally { - ExitRule(); - } - return _localctx; - } - - public override bool Sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 0: return s_sempred((SContext)_localctx, predIndex); - case 1: return t_sempred((TContext)_localctx, predIndex); - } - return true; - } - private bool s_sempred(SContext _localctx, int predIndex) { - switch (predIndex) { - case 0: return this.pred(true); - } - return true; - } - private bool t_sempred(TContext _localctx, int predIndex) { - switch (predIndex) { - case 1: return this.pred(false); - } - return true; - } - - public static readonly string _serializedATN = - "\x3\x430\xD6D1\x8206\xAD2D\x4417\xAEF1\x8D80\xAADD\x3\x6\x16\x4\x2\t\x2"+ - "\x4\x3\t\x3\x4\x4\t\x4\x3\x2\x3\x2\x3\x2\x3\x2\x3\x2\x3\x3\x3\x3\x3\x3"+ - "\x3\x3\x3\x4\x3\x4\x5\x4\x14\n\x4\x3\x4\x2\x2\x5\x2\x4\x6\x2\x2\x13\x2"+ - "\b\x3\x2\x2\x2\x4\r\x3\x2\x2\x2\x6\x13\x3\x2\x2\x2\b\t\x5\x6\x4\x2\t\n"+ - "\x6\x2\x2\x2\n\v\b\x2\x1\x2\v\f\a\x3\x2\x2\f\x3\x3\x2\x2\x2\r\xE\x5\x6"+ - "\x4\x2\xE\xF\x6\x3\x3\x2\xF\x10\a\x4\x2\x2\x10\x5\x3\x2\x2\x2\x11\x14"+ - "\a\x4\x2\x2\x12\x14\x3\x2\x2\x2\x13\x11\x3\x2\x2\x2\x13\x12\x3\x2\x2\x2"+ - "\x14\a\x3\x2\x2\x2\x3\x13"; - public static readonly ATN _ATN = - new ATNDeserializer().Deserialize(_serializedATN.ToCharArray()); -} diff --git a/runtime/CSharp/Antlr4.Test.mono/TVisitor.cs b/runtime/CSharp/Antlr4.Test.mono/TVisitor.cs deleted file mode 100644 index c90e5cbce..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/TVisitor.cs +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// ANTLR Version: 4.4.1-dev -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -// Generated from /users/ericvergnaud/Development/antlr4/antlr/antlr4-csharp/runtime/CSharp/Antlr4.Test.mono/T.g4 by ANTLR 4.4.1-dev - -// Unreachable code detected -#pragma warning disable 0162 -// The variable '...' is assigned but its value is never used -#pragma warning disable 0219 -// Missing XML comment for publicly visible type or member '...' -#pragma warning disable 1591 - -using Antlr4.Runtime.Misc; -using Antlr4.Runtime.Tree; -using IToken = Antlr4.Runtime.IToken; - -/// -/// This interface defines a complete generic visitor for a parse tree produced -/// by . -/// -/// The return type of the visit operation. -[System.CodeDom.Compiler.GeneratedCode("ANTLR", "4.4.1-dev")] -[System.CLSCompliant(false)] -public interface ITVisitor : IParseTreeVisitor { - /// - /// Visit a parse tree produced by . - /// - /// The parse tree. - /// The visitor result. - Result VisitS([NotNull] TParser.SContext context); - /// - /// Visit a parse tree produced by . - /// - /// The parse tree. - /// The visitor result. - Result VisitT([NotNull] TParser.TContext context); - /// - /// Visit a parse tree produced by . - /// - /// The parse tree. - /// The visitor result. - Result VisitE([NotNull] TParser.EContext context); -} diff --git a/runtime/CSharp/Antlr4.Test.mono/Test.cs b/runtime/CSharp/Antlr4.Test.mono/Test.cs deleted file mode 100644 index 7af21dcee..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/Test.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using Antlr4.Runtime; -using Antlr4.Runtime.Tree; - -public class Test { - public static void Main(string[] args) { - ICharStream input = new AntlrFileStream("../../input"); - TLexer lex = new TLexer(input); - CommonTokenStream tokens = new CommonTokenStream(lex); - TParser parser = new TParser(tokens); - parser.AddErrorListener(new DiagnosticErrorListener()); - - parser.BuildParseTree = true; - ParserRuleContext tree = parser.s(); - ParseTreeWalker.Default.Walk(new TreeShapeListener(), tree); - } -} - -class TreeShapeListener : IParseTreeListener { - public void VisitTerminal(ITerminalNode node) { } - public void VisitErrorNode(IErrorNode node) { } - public void ExitEveryRule(ParserRuleContext ctx) { } - - public void EnterEveryRule(ParserRuleContext ctx) { - for (int i = 0; i < ctx.ChildCount; i++) { - IParseTree parent = ctx.GetChild(i).Parent; - if (!(parent is IRuleNode) || ((IRuleNode)parent).RuleContext != ctx) { - throw new Exception("Invalid parse tree shape detected."); - } - } - } -} \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.Test.mono/input b/runtime/CSharp/Antlr4.Test.mono/input deleted file mode 100644 index 1bbae8bf1..000000000 --- a/runtime/CSharp/Antlr4.Test.mono/input +++ /dev/null @@ -1 +0,0 @@ -a! \ No newline at end of file diff --git a/runtime/CSharp/Antlr4.VS2008.sln b/runtime/CSharp/Antlr4.VS2008.sln deleted file mode 100644 index 6f666dc70..000000000 --- a/runtime/CSharp/Antlr4.VS2008.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.net35-cf", "Antlr4.Runtime\Antlr4.Runtime.net35-cf.csproj", "{C5F9C476-200F-4440-9524-C5C3F9BE16D7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C5F9C476-200F-4440-9524-C5C3F9BE16D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C5F9C476-200F-4440-9524-C5C3F9BE16D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C5F9C476-200F-4440-9524-C5C3F9BE16D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C5F9C476-200F-4440-9524-C5C3F9BE16D7}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/runtime/CSharp/Antlr4.sln b/runtime/CSharp/Antlr4.sln deleted file mode 100644 index b5560919a..000000000 --- a/runtime/CSharp/Antlr4.sln +++ /dev/null @@ -1,145 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30110.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.net45", "Antlr4.Runtime\Antlr4.Runtime.net45.csproj", "{E1D192DE-5347-48C4-A9F4-A8CBA2AF3869}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{47C0086D-577C-43DA-ADC7-544F27656E45}" - ProjectSection(SolutionItems) = preProject - ..\..\CreatingTargets.md = ..\..\CreatingTargets.md - ..\..\tool\resources\org\antlr\v4\tool\templates\codegen\CSharp\CSharp.stg = ..\..\tool\resources\org\antlr\v4\tool\templates\codegen\CSharp\CSharp.stg - ..\..\tool\src\org\antlr\v4\codegen\CSharpTarget.java = ..\..\tool\src\org\antlr\v4\codegen\CSharpTarget.java - ..\..\tool\pom.xml = ..\..\tool\pom.xml - ..\..\Readme.md = ..\..\Readme.md - ..\..\reference\sharpen-all-options.txt = ..\..\reference\sharpen-all-options.txt - ..\..\reference\sharpen.md = ..\..\reference\sharpen.md - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.Test.net45", "Antlr4.Runtime.Test\Antlr4.Runtime.Test.net45.csproj", "{9D8C43DF-71F9-4CC9-83AD-A39FAEBCECA0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4BuildTasks.net40", "Antlr4BuildTasks\Antlr4BuildTasks.net40.csproj", "{F63DFE80-AE1F-47A6-A31A-E39DA4C837BA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.net40-client", "Antlr4.Runtime\Antlr4.Runtime.net40-client.csproj", "{423978DF-85A4-409E-A16C-453683FE3969}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.net35-client", "Antlr4.Runtime\Antlr4.Runtime.net35-client.csproj", "{E186FDA3-1411-47EE-94C7-9F3745F0474B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.net30", "Antlr4.Runtime\Antlr4.Runtime.net30.csproj", "{EBBDCC35-43CC-416C-860B-9FC115F1EB42}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.net20", "Antlr4.Runtime\Antlr4.Runtime.net20.csproj", "{E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.Test.net40-client", "Antlr4.Runtime.Test\Antlr4.Runtime.Test.net40-client.csproj", "{706D364A-CD4E-4720-B94C-0DB82AF7B433}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.Test.net35-client", "Antlr4.Runtime.Test\Antlr4.Runtime.Test.net35-client.csproj", "{C4A38390-8AA3-45AE-9A70-C392146B37D0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.Test.net30", "Antlr4.Runtime.Test\Antlr4.Runtime.Test.net30.csproj", "{8A2F2331-A4A5-4C7F-8D5D-DEECEF54AEA7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.Test.net20", "Antlr4.Runtime.Test\Antlr4.Runtime.Test.net20.csproj", "{0A4681C4-1248-4ACD-B59F-D6CC17CC2B4C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.portable-net40", "Antlr4.Runtime\Antlr4.Runtime.portable-net40.csproj", "{06C182C5-095C-4D43-9C33-C87E305C6BC2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.Test.portable-net40", "Antlr4.Runtime.Test\Antlr4.Runtime.Test.portable-net40.csproj", "{97C32E42-51B2-4A29-B005-769B63CFEFCA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4BuildTasks.net35", "Antlr4BuildTasks\Antlr4BuildTasks.net35.csproj", "{0D3D20E9-3341-4449-80E7-76A4534F0E55}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{4CE79A54-058D-4940-875E-7F6AA9922A7D}" - ProjectSection(SolutionItems) = preProject - ..\..\build\Antlr4.nuspec = ..\..\build\Antlr4.nuspec - ..\..\build\Antlr4.Runtime.nuspec = ..\..\build\Antlr4.Runtime.nuspec - ..\..\build\Antlr4.VS2008.nuspec = ..\..\build\Antlr4.VS2008.nuspec - ..\..\build\build.ps1 = ..\..\build\build.ps1 - ..\..\build\check-key.ps1 = ..\..\build\check-key.ps1 - build\KeyReporting.targets = build\KeyReporting.targets - ..\..\build\keys.ps1 = ..\..\build\keys.ps1 - ..\..\build\push.ps1 = ..\..\build\push.ps1 - ..\..\build\version.ps1 = ..\..\build\version.ps1 - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.portable-net45", "Antlr4.Runtime\Antlr4.Runtime.portable-net45.csproj", "{12269283-EE92-4FAA-B849-53CD24F341FA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.Test.portable-net45", "Antlr4.Runtime.Test\Antlr4.Runtime.Test.portable-net45.csproj", "{5844076E-3C92-4122-BB7A-0D745C3F5334}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.netcore45", "Antlr4.Runtime\Antlr4.Runtime.netcore45.csproj", "{F3145DCA-EA26-4482-80D6-5232A79E2A3A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E1D192DE-5347-48C4-A9F4-A8CBA2AF3869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E1D192DE-5347-48C4-A9F4-A8CBA2AF3869}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E1D192DE-5347-48C4-A9F4-A8CBA2AF3869}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E1D192DE-5347-48C4-A9F4-A8CBA2AF3869}.Release|Any CPU.Build.0 = Release|Any CPU - {9D8C43DF-71F9-4CC9-83AD-A39FAEBCECA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D8C43DF-71F9-4CC9-83AD-A39FAEBCECA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D8C43DF-71F9-4CC9-83AD-A39FAEBCECA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D8C43DF-71F9-4CC9-83AD-A39FAEBCECA0}.Release|Any CPU.Build.0 = Release|Any CPU - {F63DFE80-AE1F-47A6-A31A-E39DA4C837BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F63DFE80-AE1F-47A6-A31A-E39DA4C837BA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F63DFE80-AE1F-47A6-A31A-E39DA4C837BA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F63DFE80-AE1F-47A6-A31A-E39DA4C837BA}.Release|Any CPU.Build.0 = Release|Any CPU - {423978DF-85A4-409E-A16C-453683FE3969}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {423978DF-85A4-409E-A16C-453683FE3969}.Debug|Any CPU.Build.0 = Debug|Any CPU - {423978DF-85A4-409E-A16C-453683FE3969}.Release|Any CPU.ActiveCfg = Release|Any CPU - {423978DF-85A4-409E-A16C-453683FE3969}.Release|Any CPU.Build.0 = Release|Any CPU - {E186FDA3-1411-47EE-94C7-9F3745F0474B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E186FDA3-1411-47EE-94C7-9F3745F0474B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E186FDA3-1411-47EE-94C7-9F3745F0474B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E186FDA3-1411-47EE-94C7-9F3745F0474B}.Release|Any CPU.Build.0 = Release|Any CPU - {EBBDCC35-43CC-416C-860B-9FC115F1EB42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBBDCC35-43CC-416C-860B-9FC115F1EB42}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBBDCC35-43CC-416C-860B-9FC115F1EB42}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBBDCC35-43CC-416C-860B-9FC115F1EB42}.Release|Any CPU.Build.0 = Release|Any CPU - {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}.Release|Any CPU.Build.0 = Release|Any CPU - {706D364A-CD4E-4720-B94C-0DB82AF7B433}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {706D364A-CD4E-4720-B94C-0DB82AF7B433}.Debug|Any CPU.Build.0 = Debug|Any CPU - {706D364A-CD4E-4720-B94C-0DB82AF7B433}.Release|Any CPU.ActiveCfg = Release|Any CPU - {706D364A-CD4E-4720-B94C-0DB82AF7B433}.Release|Any CPU.Build.0 = Release|Any CPU - {C4A38390-8AA3-45AE-9A70-C392146B37D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4A38390-8AA3-45AE-9A70-C392146B37D0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4A38390-8AA3-45AE-9A70-C392146B37D0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4A38390-8AA3-45AE-9A70-C392146B37D0}.Release|Any CPU.Build.0 = Release|Any CPU - {8A2F2331-A4A5-4C7F-8D5D-DEECEF54AEA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A2F2331-A4A5-4C7F-8D5D-DEECEF54AEA7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A2F2331-A4A5-4C7F-8D5D-DEECEF54AEA7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A2F2331-A4A5-4C7F-8D5D-DEECEF54AEA7}.Release|Any CPU.Build.0 = Release|Any CPU - {0A4681C4-1248-4ACD-B59F-D6CC17CC2B4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0A4681C4-1248-4ACD-B59F-D6CC17CC2B4C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0A4681C4-1248-4ACD-B59F-D6CC17CC2B4C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0A4681C4-1248-4ACD-B59F-D6CC17CC2B4C}.Release|Any CPU.Build.0 = Release|Any CPU - {06C182C5-095C-4D43-9C33-C87E305C6BC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {06C182C5-095C-4D43-9C33-C87E305C6BC2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {06C182C5-095C-4D43-9C33-C87E305C6BC2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {06C182C5-095C-4D43-9C33-C87E305C6BC2}.Release|Any CPU.Build.0 = Release|Any CPU - {97C32E42-51B2-4A29-B005-769B63CFEFCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97C32E42-51B2-4A29-B005-769B63CFEFCA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97C32E42-51B2-4A29-B005-769B63CFEFCA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97C32E42-51B2-4A29-B005-769B63CFEFCA}.Release|Any CPU.Build.0 = Release|Any CPU - {0D3D20E9-3341-4449-80E7-76A4534F0E55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D3D20E9-3341-4449-80E7-76A4534F0E55}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D3D20E9-3341-4449-80E7-76A4534F0E55}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D3D20E9-3341-4449-80E7-76A4534F0E55}.Release|Any CPU.Build.0 = Release|Any CPU - {12269283-EE92-4FAA-B849-53CD24F341FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {12269283-EE92-4FAA-B849-53CD24F341FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12269283-EE92-4FAA-B849-53CD24F341FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12269283-EE92-4FAA-B849-53CD24F341FA}.Release|Any CPU.Build.0 = Release|Any CPU - {5844076E-3C92-4122-BB7A-0D745C3F5334}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5844076E-3C92-4122-BB7A-0D745C3F5334}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5844076E-3C92-4122-BB7A-0D745C3F5334}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5844076E-3C92-4122-BB7A-0D745C3F5334}.Release|Any CPU.Build.0 = Release|Any CPU - {F3145DCA-EA26-4482-80D6-5232A79E2A3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3145DCA-EA26-4482-80D6-5232A79E2A3A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3145DCA-EA26-4482-80D6-5232A79E2A3A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3145DCA-EA26-4482-80D6-5232A79E2A3A}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {4CE79A54-058D-4940-875E-7F6AA9922A7D} = {47C0086D-577C-43DA-ADC7-544F27656E45} - EndGlobalSection -EndGlobal diff --git a/runtime/CSharp/Antlr4.vs2013.sln b/runtime/CSharp/Antlr4.vs2013.sln new file mode 100644 index 000000000..760ea02bd --- /dev/null +++ b/runtime/CSharp/Antlr4.vs2013.sln @@ -0,0 +1,24 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{47C0086D-577C-43DA-ADC7-544F27656E45}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Antlr4.Runtime.vs2013", "Antlr4.Runtime\Antlr4.Runtime.vs2013.csproj", "{E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/runtime/CSharp/Antlr4.userprefs b/runtime/CSharp/Antlr4.vs2013.userprefs similarity index 100% rename from runtime/CSharp/Antlr4.userprefs rename to runtime/CSharp/Antlr4.vs2013.userprefs diff --git a/runtime/CSharp/Antlr4BuildTasks/Antlr4.net35.props b/runtime/CSharp/Antlr4BuildTasks/Antlr4.net35.props deleted file mode 100644 index 6240f1ffc..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Antlr4.net35.props +++ /dev/null @@ -1,9 +0,0 @@ - - - - - . - - ..\tools\antlr4-csharp-4.4.1-SNAPSHOT-complete.jar - - diff --git a/runtime/CSharp/Antlr4BuildTasks/Antlr4.net35.targets b/runtime/CSharp/Antlr4BuildTasks/Antlr4.net35.targets deleted file mode 100644 index 69e5e8c82..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Antlr4.net35.targets +++ /dev/null @@ -1,188 +0,0 @@ - - - - MSBuild - 4.0.0.0 - eb42632606e9261f - Antlr4BuildTasks.net35, Version=$(TaskVersion), Culture=neutral, PublicKeyToken=$(TaskKeyToken) - - - - - $(LoadTimeSensitiveTargets); - Antlr4Compile; - Antlr4CompileAddFilesGenerated; - - - $(LoadTimeSensitiveProperties); - Antlr4CompileDependsOn; - Antlr4CompileAddFilesGeneratedDependsOn; - - - - - $(MSBuildBinPath) - $(Antlr4BuildTaskPath) - $(MSBuildBinPath)\Antlr4\antlr4-csharp-4.4.1-SNAPSHOT-complete.jar - $(Antlr4ToolPath) - - JavaSoft - Java Runtime Environment - - - - $(MSBuildProjectFile).Antlr4GeneratedCodeFileListAbsolute.txt - - - - - - - - Antlr4Compile; - Antlr4CompileAddFilesGenerated; - $(PrepareResourcesDependsOn) - - - - - - Antlr4CompileReadGeneratedFileList - - - Antlr4Compile - - - - - - - - - - - - MSBuild:Compile - $(RootNamespace) - CSharp - true - true - false - false - - - - - - - - - - - - - Antlr4DesignTimeGrammarCompilation; - $(CoreCompileDependsOn) - - - - - - - - - - - - - - - - <_IntellisenseOnlyCompile>false - <_IntellisenseOnlyCompile Condition="'$(BuildingProject)' != 'true'">true - - - - - - - - - - - - - - - - - - - - - - - - <_GeneratedCodeFiles Include="@(Antlr4GeneratedCodeFiles)" /> - - - - diff --git a/runtime/CSharp/Antlr4BuildTasks/Antlr4.net40.props b/runtime/CSharp/Antlr4BuildTasks/Antlr4.net40.props deleted file mode 100644 index 0ccdf5b9b..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Antlr4.net40.props +++ /dev/null @@ -1,9 +0,0 @@ - - - - - . - - ..\tools\antlr4-csharp-4.4.1-SNAPSHOT-complete.jar - - diff --git a/runtime/CSharp/Antlr4BuildTasks/Antlr4.net40.targets b/runtime/CSharp/Antlr4BuildTasks/Antlr4.net40.targets deleted file mode 100644 index 185762ea8..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Antlr4.net40.targets +++ /dev/null @@ -1,182 +0,0 @@ - - - - MSBuild - 4.0.0.0 - eb42632606e9261f - Antlr4BuildTasks.net40, Version=$(TaskVersion), Culture=neutral, PublicKeyToken=$(TaskKeyToken) - - - - - $(LoadTimeSensitiveTargets); - Antlr4Compile; - - - $(LoadTimeSensitiveProperties); - Antlr4CompileDependsOn; - - - - - $(MSBuildBinPath) - $(Antlr4BuildTaskPath) - $(MSBuildBinPath)\Antlr4\antlr4-csharp-4.4.1-SNAPSHOT-complete.jar - $(Antlr4ToolPath) - - JavaSoft - Java Runtime Environment - - - - $(MSBuildProjectFile).Antlr4GeneratedCodeFileListAbsolute.txt - - - - - - - - Antlr4Compile; - Antlr4CompileAddFilesGenerated; - $(PrepareResourcesDependsOn) - - - - - - Antlr4CompileReadGeneratedFileList - - - - - - - - - - - - MSBuild:Compile - $(RootNamespace) - CSharp - true - true - false - false - - - - - - - - - - - - - Antlr4DesignTimeGrammarCompilation; - $(CoreCompileDependsOn) - - - - - - - - - - - - - - - - <_IntellisenseOnlyCompile>false - <_IntellisenseOnlyCompile Condition="'$(BuildingProject)' != 'true'">true - - - - - - - - - - - - - - - - - - - - - - - <_GeneratedCodeFiles Include="@(Antlr4GeneratedCodeFiles)" /> - - - - diff --git a/runtime/CSharp/Antlr4BuildTasks/Antlr4BuildTasks.net35.csproj b/runtime/CSharp/Antlr4BuildTasks/Antlr4BuildTasks.net35.csproj deleted file mode 100644 index 5d0d2692b..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Antlr4BuildTasks.net35.csproj +++ /dev/null @@ -1,83 +0,0 @@ - - - - - Debug - AnyCPU - {0D3D20E9-3341-4449-80E7-76A4534F0E55} - Library - Properties - Antlr4.Build.Tasks - Antlr4BuildTasks.net35 - v3.5 - 512 - obj\net35\ - - - true - full - false - bin\net35\Debug\ - DEBUG;TRACE;NET35;NET35PLUS - prompt - 4 - ExtendedDesignGuidelineRules.ruleset - - - pdbonly - true - bin\net35\Release\ - TRACE;NET35;NET35PLUS - prompt - 4 - - - true - - - ..\..\..\..\..\..\keys\antlr\Key.snk - - - - - - - - - - - - - - - - - - - - - - Always - - - Always - Designer - - - Key.snk - - - - - CustomDictionary.xml - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4BuildTasks/Antlr4BuildTasks.net40.csproj b/runtime/CSharp/Antlr4BuildTasks/Antlr4BuildTasks.net40.csproj deleted file mode 100644 index 7d77c6b89..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Antlr4BuildTasks.net40.csproj +++ /dev/null @@ -1,84 +0,0 @@ - - - - - Debug - AnyCPU - {F63DFE80-AE1F-47A6-A31A-E39DA4C837BA} - Library - Properties - Antlr4.Build.Tasks - Antlr4BuildTasks.net40 - v4.0 - 512 - obj\net40\ - - - true - full - false - bin\net40\Debug\ - DEBUG;TRACE;NET40;NET40PLUS;NET35PLUS - prompt - 4 - ExtendedDesignGuidelineRules.ruleset - - - pdbonly - true - bin\net40\Release\ - TRACE;NET40;NET40PLUS;NET35PLUS - prompt - 4 - - - true - - - ..\..\..\..\..\..\keys\antlr\Key.snk - - - - - - - - - - - - - - - - - - - - - - - Always - - - Always - Designer - - - Key.snk - - - - - CustomDictionary.xml - - - - - \ No newline at end of file diff --git a/runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTask.cs b/runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTask.cs deleted file mode 100644 index fb4b46dfd..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTask.cs +++ /dev/null @@ -1,367 +0,0 @@ -/* - * [The "BSD licence"] - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -namespace Antlr4.Build.Tasks -{ - using System; - using System.Collections.Generic; - using System.Diagnostics; - using System.Diagnostics.CodeAnalysis; - using System.Linq; - using System.Reflection; - using System.Security; - using System.Security.Policy; - using System.Threading; - using Microsoft.Build.Framework; - using Microsoft.Build.Utilities; - using Directory = System.IO.Directory; - using File = System.IO.File; - using FileAttributes = System.IO.FileAttributes; - using Path = System.IO.Path; - - public class Antlr4ClassGenerationTask - : Task - { - private static AppDomain _sharedAppDomain; - - private const string DefaultGeneratedSourceExtension = "g4"; - private List _generatedCodeFiles = new List(); - - public Antlr4ClassGenerationTask() - { - this.GeneratedSourceExtension = DefaultGeneratedSourceExtension; - } - - [Required] - public string ToolPath - { - get; - set; - } - - [Required] - public string OutputPath - { - get; - set; - } - - public string TargetLanguage - { - get; - set; - } - - public string TargetFrameworkVersion - { - get; - set; - } - - public string BuildTaskPath - { - get; - set; - } - - public ITaskItem[] SourceCodeFiles - { - get; - set; - } - - public ITaskItem[] TokensFiles - { - get; - set; - } - - public ITaskItem[] AbstractGrammarFiles - { - get; - set; - } - - public string GeneratedSourceExtension - { - get; - set; - } - - public string TargetNamespace - { - get; - set; - } - - public string[] LanguageSourceExtensions - { - get; - set; - } - - public bool GenerateListener - { - get; - set; - } - - public bool GenerateVisitor - { - get; - set; - } - - public bool ForceAtn - { - get; - set; - } - - public bool AbstractGrammar - { - get; - set; - } - - [Required] - public string JavaVendor - { - get; - set; - } - - [Required] - public string JavaInstallation - { - get; - set; - } - - public string JavaExecutable - { - get; - set; - } - - [Output] - public ITaskItem[] GeneratedCodeFiles - { - get - { - return this._generatedCodeFiles.ToArray(); - } - set - { - this._generatedCodeFiles = new List(value); - } - } - - [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] - public AppDomain GetAntlrTaskAppDomain() - { - if (_sharedAppDomain != null) - return _sharedAppDomain; - - AppDomainSetup info = new AppDomainSetup - { - ApplicationBase = BuildTaskPath, - LoaderOptimization = LoaderOptimization.MultiDomainHost, - ShadowCopyFiles = "true" - }; - - string friendlyName = "AntlrClassGenerationDomain_" + Guid.NewGuid(); - _sharedAppDomain = AppDomain.CreateDomain(friendlyName, AppDomain.CurrentDomain.Evidence, info, new NamedPermissionSet("FullTrust"), new StrongName[0]); - return _sharedAppDomain; - } - - public override bool Execute() - { - AppDomain domain = null; - bool success; - - if (!Path.IsPathRooted(ToolPath)) - ToolPath = Path.Combine(Path.GetDirectoryName(BuildEngine.ProjectFileOfTaskNode), ToolPath); - - if (!Path.IsPathRooted(BuildTaskPath)) - BuildTaskPath = Path.Combine(Path.GetDirectoryName(BuildEngine.ProjectFileOfTaskNode), BuildTaskPath); - - try - { - domain = GetAntlrTaskAppDomain(); - AntlrClassGenerationTaskInternal wrapper = CreateBuildTaskWrapper(domain); - success = wrapper.Execute(); - - if (success) - { - _generatedCodeFiles.AddRange(wrapper.GeneratedCodeFiles.Select(file => (ITaskItem)new TaskItem(file))); - } - - foreach (BuildMessage message in wrapper.BuildMessages) - { - ProcessBuildMessage(message); - } - } - catch (Exception exception) - { - if (IsFatalException(exception)) - throw; - - ProcessExceptionAsBuildMessage(exception); - success = false; - } - finally - { - if (domain != null && domain != _sharedAppDomain) - AppDomain.Unload(domain); - } - - return success; - } - - private void ProcessExceptionAsBuildMessage(Exception exception) - { - ProcessBuildMessage(new BuildMessage(exception.Message)); - } - - private void ProcessBuildMessage(BuildMessage message) - { - string logMessage; - string errorCode; - errorCode = Log.ExtractMessageCode(message.Message, out logMessage); - if (string.IsNullOrEmpty(errorCode)) - { - errorCode = "AC1000"; - logMessage = "Unknown build error: " + message.Message; - } - - string subcategory = null; - string helpKeyword = null; - - switch (message.Severity) - { - case TraceLevel.Error: - this.Log.LogError(subcategory, errorCode, helpKeyword, message.FileName, message.LineNumber, message.ColumnNumber, 0, 0, logMessage); - break; - case TraceLevel.Warning: - this.Log.LogWarning(subcategory, errorCode, helpKeyword, message.FileName, message.LineNumber, message.ColumnNumber, 0, 0, logMessage); - break; - case TraceLevel.Info: - this.Log.LogMessage(MessageImportance.Normal, logMessage); - break; - case TraceLevel.Verbose: - this.Log.LogMessage(MessageImportance.Low, logMessage); - break; - } - } - - private AntlrClassGenerationTaskInternal CreateBuildTaskWrapper(AppDomain domain) - { - AntlrClassGenerationTaskInternal wrapper = (AntlrClassGenerationTaskInternal)domain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(AntlrClassGenerationTaskInternal).FullName); - - IList sourceCodeFiles = null; - if (this.SourceCodeFiles != null) - { - sourceCodeFiles = new List(SourceCodeFiles.Length); - foreach (ITaskItem taskItem in SourceCodeFiles) - sourceCodeFiles.Add(taskItem.ItemSpec); - } - - if (this.TokensFiles != null && this.TokensFiles.Length > 0) - { - Directory.CreateDirectory(OutputPath); - - HashSet copied = new HashSet(StringComparer.OrdinalIgnoreCase); - foreach (ITaskItem taskItem in TokensFiles) - { - string fileName = taskItem.ItemSpec; - if (!File.Exists(fileName)) - { - Log.LogError("The tokens file '{0}' does not exist.", fileName); - continue; - } - - string vocabName = Path.GetFileNameWithoutExtension(fileName); - if (!copied.Add(vocabName)) - { - Log.LogWarning("The tokens file '{0}' conflicts with another tokens file in the same project.", fileName); - continue; - } - - string target = Path.Combine(OutputPath, Path.GetFileName(fileName)); - if (!Path.GetExtension(target).Equals(".tokens", StringComparison.OrdinalIgnoreCase)) - { - Log.LogError("The destination for the tokens file '{0}' did not have the correct extension '.tokens'.", target); - continue; - } - - File.Copy(fileName, target, true); - File.SetAttributes(target, File.GetAttributes(target) & ~FileAttributes.ReadOnly); - } - } - - wrapper.ToolPath = ToolPath; - wrapper.SourceCodeFiles = sourceCodeFiles; - wrapper.TargetLanguage = TargetLanguage; - wrapper.TargetFrameworkVersion = TargetFrameworkVersion; - wrapper.OutputPath = OutputPath; - wrapper.LanguageSourceExtensions = LanguageSourceExtensions; - wrapper.TargetNamespace = TargetNamespace; - wrapper.GenerateListener = GenerateListener; - wrapper.GenerateVisitor = GenerateVisitor; - wrapper.ForceAtn = ForceAtn; - wrapper.AbstractGrammar = AbstractGrammar; - wrapper.JavaVendor = JavaVendor; - wrapper.JavaInstallation = JavaInstallation; - wrapper.JavaExecutable = JavaExecutable; - return wrapper; - } - - internal static bool IsFatalException(Exception exception) - { - while (exception != null) - { - if ((exception is OutOfMemoryException) - || (exception is InsufficientMemoryException) - || (exception is ThreadAbortException)) - { - return true; - } - - if (!(exception is TypeInitializationException) && !(exception is TargetInvocationException)) - { - break; - } - - exception = exception.InnerException; - } - - return false; - } - } -} diff --git a/runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTaskInternal.cs b/runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTaskInternal.cs deleted file mode 100644 index d14fc45bf..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTaskInternal.cs +++ /dev/null @@ -1,428 +0,0 @@ -/* - * [The "BSD licence"] - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -namespace Antlr4.Build.Tasks -{ - using System; - using System.Collections.Generic; - using System.Diagnostics; - using System.IO; - using System.Linq; - using System.Reflection; - using System.Text.RegularExpressions; - using RegistryHive = Microsoft.Win32.RegistryHive; - using RegistryKey = Microsoft.Win32.RegistryKey; -#if NET40PLUS - using RegistryView = Microsoft.Win32.RegistryView; -#else - using Registry = Microsoft.Win32.Registry; -#endif - using StringBuilder = System.Text.StringBuilder; - - internal class AntlrClassGenerationTaskInternal : MarshalByRefObject - { - private List _generatedCodeFiles = new List(); - private IList _sourceCodeFiles = new List(); - private List _buildMessages = new List(); - - public IList GeneratedCodeFiles - { - get - { - return this._generatedCodeFiles; - } - } - - public string ToolPath - { - get; - set; - } - - public string TargetLanguage - { - get; - set; - } - - public string TargetFrameworkVersion - { - get; - set; - } - - public string OutputPath - { - get; - set; - } - - public string TargetNamespace - { - get; - set; - } - - public string[] LanguageSourceExtensions - { - get; - set; - } - - public bool GenerateListener - { - get; - set; - } - - public bool GenerateVisitor - { - get; - set; - } - - public bool ForceAtn - { - get; - set; - } - - public bool AbstractGrammar - { - get; - set; - } - - public string JavaVendor - { - get; - set; - } - - public string JavaInstallation - { - get; - set; - } - - public string JavaExecutable - { - get; - set; - } - - public IList SourceCodeFiles - { - get - { - return this._sourceCodeFiles; - } - set - { - this._sourceCodeFiles = value; - } - } - - public IList BuildMessages - { - get - { - return _buildMessages; - } - } - -#if NET40PLUS - private string JavaHome - { - get - { - string javaHome; - if (TryGetJavaHome(RegistryView.Default, JavaVendor, JavaInstallation, out javaHome)) - return javaHome; - - if (TryGetJavaHome(RegistryView.Registry64, JavaVendor, JavaInstallation, out javaHome)) - return javaHome; - - if (TryGetJavaHome(RegistryView.Registry32, JavaVendor, JavaInstallation, out javaHome)) - return javaHome; - - throw new NotSupportedException("Could not locate a Java installation."); - } - } - - private static bool TryGetJavaHome(RegistryView registryView, string vendor, string installation, out string javaHome) - { - javaHome = null; - - string javaKeyName = "SOFTWARE\\" + vendor + "\\" + installation; - using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView)) - { - using (RegistryKey javaKey = baseKey.OpenSubKey(javaKeyName)) - { - if (javaKey == null) - return false; - - object currentVersion = javaKey.GetValue("CurrentVersion"); - if (currentVersion == null) - return false; - - using (var homeKey = javaKey.OpenSubKey(currentVersion.ToString())) - { - if (homeKey == null || homeKey.GetValue("JavaHome") == null) - return false; - - javaHome = homeKey.GetValue("JavaHome").ToString(); - return !string.IsNullOrEmpty(javaHome); - } - } - } - } -#else - private string JavaHome - { - get - { - string javaHome; - if (TryGetJavaHome(Registry.LocalMachine, JavaVendor, JavaInstallation, out javaHome)) - return javaHome; - - throw new NotSupportedException("Could not locate a Java installation."); - } - } - - private static bool TryGetJavaHome(RegistryKey baseKey, string vendor, string installation, out string javaHome) - { - javaHome = null; - - string javaKeyName = "SOFTWARE\\" + vendor + "\\" + installation; - using (RegistryKey javaKey = baseKey.OpenSubKey(javaKeyName)) - { - if (javaKey == null) - return false; - - object currentVersion = javaKey.GetValue("CurrentVersion"); - if (currentVersion == null) - return false; - - using (var homeKey = javaKey.OpenSubKey(currentVersion.ToString())) - { - if (homeKey == null || homeKey.GetValue("JavaHome") == null) - return false; - - javaHome = homeKey.GetValue("JavaHome").ToString(); - return !string.IsNullOrEmpty(javaHome); - } - } - } -#endif - - public bool Execute() - { - try - { - string java; - if (!string.IsNullOrEmpty(JavaExecutable)) - { - java = JavaExecutable; - } - else - { - string javaHome = JavaHome; - java = Path.Combine(Path.Combine(javaHome, "bin"), "java.exe"); - } - - List arguments = new List(); - arguments.Add("-cp"); - arguments.Add(ToolPath); - arguments.Add("org.antlr.v4.CSharpTool"); - - arguments.Add("-o"); - arguments.Add(OutputPath); - - if (GenerateListener) - arguments.Add("-listener"); - else - arguments.Add("-no-listener"); - - if (GenerateVisitor) - arguments.Add("-visitor"); - else - arguments.Add("-no-visitor"); - - if (ForceAtn) - arguments.Add("-Xforce-atn"); - - if (AbstractGrammar) - arguments.Add("-Dabstract=true"); - - if (!string.IsNullOrEmpty(TargetLanguage)) - { - string framework = TargetFrameworkVersion; - if (string.IsNullOrEmpty(framework)) - framework = "v2.0"; - if (framework.StartsWith("v4.5.")) - framework = "v4.5"; - - string language; - if (TargetLanguage.Equals("CSharp", StringComparison.OrdinalIgnoreCase)) - language = TargetLanguage + '_' + framework.Replace('.', '_'); - else - language = TargetLanguage; - - arguments.Add("-Dlanguage=" + language); - } - - if (!string.IsNullOrEmpty(TargetNamespace)) - { - arguments.Add("-package"); - arguments.Add(TargetNamespace); - } - - arguments.AddRange(SourceCodeFiles); - - ProcessStartInfo startInfo = new ProcessStartInfo(java, JoinArguments(arguments)) - { - UseShellExecute = false, - CreateNoWindow = true, - RedirectStandardInput = true, - RedirectStandardOutput = true, - RedirectStandardError = true, - }; - - this.BuildMessages.Add(new BuildMessage(TraceLevel.Info, "Executing command: \"" + startInfo.FileName + "\" " + startInfo.Arguments, "", 0, 0)); - - Process process = new Process(); - process.StartInfo = startInfo; - process.ErrorDataReceived += HandleErrorDataReceived; - process.OutputDataReceived += HandleOutputDataReceived; - process.Start(); - process.BeginErrorReadLine(); - process.BeginOutputReadLine(); - process.StandardInput.Close(); - process.WaitForExit(); - - return process.ExitCode == 0; - //using (LoggingTraceListener traceListener = new LoggingTraceListener(_buildMessages)) - //{ - // SetTraceListener(traceListener); - // ProcessArgs(args.ToArray()); - // process(); - //} - - //_generatedCodeFiles.AddRange(GetGeneratedFiles().Where(file => LanguageSourceExtensions.Contains(Path.GetExtension(file), StringComparer.OrdinalIgnoreCase))); - - //int errorCount = GetNumErrors(); - //return errorCount == 0; - } - catch (Exception e) - { - if (e is TargetInvocationException && e.InnerException != null) - e = e.InnerException; - - _buildMessages.Add(new BuildMessage(e.Message)); - throw; - } - } - - private static string JoinArguments(IEnumerable arguments) - { - if (arguments == null) - throw new ArgumentNullException("arguments"); - - StringBuilder builder = new StringBuilder(); - foreach (string argument in arguments) - { - if (builder.Length > 0) - builder.Append(' '); - - if (argument.IndexOfAny(new[] { '"', ' ' }) < 0) - { - builder.Append(argument); - continue; - } - - // escape a backslash appearing before a quote - string arg = argument.Replace("\\\"", "\\\\\""); - // escape double quotes - arg = arg.Replace("\"", "\\\""); - - // wrap the argument in outer quotes - builder.Append('"').Append(arg).Append('"'); - } - - return builder.ToString(); - } - - private static readonly Regex GeneratedFileMessageFormat = new Regex(@"^Generating file '(?.*?)' for grammar '(?.*?)'$", RegexOptions.Compiled); - - private void HandleErrorDataReceived(object sender, DataReceivedEventArgs e) - { - if (string.IsNullOrEmpty(e.Data)) - return; - - try - { - _buildMessages.Add(new BuildMessage(e.Data)); - } - catch (Exception ex) - { - if (Antlr4ClassGenerationTask.IsFatalException(ex)) - throw; - - _buildMessages.Add(new BuildMessage(ex.Message)); - } - } - - private void HandleOutputDataReceived(object sender, DataReceivedEventArgs e) - { - if (string.IsNullOrEmpty(e.Data)) - return; - - try - { - Match match = GeneratedFileMessageFormat.Match(e.Data); - if (!match.Success) - { - _buildMessages.Add(new BuildMessage(e.Data)); - return; - } - - string fileName = match.Groups["OUTPUT"].Value; - if (LanguageSourceExtensions.Contains(Path.GetExtension(fileName), StringComparer.OrdinalIgnoreCase)) - GeneratedCodeFiles.Add(match.Groups["OUTPUT"].Value); - } - catch (Exception ex) - { - if (Antlr4ClassGenerationTask.IsFatalException(ex)) - throw; - - _buildMessages.Add(new BuildMessage(ex.Message)); - } - } - } -} diff --git a/runtime/CSharp/Antlr4BuildTasks/BuildMessage.cs b/runtime/CSharp/Antlr4BuildTasks/BuildMessage.cs deleted file mode 100644 index fb0f876b5..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/BuildMessage.cs +++ /dev/null @@ -1,120 +0,0 @@ -/* - * [The "BSD licence"] - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -namespace Antlr4.Build.Tasks -{ - using System; - using System.Diagnostics; - using System.Text.RegularExpressions; - - [Serializable] - internal struct BuildMessage - { - private static readonly Regex BuildMessageFormat = new Regex(@"^\s*(?[a-z]+)\((?[0-9]+)\):\s*((?.*):(?[0-9]+):(?[0-9]+):)?\s*(?:syntax error:\s*)?(?.*)$", RegexOptions.Compiled); - - public BuildMessage(string message) - : this(TraceLevel.Error, message, null, 0, 0) - { - try - { - Match match = BuildMessageFormat.Match(message); - if (match.Success) - { - FileName = match.Groups["FILE"].Length > 0 ? match.Groups["FILE"].Value : ""; - LineNumber = match.Groups["LINE"].Length > 0 ? int.Parse(match.Groups["LINE"].Value) : 0; - ColumnNumber = match.Groups["COLUMN"].Length > 0 ? int.Parse(match.Groups["COLUMN"].Value) + 1 : 0; - - switch (match.Groups["SEVERITY"].Value) - { - case "warning": - Severity = TraceLevel.Warning; - break; - case "error": - Severity = TraceLevel.Error; - break; - default: - Severity = TraceLevel.Info; - break; - } - - int code = int.Parse(match.Groups["CODE"].Value); - Message = string.Format("AC{0:0000}: {1}", code, match.Groups["MESSAGE"].Value); - } - else - { - Message = message; - } - } - catch (Exception ex) - { - if (Antlr4ClassGenerationTask.IsFatalException(ex)) - throw; - } - } - - public BuildMessage(TraceLevel severity, string message, string fileName, int lineNumber, int columnNumber) - : this() - { - Severity = severity; - Message = message; - FileName = fileName; - LineNumber = lineNumber; - ColumnNumber = columnNumber; - } - - public TraceLevel Severity - { - get; - set; - } - - public string Message - { - get; - set; - } - - public string FileName - { - get; - set; - } - - public int LineNumber - { - get; - set; - } - - public int ColumnNumber - { - get; - set; - } - } -} diff --git a/runtime/CSharp/Antlr4BuildTasks/GlobalSuppressions.cs b/runtime/CSharp/Antlr4BuildTasks/GlobalSuppressions.cs deleted file mode 100644 index 6df54684843dae2d078323ae954ffe56726e58d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4012 zcmdUyTW{M&5QXQtK>x!+FTJ3toAj-HqGdTTpxCZN#Wjiom1QS!E6au`$MBzTa=sa_ zmXw4vuLU8IyPTalbLO(kkN@u3_x81YWl8sBe^_nr?MhEQ+qbbD=xJ`(Hq+d~|9kdl zOTKTnc4v>al*~J=TuJ_0$$h8$3;W5Q+s}F$+thA!f2I4<9;9oot5~gkoLX8MNiQYW z=(n^F`oFXv*DK1(k-xc?+{#y9*u9>vg=!%UQ~h7+e(!pc=9z8u_FmHXRAesvE%+Wa z`&KebVQ%aPjUM!FCGV2YmN9x(Yg9?{x3YJw)i5?)BS8n6v3I9`G^26l=$Tt;C4x!slf1ZfABYKTp@pbM_Jy6mv&-ia#cX{STkzC~ zv$g_Lr{8^|AUJT}T}JI_|6-*zbnc zfh4fZ%7W;~UhC~p_QG1=8M&6)XUE7viChn4M_$ zRB~gjLNX$Ohhz7)(i8R%IvouE!)MriqaV14DHw;kipSk}?YkYY)_~1 zC){DJJ69Nrs6?&=H$z`DmRD%NPRx)6gQr;I=ef&87WKuzv2*a77zuA;Ws>Det188t z{NdCQHg{)2LH1u65qVBD@D+}O!-)A<^PG!_SgmLBDG9@gt^>yr$cfv?tEI1}vHdEk zp~o{ao&1?-ejslPHhdzFU^nyxn#iEg67%Hu*gekGgZH2r>6(aT5W*fOu~&LJ(>pSP z>g>x#Sf`G2o+2Hi^A@J45Uf(O!9vcHlITA1DgoA|L1o#3i_*1JI*JLP-4#oD*`55h!1-(dOPnw+VlVarQfR zi{LJ13o_oKal41&Pp(IJA^Mf_g>DKSq7ckx3sL)^>-LnAh4h_n6_mcd=X`-|Pgm@T zvA?iq%zd|taoOoEd>`aIALqMDdm=mZqwgDyw8UP>j>#FQocPAtFYkOe*KqFbAPs6cFEXz|JK`?^o8Hy>8bCj`OP!;mHl=u zEzJhb*bPB&B};KWU=QWw9p_d~1y~0czN|EgeKsR~rEj9|C+WnY{OV~vFZZ5W&&iR79@{RXQ zcH*n>AI;~J6?lk$j(hieprH9&j&bGz+gw`X+v`r)Bi}N*o@%C>aqPuy+dbzaGu*~n zQ1nz=L~T=7{&qZ+RVt;|Vl=5Ia1Kl2k<7@a#)ag%@e8JRvs`MaWOU{^PRI+{p!TS~ I$Zl|d0xfK7xc~qF diff --git a/runtime/CSharp/Antlr4BuildTasks/Properties/AssemblyInfo.cs b/runtime/CSharp/Antlr4BuildTasks/Properties/AssemblyInfo.cs deleted file mode 100644 index 7cce6b570..000000000 --- a/runtime/CSharp/Antlr4BuildTasks/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,75 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2013 Terence Parr - * Copyright (c) 2013 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -#if NET40 -[assembly: AssemblyTitle("Antlr4BuildTasks.net40")] -[assembly: AssemblyProduct("Antlr4BuildTasks.net40")] -#elif NET35 -[assembly: AssemblyTitle("Antlr4BuildTasks.net35")] -[assembly: AssemblyProduct("Antlr4BuildTasks.net35")] -#else -#error Unknown assembly. -#endif -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Tunnel Vision Laboratories, LLC")] -[assembly: AssemblyCopyright("Copyright © Sam Harwell 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("e79060d9-d211-4367-925a-5541943d3857")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("4.4.0.0")] -[assembly: AssemblyFileVersion("4.4.1.0")] -[assembly: AssemblyInformationalVersion("4.4.1-dev")] diff --git a/runtime/CSharp/build/CodeAnalysisDictionary.xsd b/runtime/CSharp/build/CodeAnalysisDictionary.xsd deleted file mode 100644 index aaf062ea5..000000000 --- a/runtime/CSharp/build/CodeAnalysisDictionary.xsd +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime/CSharp/build/CustomDictionary.xml b/runtime/CSharp/build/CustomDictionary.xml deleted file mode 100644 index e7ee58453..000000000 --- a/runtime/CSharp/build/CustomDictionary.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Antlr - Atn - - - diff --git a/runtime/CSharp/build/KeyReporting.targets b/runtime/CSharp/build/KeyReporting.targets deleted file mode 100644 index 9a7ac5429..000000000 --- a/runtime/CSharp/build/KeyReporting.targets +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - This project references a strong name key that is missing on this computer. Run 'sn -k {0}' to generate the file. - - - - - diff --git a/runtime/CSharp/Antlr4.Test.mono/Antlr4.Test.mono.csproj b/tool/test/org/antlr/v4/test/rt/csharp/Antlr4.Test.vs2013.csproj similarity index 80% rename from runtime/CSharp/Antlr4.Test.mono/Antlr4.Test.mono.csproj rename to tool/test/org/antlr/v4/test/rt/csharp/Antlr4.Test.vs2013.csproj index 51ab4af13..99ef488f5 100644 --- a/runtime/CSharp/Antlr4.Test.mono/Antlr4.Test.mono.csproj +++ b/tool/test/org/antlr/v4/test/rt/csharp/Antlr4.Test.vs2013.csproj @@ -30,20 +30,15 @@ - - - - - - + - + {E1A46D9D-66CB-46E8-93B0-7FC87299ABEF} - Antlr4.Runtime.mono + Antlr4.Runtime.vs2013 diff --git a/tool/test/org/antlr/v4/test/rt/csharp/BaseTest.java b/tool/test/org/antlr/v4/test/rt/csharp/BaseTest.java index 5fd46d9da..bda1c25da 100644 --- a/tool/test/org/antlr/v4/test/rt/csharp/BaseTest.java +++ b/tool/test/org/antlr/v4/test/rt/csharp/BaseTest.java @@ -421,13 +421,18 @@ public abstract class BaseTest { } private String locateMSBuild() { - return locateTool("xbuild"); + if(isWindows()) + return "\"C:\\Program Files (x86)\\MSBuild\\12.0\\Bin\\MSBuild.exe\""; + else + return locateTool("xbuild"); } - private String locateExec() { - return locateTool("mono"); - // new File(tmpdir, "bin/Release/Test.exe").getAbsolutePath(), + private boolean isWindows() { + return System.getProperty("os.name").toLowerCase().contains("windows"); + } + private String locateExec() { + return new File(tmpdir, "bin/Release/Test.exe").getAbsolutePath(); } private String locateTool(String tool) { @@ -451,17 +456,19 @@ public abstract class BaseTest { output.close(); input.close(); // update project - input = Thread.currentThread().getContextClassLoader().getResourceAsStream(pack + "Antlr4.Test.mono.csproj"); + String projectName = isWindows() ? "Antlr4.Test.vs2013.csproj" : "Antlr4.Test.mono.csproj"; + input = Thread.currentThread().getContextClassLoader().getResourceAsStream(pack + projectName); Document prjXml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input); // update runtime project reference String runtimePath = System.getProperty("antlr-csharp-runtime-project"); + String runtimeName = isWindows() ? "Antlr4.Runtime.vs2013.csproj" : "Antlr4.Runtime.mono.csproj"; if(runtimePath==null) - runtimePath = "../../antlr4-csharp/runtime/CSharp/Antlr4.Runtime/Antlr4.Runtime.mono.csproj"; + runtimePath = "../../antlr4-csharp/runtime/CSharp/Antlr4.Runtime/" + runtimeName; File projFile = new File(runtimePath); if(!projFile.exists()) throw new RuntimeException("C# runtime project file not found at:" + projFile.getAbsolutePath()); runtimePath = projFile.getAbsolutePath(); - XPathExpression exp = XPathFactory.newInstance().newXPath().compile("/Project/ItemGroup/ProjectReference[@Include='Antlr4.Runtime.mono.csproj']"); + XPathExpression exp = XPathFactory.newInstance().newXPath().compile("/Project/ItemGroup/ProjectReference[@Include='" + runtimeName + "']"); Element node = (Element)exp.evaluate(prjXml, XPathConstants.NODE); node.setAttribute("Include", runtimePath.replace("/", "\\")); // update project file list @@ -494,11 +501,9 @@ public abstract class BaseTest { public String execTest() { try { String exec = locateExec(); - String[] args = new String[] { - exec, - new File(tmpdir, "bin/Release/Test.exe").getAbsolutePath(), - new File(tmpdir, "input").getAbsolutePath() - }; + String[] args = isWindows() ? + new String[] { exec, new File(tmpdir, "input").getAbsolutePath() } : + new String[] { "mono", exec, new File(tmpdir, "input").getAbsolutePath() }; ProcessBuilder pb = new ProcessBuilder(args); pb.directory(new File(tmpdir)); Process p = pb.start();