Skip to content

Commit da03d8b

Browse files
committed
添加 辅助
1 parent 92322d0 commit da03d8b

File tree

7 files changed

+1507
-6
lines changed

7 files changed

+1507
-6
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using PetaTest;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using ToolGood.Algorithm;
8+
9+
namespace ToolGood.Algorithm2.Test.AlgorithmEngineHelper
10+
{
11+
[TestFixture]
12+
public class AlgorithmEngineHelperTest
13+
{
14+
[Test]
15+
public void Test()
16+
{
17+
var helper=new ToolGood.Algorithm.AlgorithmEngineHelper();
18+
DiyNameInfo p = helper.GetDiyNames("[dd]");
19+
Assert.AreEqual("dd", p.Parameters[0]);
20+
21+
DiyNameInfo p2 = helper.GetDiyNames("{ddd}");
22+
Assert.AreEqual("ddd", p2.Parameters[0]);
23+
24+
DiyNameInfo p3 = helper.GetDiyNames("【dd】");
25+
Assert.AreEqual("dd", p3.Parameters[0]);
26+
27+
DiyNameInfo p4 = helper.GetDiyNames("@ddd+2");
28+
Assert.AreEqual("ddd", p4.Parameters[0]);
29+
30+
DiyNameInfo p5 = helper.GetDiyNames("ddd(d1,22)");
31+
Assert.AreEqual("ddd", p5.Functions[0]);
32+
Assert.AreEqual("d1", p5.Parameters[0]);
33+
34+
DiyNameInfo p6 = helper.GetDiyNames("长");
35+
Assert.AreEqual("长", p6.Parameters[0]);
36+
37+
DiyNameInfo p7 = helper.GetDiyNames("#ddd#+2");
38+
Assert.AreEqual("ddd", p7.Parameters[0]);
39+
40+
}
41+
42+
[Test]
43+
public void Test2()
44+
{
45+
var helper = new ToolGood.Algorithm.AlgorithmEngineHelper();
46+
var b = helper.IsKeywords("true");
47+
Assert.IsTrue(b);
48+
49+
50+
}
51+
52+
53+
54+
}
55+
}

csharp/ToolGood.Algorithm2/AlgorithmEngine.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
using System;
1+
using Antlr4.Runtime;
2+
using System;
23
using System.Collections.Generic;
3-
using System.IO;
44
using System.Linq;
55
using System.Text;
6-
using Antlr4.Runtime;
7-
using Antlr4.Runtime.Misc;
86
using ToolGood.Algorithm.Internals;
97
using ToolGood.Algorithm.LitJson;
108
using static mathParser;
Lines changed: 282 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
using Antlr4.Runtime;
2+
using System;
3+
using System.Collections.Generic;
4+
using ToolGood.Algorithm.Internals;
5+
6+
namespace ToolGood.Algorithm
7+
{
8+
/// <summary>
9+
/// 算法引擎助手
10+
/// </summary>
11+
public class AlgorithmEngineHelper
12+
{
13+
private static HashSet<string> _lexerSet;
14+
15+
private static HashSet<string> GetLexerSet()
16+
{
17+
if (_lexerSet == null) {
18+
var lexerSet = new HashSet<string>();
19+
lexerSet.Add("NULL");
20+
lexerSet.Add("IF");
21+
lexerSet.Add("IFERROR");
22+
lexerSet.Add("ISNUMBER");
23+
lexerSet.Add("ISTEXT");
24+
lexerSet.Add("ISERROR");
25+
lexerSet.Add("ISNONTEXT");
26+
lexerSet.Add("ISLOGICAL");
27+
lexerSet.Add("ISEVEN");
28+
lexerSet.Add("ISODD");
29+
lexerSet.Add("ISNULL");
30+
lexerSet.Add("ISNULLORERROR");
31+
lexerSet.Add("AND");
32+
lexerSet.Add("OR");
33+
lexerSet.Add("NOT");
34+
lexerSet.Add("TRUE");
35+
lexerSet.Add("FALSE");
36+
lexerSet.Add("E");
37+
lexerSet.Add("PI");
38+
lexerSet.Add("DEC2BIN");
39+
lexerSet.Add("DEC2HEX");
40+
lexerSet.Add("DEC2OCT");
41+
lexerSet.Add("HEX2BIN");
42+
lexerSet.Add("HEX2DEC");
43+
lexerSet.Add("HEX2OCT");
44+
lexerSet.Add("OCT2BIN");
45+
lexerSet.Add("OCT2DEC");
46+
lexerSet.Add("OCT2HEX");
47+
lexerSet.Add("BIN2OCT");
48+
lexerSet.Add("BIN2DEC");
49+
lexerSet.Add("BIN2HEX");
50+
lexerSet.Add("ABS");
51+
lexerSet.Add("QUOTIENT");
52+
lexerSet.Add("MOD");
53+
lexerSet.Add("SIGN");
54+
lexerSet.Add("SQRT");
55+
lexerSet.Add("TRUNC");
56+
lexerSet.Add("INT");
57+
lexerSet.Add("GCD");
58+
lexerSet.Add("LCM");
59+
lexerSet.Add("COMBIN");
60+
lexerSet.Add("PERMUT");
61+
lexerSet.Add("DEGREES");
62+
lexerSet.Add("RADIANS");
63+
lexerSet.Add("COS");
64+
lexerSet.Add("COSH");
65+
lexerSet.Add("SIN");
66+
lexerSet.Add("SINH");
67+
lexerSet.Add("TAN");
68+
lexerSet.Add("TANH");
69+
lexerSet.Add("ACOS");
70+
lexerSet.Add("ACOSH");
71+
lexerSet.Add("ASIN");
72+
lexerSet.Add("ASINH");
73+
lexerSet.Add("ATAN");
74+
lexerSet.Add("ATANH");
75+
lexerSet.Add("ATAN2");
76+
lexerSet.Add("ROUND");
77+
lexerSet.Add("ROUNDDOWN");
78+
lexerSet.Add("ROUNDUP");
79+
lexerSet.Add("CEILING");
80+
lexerSet.Add("FLOOR");
81+
lexerSet.Add("EVEN");
82+
lexerSet.Add("ODD");
83+
lexerSet.Add("MROUND");
84+
lexerSet.Add("RAND");
85+
lexerSet.Add("RANDBETWEEN");
86+
lexerSet.Add("FACT");
87+
lexerSet.Add("FACTDOUBLE");
88+
lexerSet.Add("POWER");
89+
lexerSet.Add("EXP");
90+
lexerSet.Add("LN");
91+
lexerSet.Add("LOG");
92+
lexerSet.Add("LOG10");
93+
lexerSet.Add("MULTINOMIAL");
94+
lexerSet.Add("PRODUCT");
95+
lexerSet.Add("SQRTPI");
96+
lexerSet.Add("SUMSQ");
97+
lexerSet.Add("ASC");
98+
lexerSet.Add("JIS");
99+
lexerSet.Add("WIDECHAR");
100+
lexerSet.Add("CHAR");
101+
lexerSet.Add("CLEAN");
102+
lexerSet.Add("CODE");
103+
lexerSet.Add("CONCATENATE");
104+
lexerSet.Add("EXACT");
105+
lexerSet.Add("FIND");
106+
lexerSet.Add("FIXED");
107+
lexerSet.Add("LEFT");
108+
lexerSet.Add("LEN");
109+
lexerSet.Add("LOWER");
110+
lexerSet.Add("TOLOWER");
111+
lexerSet.Add("MID");
112+
lexerSet.Add("PROPER");
113+
lexerSet.Add("REPLACE");
114+
lexerSet.Add("REPT");
115+
lexerSet.Add("RIGHT");
116+
lexerSet.Add("RMB");
117+
lexerSet.Add("SEARCH");
118+
lexerSet.Add("SUBSTITUTE");
119+
lexerSet.Add("T");
120+
lexerSet.Add("TEXT");
121+
lexerSet.Add("TRIM");
122+
lexerSet.Add("UPPER");
123+
lexerSet.Add("TOUPPER");
124+
lexerSet.Add("VALUE");
125+
lexerSet.Add("DATEVALUE");
126+
lexerSet.Add("TIMEVALUE");
127+
lexerSet.Add("DATE");
128+
lexerSet.Add("TIME");
129+
lexerSet.Add("NOW");
130+
lexerSet.Add("TODAY");
131+
lexerSet.Add("YEAR");
132+
lexerSet.Add("MONTH");
133+
lexerSet.Add("DAY");
134+
lexerSet.Add("HOUR");
135+
lexerSet.Add("MINUTE");
136+
lexerSet.Add("SECOND");
137+
lexerSet.Add("WEEKDAY");
138+
lexerSet.Add("DATEDIF");
139+
lexerSet.Add("DAYS360");
140+
lexerSet.Add("EDATE");
141+
lexerSet.Add("EOMONTH");
142+
lexerSet.Add("NETWORKDAYS");
143+
lexerSet.Add("WORKDAY");
144+
lexerSet.Add("WEEKNUM");
145+
lexerSet.Add("MAX");
146+
lexerSet.Add("MEDIAN");
147+
lexerSet.Add("MIN");
148+
lexerSet.Add("QUARTILE");
149+
lexerSet.Add("MODE");
150+
lexerSet.Add("LARGE");
151+
lexerSet.Add("SMALL");
152+
lexerSet.Add("PERCENTILE");
153+
lexerSet.Add("PERCENTRANK");
154+
lexerSet.Add("AVERAGE");
155+
lexerSet.Add("AVERAGEIF");
156+
lexerSet.Add("GEOMEAN");
157+
lexerSet.Add("HARMEAN");
158+
lexerSet.Add("COUNT");
159+
lexerSet.Add("COUNTIF");
160+
lexerSet.Add("SUM");
161+
lexerSet.Add("SUMIF");
162+
lexerSet.Add("AVEDEV");
163+
lexerSet.Add("STDEV");
164+
lexerSet.Add("STDEVP");
165+
lexerSet.Add("DEVSQ");
166+
lexerSet.Add("VAR");
167+
lexerSet.Add("VARP");
168+
lexerSet.Add("NORMDIST");
169+
lexerSet.Add("NORMINV");
170+
lexerSet.Add("NORMSDIST");
171+
lexerSet.Add("NORMSINV");
172+
lexerSet.Add("BETADIST");
173+
lexerSet.Add("BETAINV");
174+
lexerSet.Add("BINOMDIST");
175+
lexerSet.Add("EXPONDIST");
176+
lexerSet.Add("FDIST");
177+
lexerSet.Add("FINV");
178+
lexerSet.Add("FISHER");
179+
lexerSet.Add("FISHERINV");
180+
lexerSet.Add("GAMMADIST");
181+
lexerSet.Add("GAMMAINV");
182+
lexerSet.Add("GAMMALN");
183+
lexerSet.Add("HYPGEOMDIST");
184+
lexerSet.Add("LOGINV");
185+
lexerSet.Add("LOGNORMDIST");
186+
lexerSet.Add("NEGBINOMDIST");
187+
lexerSet.Add("POISSON");
188+
lexerSet.Add("TDIST");
189+
lexerSet.Add("TINV");
190+
lexerSet.Add("WEIBULL");
191+
lexerSet.Add("URLENCODE");
192+
lexerSet.Add("URLDECODE");
193+
lexerSet.Add("HTMLENCODE");
194+
lexerSet.Add("HTMLDECODE");
195+
lexerSet.Add("BASE64TOTEXT");
196+
lexerSet.Add("BASE64URLTOTEXT");
197+
lexerSet.Add("TEXTTOBASE64");
198+
lexerSet.Add("TEXTTOBASE64URL");
199+
lexerSet.Add("REGEX");
200+
lexerSet.Add("REGEXREPALCE");
201+
lexerSet.Add("ISREGEX");
202+
lexerSet.Add("ISMATCH");
203+
lexerSet.Add("GUID");
204+
lexerSet.Add("MD5");
205+
lexerSet.Add("SHA1");
206+
lexerSet.Add("SHA256");
207+
lexerSet.Add("SHA512");
208+
lexerSet.Add("CRC32");
209+
lexerSet.Add("HMACMD5");
210+
lexerSet.Add("HMACSHA1");
211+
lexerSet.Add("HMACSHA256");
212+
lexerSet.Add("HMACSHA512");
213+
lexerSet.Add("TRIMSTART");
214+
lexerSet.Add("LTRIM");
215+
lexerSet.Add("TRIMEND");
216+
lexerSet.Add("RTRIM");
217+
lexerSet.Add("INDEXOF");
218+
lexerSet.Add("LASTINDEXOF");
219+
lexerSet.Add("SPLIT");
220+
lexerSet.Add("JOIN");
221+
lexerSet.Add("SUBSTRING");
222+
lexerSet.Add("STARTSWITH");
223+
lexerSet.Add("ENDSWITH");
224+
lexerSet.Add("ISNULLOREMPTY");
225+
lexerSet.Add("ISNULLORWHITESPACE");
226+
lexerSet.Add("REMOVESTART");
227+
lexerSet.Add("REMOVEEND");
228+
lexerSet.Add("JSON");
229+
lexerSet.Add("VLOOKUP");
230+
lexerSet.Add("LOOKUP");
231+
lexerSet.Add("ARRAY");
232+
_lexerSet = lexerSet;
233+
}
234+
return _lexerSet;
235+
}
236+
237+
/// <summary>
238+
/// 是否与内置关键字相同
239+
/// </summary>
240+
/// <param name="parameter"></param>
241+
/// <returns></returns>
242+
public bool IsKeywords(string parameter)
243+
{
244+
var lexerSet = GetLexerSet();
245+
return lexerSet.Contains(CharUtil.StandardString(parameter));
246+
}
247+
248+
/// <summary>
249+
/// 获取 DIY 名称
250+
/// </summary>
251+
/// <param name="exp"></param>
252+
/// <returns></returns>
253+
/// <exception cref="Exception"></exception>
254+
public DiyNameInfo GetDiyNames(String exp)
255+
{
256+
if (string.IsNullOrWhiteSpace(exp)) {
257+
throw new Exception("Parameter exp invalid !");
258+
}
259+
var stream = new AntlrCharStream(new AntlrInputStream(exp));
260+
var lexer = new mathLexer(stream);
261+
var tokens = new CommonTokenStream(lexer);
262+
var parser = new mathParser(tokens);
263+
var antlrErrorListener = new AntlrErrorListener();
264+
parser.RemoveErrorListeners();
265+
parser.AddErrorListener(antlrErrorListener);
266+
267+
var context = parser.prog();
268+
var end = context.Stop.StopIndex;
269+
if (end + 1 < exp.Length) {
270+
throw new Exception("Parameter exp invalid !");
271+
}
272+
if (antlrErrorListener.IsError) {
273+
throw new Exception(antlrErrorListener.ErrorMsg);
274+
}
275+
DiyNameVisitor visitor = new DiyNameVisitor();
276+
visitor.Visit(context);
277+
return visitor.diy;
278+
}
279+
280+
281+
}
282+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace ToolGood.Algorithm
7+
{
8+
public class DiyNameInfo
9+
{
10+
public List<String> Parameters=new List<String>();
11+
public List<String> Functions=new List<String>();
12+
13+
}
14+
}

csharp/ToolGood.Algorithm2/Internals/CharUtil.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ public static char StandardChar(char c)
3232
return char.ToUpperInvariant(o);
3333
}
3434

35+
public static string StandardString(string s)
36+
{
37+
var sb = new StringBuilder();
38+
for (int i = 0; i < s.Length; i++) {
39+
var c = s[i];
40+
sb.Append(StandardChar(c));
41+
}
42+
return sb.ToString();
43+
}
44+
3545
private static bool EqualsOnce(string left, string right)
3646
{
3747
if (left.Length != right.Length) return false;
@@ -172,7 +182,7 @@ public static List<string> SplitFormulaForAndOr(string formula)
172182
i++;
173183
result.Add(str.ToString());
174184
str = new StringBuilder();
175-
str.Append(string.Join(" && ", result));
185+
str.Append(string.Join("&&", result));
176186
str.Append("||");
177187
result.Clear();
178188
} else {

0 commit comments

Comments
 (0)