Skip to content

Commit 97b9185

Browse files
authored
Merge pull request #494 from b3b00/bugfix/#493
Bugfix/#493
2 parents 1dd1b49 + 7ee48e3 commit 97b9185

File tree

11 files changed

+613
-13
lines changed

11 files changed

+613
-13
lines changed

sly.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XML", "src/samples/XML/XML.
3939
EndProject
4040
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleTemplate", "src/samples/SimpleTemplate/SimpleTemplate.csproj", "{BC5020CA-6BFC-4895-9A1E-99B4A0AEDB11}"
4141
EndProject
42+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SlowEOS", "src\samples\SlowEOS\SlowEOS.csproj", "{F85C43C2-28EA-4486-9223-5EA3FC42D417}"
43+
EndProject
4244
Global
4345
GlobalSection(Performance) = preSolution
4446
HasPerformanceSessions = true
@@ -120,6 +122,10 @@ Global
120122
{BC5020CA-6BFC-4895-9A1E-99B4A0AEDB11}.Debug|Any CPU.Build.0 = Debug|Any CPU
121123
{BC5020CA-6BFC-4895-9A1E-99B4A0AEDB11}.Release|Any CPU.ActiveCfg = Release|Any CPU
122124
{BC5020CA-6BFC-4895-9A1E-99B4A0AEDB11}.Release|Any CPU.Build.0 = Release|Any CPU
125+
{F85C43C2-28EA-4486-9223-5EA3FC42D417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
126+
{F85C43C2-28EA-4486-9223-5EA3FC42D417}.Debug|Any CPU.Build.0 = Debug|Any CPU
127+
{F85C43C2-28EA-4486-9223-5EA3FC42D417}.Release|Any CPU.ActiveCfg = Release|Any CPU
128+
{F85C43C2-28EA-4486-9223-5EA3FC42D417}.Release|Any CPU.Build.0 = Release|Any CPU
123129
EndGlobalSection
124130
GlobalSection(SolutionProperties) = preSolution
125131
HideSolutionNode = FALSE
@@ -136,6 +142,7 @@ Global
136142
{8F703C3C-0D10-4F43-AC2E-14843D59E460} = {36ED7F1A-2E81-4A71-81FE-A357E5840A33}
137143
{81E72CFA-A6D6-4DB4-B3B5-E167064E7858} = {36ED7F1A-2E81-4A71-81FE-A357E5840A33}
138144
{BC5020CA-6BFC-4895-9A1E-99B4A0AEDB11} = {36ED7F1A-2E81-4A71-81FE-A357E5840A33}
145+
{F85C43C2-28EA-4486-9223-5EA3FC42D417} = {36ED7F1A-2E81-4A71-81FE-A357E5840A33}
139146
EndGlobalSection
140147
GlobalSection(ExtensibilityGlobals) = postSolution
141148
SolutionGuid = {43254130-CF3E-480E-952F-E50CA5D2E417}

src/samples/SlowEOS/Program.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Collections.Immutable;
2+
using System.Diagnostics;
3+
using sly.parser;
4+
using sly.parser.generator;
5+
6+
namespace SlowEOS;
7+
8+
public class Program
9+
{
10+
11+
private static Parser<SlowOnBadParseEosToken, object> GetParser(object instance)
12+
{
13+
ParserBuilder<SlowOnBadParseEosToken, object> builder = new ParserBuilder<SlowOnBadParseEosToken, object>();
14+
15+
var buildBaseLine = builder.BuildParser(instance, ParserType.EBNF_LL_RECURSIVE_DESCENT, "root");
16+
if (buildBaseLine.IsOk)
17+
{
18+
return buildBaseLine.Result;
19+
}
20+
else
21+
{
22+
buildBaseLine.Errors.ForEach(e => Console.WriteLine(e.Message));
23+
return null;
24+
}
25+
}
26+
27+
private static long Test(Parser<SlowOnBadParseEosToken, object> parser, string source)
28+
{
29+
Stopwatch chrono = new Stopwatch();
30+
chrono.Start();
31+
var parsed = parser.Parse(source);
32+
chrono.Stop();
33+
if (parsed.IsError)
34+
{
35+
parsed.Errors.ForEach(x => Console.WriteLine(x.ErrorMessage));
36+
}
37+
return chrono.ElapsedMilliseconds;
38+
}
39+
40+
public static void Main(string[] args)
41+
{
42+
string source = "FUNCTIONCALL([Identifier]";
43+
44+
var baseLine = GetParser(new SlowOnBadParseEos());
45+
//var reducedPrecedences = GetParser(new SlowOnBadParseEosReducedPrecedences());
46+
var baseTime = Test(baseLine, source);
47+
//var reducedTime = Test(reducedPrecedences, source);
48+
//var delta = (((double)reducedTime - (double)baseTime) / (double)baseTime)*100;
49+
//Console.WriteLine($"base : {baseTime} ms, reduced : {reducedTime} ms. delta:{(delta>0 ? "+" : "")}{delta:##.00}%");
50+
}
51+
}

src/samples/SlowEOS/SlowEOS.csproj

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<ItemGroup>
4+
<ProjectReference Include="..\..\sly\sly.csproj" />
5+
</ItemGroup>
6+
7+
<PropertyGroup>
8+
<TargetFramework>net7.0</TargetFramework>
9+
<ImplicitUsings>enable</ImplicitUsings>
10+
<Nullable>enable</Nullable>
11+
<OutputType>Exe</OutputType>
12+
</PropertyGroup>
13+
14+
</Project>
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
using sly.lexer;
2+
using sly.parser.generator;
3+
using sly.parser.parser;
4+
5+
namespace SlowEOS;
6+
7+
[ParserRoot("root")]
8+
public class SlowOnBadParseEos
9+
{
10+
[Production("root : SlowOnBadParseEos_expressions")]
11+
public object root_SlowOnBadParseEosexpressions(object p0)
12+
{
13+
return default(object);
14+
}
15+
16+
[Prefix("NOT", Associativity.Left, 92)]
17+
public object NOT(Token<SlowOnBadParseEosToken> oper, object value)
18+
{
19+
return value;
20+
}
21+
22+
[Prefix("EXCLAMATION_POINT", Associativity.Left, 91)]
23+
public object EXCLAMATION_POINT(Token<SlowOnBadParseEosToken> oper, object value)
24+
{
25+
return value;
26+
}
27+
28+
[Infix("IN", Associativity.Right, 71)]
29+
public object IN(object left, Token<SlowOnBadParseEosToken> oper, object right)
30+
{
31+
return left;
32+
}
33+
34+
[Infix("LIKE", Associativity.Right, 70)]
35+
public object LIKE(object left, Token<SlowOnBadParseEosToken> oper, object right)
36+
{
37+
return left;
38+
}
39+
40+
[Infix("ARITH_TIMES", Associativity.Left, 40)]
41+
public object ARITH_TIMES(object left, Token<SlowOnBadParseEosToken> oper, object right)
42+
{
43+
return left;
44+
}
45+
46+
[Infix("ARITH_DIVIDE", Associativity.Left, 40)]
47+
public object ARITH_DIVIDE(object left, Token<SlowOnBadParseEosToken> oper, object right)
48+
{
49+
return left;
50+
}
51+
52+
[Infix("ARITH_MODULO", Associativity.Left, 38)]
53+
public object ARITH_MODULO(object left, Token<SlowOnBadParseEosToken> oper, object right)
54+
{
55+
return left;
56+
}
57+
58+
[Infix("ARITH_PLUS", Associativity.Left, 30)]
59+
public object ARITH_PLUS(object left, Token<SlowOnBadParseEosToken> oper, object right)
60+
{
61+
return left;
62+
}
63+
64+
[Infix("ARITH_MINUS", Associativity.Left, 30)]
65+
public object ARITH_MINUS(object left, Token<SlowOnBadParseEosToken> oper, object right)
66+
{
67+
return left;
68+
}
69+
70+
[Prefix("ARITH_MINUS", Associativity.Left, 29)]
71+
public object ARITH_MINUS(Token<SlowOnBadParseEosToken> oper, object value)
72+
{
73+
return value;
74+
}
75+
76+
[Infix("COMP_EQUALS", Associativity.Left, 25)]
77+
public object COMP_EQUALS(object left, Token<SlowOnBadParseEosToken> oper, object right)
78+
{
79+
return left;
80+
}
81+
82+
[Infix("COMP_NOTEQUALS", Associativity.Left, 24)]
83+
public object COMP_NOTEQUALS(object left, Token<SlowOnBadParseEosToken> oper, object right)
84+
{
85+
return left;
86+
}
87+
88+
[Infix("COMP_LT", Associativity.Left, 23)]
89+
public object COMP_LT(object left, Token<SlowOnBadParseEosToken> oper, object right)
90+
{
91+
return left;
92+
}
93+
94+
[Infix("COMP_GT", Associativity.Left, 22)]
95+
public object COMP_GT(object left, Token<SlowOnBadParseEosToken> oper, object right)
96+
{
97+
return left;
98+
}
99+
100+
[Infix("COMP_LTE", Associativity.Left, 21)]
101+
public object COMP_LTE(object left, Token<SlowOnBadParseEosToken> oper, object right)
102+
{
103+
return left;
104+
}
105+
106+
[Infix("COMP_GTE", Associativity.Left, 20)]
107+
public object COMP_GTE(object left, Token<SlowOnBadParseEosToken> oper, object right)
108+
{
109+
return left;
110+
}
111+
112+
[Infix("IS", Associativity.Left, 15)]
113+
public object IS(object left, Token<SlowOnBadParseEosToken> oper, object right)
114+
{
115+
return left;
116+
}
117+
118+
[Infix("AND", Associativity.Left, 12)]
119+
public object AND(object left, Token<SlowOnBadParseEosToken> oper, object right)
120+
{
121+
return left;
122+
}
123+
124+
[Infix("OR", Associativity.Left, 11)]
125+
public object OR(object left, Token<SlowOnBadParseEosToken> oper, object right)
126+
{
127+
return left;
128+
}
129+
130+
[Infix("XOR", Associativity.Left, 10)]
131+
public object XOR(object left, Token<SlowOnBadParseEosToken> oper, object right)
132+
{
133+
return left;
134+
}
135+
136+
[Operand]
137+
[Production("primary : BRACKET_LEFT IDENTIFIER BRACKET_RIGHT")]
138+
public object primary_BRACKETLEFT_IDENTIFIER_BRACKETRIGHT(Token<SlowOnBadParseEosToken> p0, Token<SlowOnBadParseEosToken> p1, Token<SlowOnBadParseEosToken> p2)
139+
{
140+
return default(object);
141+
}
142+
143+
[Operand]
144+
[Production("primary : PARENS_LEFT SlowOnBadParseEos_expressions PARENS_RIGHT")]
145+
public object primary_PARENSLEFT_SlowOnBadParseEosexpressions_PARENSRIGHT(Token<SlowOnBadParseEosToken> p0, object p1, Token<SlowOnBadParseEosToken> p2)
146+
{
147+
return default(object);
148+
}
149+
150+
[Operand]
151+
[Production("literal : INT")]
152+
public object literal_INT(Token<SlowOnBadParseEosToken> p0)
153+
{
154+
return default(object);
155+
}
156+
157+
[Operand]
158+
[Production("literal : NUMBER")]
159+
public object literal_NUMBER(Token<SlowOnBadParseEosToken> p0)
160+
{
161+
return default(object);
162+
}
163+
164+
[Operand]
165+
[Production("literal : STRING")]
166+
public object literal_STRING(Token<SlowOnBadParseEosToken> p0)
167+
{
168+
return default(object);
169+
}
170+
171+
// [Operand]
172+
[Production("literal : [ TRUE | FALSE ]")]
173+
public object literal_TRUE_FALSE_(Token<SlowOnBadParseEosToken> p0)
174+
{
175+
return default(object);
176+
}
177+
178+
[Production("literal : NULL")]
179+
public object literal_NULL(Token<SlowOnBadParseEosToken> p0)
180+
{
181+
return default(object);
182+
}
183+
184+
[Operand]
185+
[Production("literal_list : PARENS_LEFT literal (COMMA literal) * PARENS_RIGHT")]
186+
public object literallist_PARENSLEFT_literal_COMMA_literal_PARENSRIGHT(Token<SlowOnBadParseEosToken> p0, object p1, List<Group<SlowOnBadParseEosToken, object>> p2, Token<SlowOnBadParseEosToken> p3)
187+
{
188+
return default(object);
189+
}
190+
191+
[Operand]
192+
[Production("function_call : IDENTIFIER PARENS_LEFT operand_list PARENS_RIGHT")]
193+
public object functioncall_IDENTIFIER_PARENSLEFT_operandlist_PARENSRIGHT(Token<SlowOnBadParseEosToken> p0, Token<SlowOnBadParseEosToken> p1, object p2, Token<SlowOnBadParseEosToken> p3)
194+
{
195+
return default(object);
196+
}
197+
198+
[Production("operand_list : SlowOnBadParseEos_expressions (COMMA SlowOnBadParseEos_expressions) *")]
199+
public object operandlist_SlowOnBadParseEosexpressions_COMMA_SlowOnBadParseEosexpressions_(object p0, List<Group<SlowOnBadParseEosToken, object>> p1)
200+
{
201+
return default(object);
202+
}
203+
}

0 commit comments

Comments
 (0)