Skip to content

Commit ca71a03

Browse files
committed
fix Lexer 查错
1 parent f0b125c commit ca71a03

8 files changed

Lines changed: 147 additions & 156 deletions

File tree

csharp/ToolGood.Algorithm.Test/AlgorithmEngineHelper/AlgorithmEngineHelperTest.cs

Lines changed: 72 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -3,77 +3,89 @@
33

44
namespace ToolGood.Algorithm2.Test.AlgorithmEngineHelper2
55
{
6-
[TestFixture]
7-
public class AlgorithmEngineHelperTest
8-
{
9-
[Test]
10-
public void Test()
11-
{
12-
DiyNameInfo p = AlgorithmEngineHelper.GetDiyNames("dd");
13-
Assert.AreEqual("dd", p.Parameters[0].ToString());
14-
6+
[TestFixture]
7+
public class AlgorithmEngineHelperTest
8+
{
9+
[Test]
10+
public void Test()
11+
{
12+
DiyNameInfo p = AlgorithmEngineHelper.GetDiyNames("dd");
13+
Assert.AreEqual("dd", p.Parameters[0].ToString());
14+
15+
1516

17+
DiyNameInfo p3 = AlgorithmEngineHelper.GetDiyNames("dd");
18+
Assert.AreEqual("dd", p3.Parameters[0].ToString());
1619

17-
DiyNameInfo p3 = AlgorithmEngineHelper.GetDiyNames("dd");
18-
Assert.AreEqual("dd", p3.Parameters[0].ToString());
19-
2020

21-
DiyNameInfo p5 = AlgorithmEngineHelper.GetDiyNames("ddd(d1,22)");
22-
Assert.AreEqual("ddd", p5.Functions[0]);
23-
Assert.AreEqual("d1", p5.Parameters[0].ToString());
21+
DiyNameInfo p5 = AlgorithmEngineHelper.GetDiyNames("ddd(d1,22)");
22+
Assert.AreEqual("ddd", p5.Functions[0]);
23+
Assert.AreEqual("d1", p5.Parameters[0].ToString());
2424

25-
DiyNameInfo p6 = AlgorithmEngineHelper.GetDiyNames("长");
26-
Assert.AreEqual("长", p6.Parameters[0].ToString());
25+
DiyNameInfo p6 = AlgorithmEngineHelper.GetDiyNames("长");
26+
Assert.AreEqual("长", p6.Parameters[0].ToString());
27+
28+
DiyNameInfo p7 = AlgorithmEngineHelper.GetDiyNames("ddd+2");
29+
Assert.AreEqual("ddd", p7.Parameters[0].ToString());
2730

28-
DiyNameInfo p7 = AlgorithmEngineHelper.GetDiyNames("ddd+2");
29-
Assert.AreEqual("ddd", p7.Parameters[0].ToString());
3031

31-
3232
DiyNameInfo p8 = AlgorithmEngineHelper.GetDiyNames(@"{""A"": 0.6,""B"": 0.4,""C"": 0.6,""E"": 0.33,""F"": 0.29,""Z"": 0.15
3333
,""EB"": 0.7,""EE"": 0.65,""EA"": 0.85,""AB"": 1.0,""BC"": 1.0,""AA"":1.0
3434
,""EBC"": 1.15,""BAB"": 1.25,""BCB"": 1.25,""BBC"": 1.25,""CBB"": 1.25,""EBA"": 1.2,""AAA"": 1.4}[瓦楞]");
3535
Assert.AreEqual("瓦楞", p8.Parameters[0].ToString());
3636
}
3737

3838
[Test]
39-
public void Test2()
40-
{
41-
var b = AlgorithmEngineHelper.IsKeywords("false");
42-
Assert.IsTrue(b);
43-
}
44-
45-
[Test]
46-
public void Test3()
47-
{
48-
var b = AlgorithmEngineHelper.UnitConversion(1M, "米", "千米", "测试");
49-
Assert.AreEqual(0.001M, b);
50-
b = AlgorithmEngineHelper.UnitConversion(1M, "米", "分米", "测试");
51-
Assert.AreEqual(10M, b);
52-
b = AlgorithmEngineHelper.UnitConversion(1M, "米", "厘米", "测试");
53-
Assert.AreEqual(100M, b);
54-
b = AlgorithmEngineHelper.UnitConversion(1M, "米", "mm", "测试");
55-
Assert.AreEqual(1000M, b);
56-
57-
b = AlgorithmEngineHelper.UnitConversion(1M, "m2", "dm2", "测试");
58-
Assert.AreEqual(100M, b);
59-
b = AlgorithmEngineHelper.UnitConversion(1M, "m2", "cm2", "测试");
60-
Assert.AreEqual(10000M, b);
61-
b = AlgorithmEngineHelper.UnitConversion(1M, "m2", "mm2", "测试");
62-
Assert.AreEqual(1000000M, b);
63-
64-
b = AlgorithmEngineHelper.UnitConversion(1M, "m3", "dm3", "测试");
65-
Assert.AreEqual(1000M, b);
66-
b = AlgorithmEngineHelper.UnitConversion(1M, "m3", "cm3", "测试");
67-
Assert.AreEqual(1000000M, b);
68-
b = AlgorithmEngineHelper.UnitConversion(1M, "m3", "mm3", "测试");
69-
Assert.AreEqual(1000000000M, b);
70-
71-
b = AlgorithmEngineHelper.UnitConversion(1M, "t", "kg", "测试");
72-
Assert.AreEqual(1000M, b);
73-
b = AlgorithmEngineHelper.UnitConversion(1M, "t", "g", "测试");
74-
Assert.AreEqual(1000000M, b);
75-
}
76-
77-
78-
}
39+
public void Test2()
40+
{
41+
var b = AlgorithmEngineHelper.IsKeywords("false");
42+
Assert.IsTrue(b);
43+
}
44+
45+
[Test]
46+
public void Test3()
47+
{
48+
var b = AlgorithmEngineHelper.UnitConversion(1M, "米", "千米", "测试");
49+
Assert.AreEqual(0.001M, b);
50+
b = AlgorithmEngineHelper.UnitConversion(1M, "米", "分米", "测试");
51+
Assert.AreEqual(10M, b);
52+
b = AlgorithmEngineHelper.UnitConversion(1M, "米", "厘米", "测试");
53+
Assert.AreEqual(100M, b);
54+
b = AlgorithmEngineHelper.UnitConversion(1M, "米", "mm", "测试");
55+
Assert.AreEqual(1000M, b);
56+
57+
b = AlgorithmEngineHelper.UnitConversion(1M, "m2", "dm2", "测试");
58+
Assert.AreEqual(100M, b);
59+
b = AlgorithmEngineHelper.UnitConversion(1M, "m2", "cm2", "测试");
60+
Assert.AreEqual(10000M, b);
61+
b = AlgorithmEngineHelper.UnitConversion(1M, "m2", "mm2", "测试");
62+
Assert.AreEqual(1000000M, b);
63+
64+
b = AlgorithmEngineHelper.UnitConversion(1M, "m3", "dm3", "测试");
65+
Assert.AreEqual(1000M, b);
66+
b = AlgorithmEngineHelper.UnitConversion(1M, "m3", "cm3", "测试");
67+
Assert.AreEqual(1000000M, b);
68+
b = AlgorithmEngineHelper.UnitConversion(1M, "m3", "mm3", "测试");
69+
Assert.AreEqual(1000000000M, b);
70+
71+
b = AlgorithmEngineHelper.UnitConversion(1M, "t", "kg", "测试");
72+
Assert.AreEqual(1000M, b);
73+
b = AlgorithmEngineHelper.UnitConversion(1M, "t", "g", "测试");
74+
Assert.AreEqual(1000000M, b);
75+
}
76+
77+
[Test]
78+
public void Test5()
79+
{
80+
var b = AlgorithmEngineHelper.CheckFormula("1+1");
81+
Assert.IsTrue(b);
82+
83+
b = AlgorithmEngineHelper.CheckFormula("1+");
84+
Assert.AreEqual(false, b);
85+
86+
b = AlgorithmEngineHelper.CheckFormula("@123+1");
87+
Assert.AreEqual(false, b);
88+
}
89+
90+
}
7991
}

csharp/ToolGood.Algorithm/AlgorithmEngine.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,15 @@ public FunctionBase Parse(string exp)
8585
LastError = "Parameter exp invalid !";
8686
throw new Exception(LastError);
8787
}
88-
var stream = new AntlrCharStream(new AntlrInputStream(exp));
89-
var lexer = new mathLexer(stream);
90-
var tokens = new CommonTokenStream(lexer);
91-
var parser = new mathParser(tokens);
92-
var antlrErrorListener = new AntlrErrorListener();
93-
parser.RemoveErrorListeners();
94-
parser.AddErrorListener(antlrErrorListener);
88+
AntlrErrorTextWriter antlrErrorTextWriter = new AntlrErrorTextWriter();
89+
var stream = new AntlrCharStream(new AntlrInputStream(exp));
90+
var lexer = new mathLexer(stream, Console.Out, antlrErrorTextWriter);
91+
var tokens = new CommonTokenStream(lexer);
92+
var parser = new mathParser(tokens, Console.Out, antlrErrorTextWriter);
9593

96-
var context = parser.prog();
97-
if (antlrErrorListener.IsError) {
98-
LastError = antlrErrorListener.ErrorMsg;
94+
var context = parser.prog();
95+
if (antlrErrorTextWriter.IsError) {
96+
LastError = antlrErrorTextWriter.ErrorMsg;
9997
throw new Exception(LastError);
10098
}
10199
var visitor = new MathFunctionVisitor();

csharp/ToolGood.Algorithm/AlgorithmEngineHelper.cs

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Antlr4.Runtime;
22
using System;
33
using System.Collections.Generic;
4+
using System.IO;
45
using System.Text.RegularExpressions;
56
using ToolGood.Algorithm.Enums;
67
using ToolGood.Algorithm.Internals;
@@ -311,17 +312,15 @@ public static DiyNameInfo GetDiyNames(string exp)
311312
if(string.IsNullOrWhiteSpace(exp)) {
312313
throw new Exception("Parameter exp invalid !");
313314
}
315+
AntlrErrorTextWriter antlrErrorTextWriter = new AntlrErrorTextWriter();
314316
var stream = new AntlrCharStream(new AntlrInputStream(exp));
315-
var lexer = new mathLexer(stream);
317+
var lexer = new mathLexer(stream, Console.Out, antlrErrorTextWriter);
316318
var tokens = new CommonTokenStream(lexer);
317-
var parser = new mathParser(tokens);
318-
var antlrErrorListener = new AntlrErrorListener();
319-
parser.RemoveErrorListeners();
320-
parser.AddErrorListener(antlrErrorListener);
319+
var parser = new mathParser(tokens, Console.Out, antlrErrorTextWriter);
321320

322321
var context = parser.prog();
323-
if(antlrErrorListener.IsError) {
324-
throw new Exception(antlrErrorListener.ErrorMsg);
322+
if(antlrErrorTextWriter.IsError) {
323+
throw new Exception(antlrErrorTextWriter.ErrorMsg);
325324
}
326325
var visitor = new DiyNameVisitor();
327326
visitor.Visit(context);
@@ -378,17 +377,15 @@ public static FunctionBase ParseFormula(string exp)
378377
if(string.IsNullOrWhiteSpace(exp)) {
379378
throw new Exception("Parameter exp invalid !");
380379
}
380+
AntlrErrorTextWriter antlrErrorTextWriter = new AntlrErrorTextWriter();
381381
var stream = new AntlrCharStream(new AntlrInputStream(exp));
382-
var lexer = new mathLexer(stream);
382+
var lexer = new mathLexer(stream, Console.Out, antlrErrorTextWriter);
383383
var tokens = new CommonTokenStream(lexer);
384-
var parser = new mathParser(tokens);
385-
var antlrErrorListener = new AntlrErrorListener();
386-
parser.RemoveErrorListeners();
387-
parser.AddErrorListener(antlrErrorListener);
384+
var parser = new mathParser(tokens, Console.Out, antlrErrorTextWriter);
388385

389386
var context = parser.prog();
390-
if(antlrErrorListener.IsError) {
391-
throw new Exception(antlrErrorListener.ErrorMsg);
387+
if(antlrErrorTextWriter.IsError) {
388+
throw new Exception(antlrErrorTextWriter.ErrorMsg);
392389
}
393390
var visitor = new MathFunctionVisitor();
394391
return visitor.Visit(context);
@@ -402,16 +399,14 @@ public static FunctionBase ParseFormula(string exp)
402399
public static bool CheckFormula(string exp)
403400
{
404401
if(string.IsNullOrWhiteSpace(exp)) { return false; }
402+
AntlrErrorTextWriter antlrErrorTextWriter = new AntlrErrorTextWriter();
405403
var stream = new AntlrCharStream(new AntlrInputStream(exp));
406-
var lexer = new mathLexer(stream);
404+
var lexer = new mathLexer(stream, Console.Out, antlrErrorTextWriter);
407405
var tokens = new CommonTokenStream(lexer);
408-
var parser = new mathParser(tokens);
409-
var antlrErrorListener = new AntlrErrorListener();
410-
parser.RemoveErrorListeners();
411-
parser.AddErrorListener(antlrErrorListener);
406+
var parser = new mathParser(tokens, Console.Out, antlrErrorTextWriter);
412407

413408
var context = parser.prog();
414-
if(antlrErrorListener.IsError) {
409+
if(antlrErrorTextWriter.IsError) {
415410
return false;
416411
}
417412
return true;
@@ -431,18 +426,16 @@ public static ConditionTree ParseCondition(string condition)
431426
return tree;
432427
}
433428
try {
429+
AntlrErrorTextWriter antlrErrorTextWriter = new AntlrErrorTextWriter();
434430
var stream = new AntlrCharStream(new AntlrInputStream(condition));
435-
var lexer = new math.mathLexer(stream);
431+
var lexer = new mathLexer(stream, Console.Out, antlrErrorTextWriter);
436432
var tokens = new CommonTokenStream(lexer);
437-
var parser = new math.mathParser(tokens);
438-
var antlrErrorListener = new AntlrErrorListener();
439-
parser.RemoveErrorListeners();
440-
parser.AddErrorListener(antlrErrorListener);
433+
var parser = new mathParser(tokens, Console.Out, antlrErrorTextWriter);
441434

442435
var context = parser.prog();
443-
if(antlrErrorListener.IsError) {
436+
if(antlrErrorTextWriter.IsError) {
444437
tree.Type = ConditionTreeType.Error;
445-
tree.ErrorMessage = antlrErrorListener.ErrorMsg;
438+
tree.ErrorMessage = antlrErrorTextWriter.ErrorMsg;
446439
return tree;
447440
}
448441
var visitor = new MathSplitVisitor();
@@ -488,18 +481,16 @@ public static CalculateTree ParseCalculate(string exp)
488481
return tree;
489482
}
490483
try {
484+
AntlrErrorTextWriter antlrErrorTextWriter = new AntlrErrorTextWriter();
491485
var stream = new AntlrCharStream(new AntlrInputStream(exp));
492-
var lexer = new math.mathLexer(stream);
486+
var lexer = new mathLexer(stream, Console.Out, antlrErrorTextWriter);
493487
var tokens = new CommonTokenStream(lexer);
494-
var parser = new math.mathParser(tokens);
495-
var antlrErrorListener = new AntlrErrorListener();
496-
parser.RemoveErrorListeners();
497-
parser.AddErrorListener(antlrErrorListener);
488+
var parser = new mathParser(tokens, Console.Out, antlrErrorTextWriter);
498489

499490
var context = parser.prog();
500-
if(antlrErrorListener.IsError) {
491+
if(antlrErrorTextWriter.IsError) {
501492
tree.Type = CalculateTreeType.Error;
502-
tree.ErrorMessage = antlrErrorListener.ErrorMsg;
493+
tree.ErrorMessage = antlrErrorTextWriter.ErrorMsg;
503494
return tree;
504495
}
505496
var visitor = new MathSplitVisitor2();

csharp/ToolGood.Algorithm/Internals/AntlrErrorListener.cs

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using System.IO;
3+
using System.Text;
4+
5+
namespace ToolGood.Algorithm.Internals
6+
{
7+
internal class AntlrErrorTextWriter : TextWriter
8+
{
9+
public bool IsError { get; set; }
10+
public string ErrorMsg { get; private set; }
11+
public AntlrErrorTextWriter()
12+
{
13+
}
14+
15+
public AntlrErrorTextWriter(IFormatProvider formatProvider) : base(formatProvider)
16+
{
17+
}
18+
19+
public override Encoding Encoding => Encoding.UTF8;
20+
21+
public override void WriteLine(string value)
22+
{
23+
IsError = true;
24+
ErrorMsg = value;
25+
}
26+
27+
28+
}
29+
}

0 commit comments

Comments
 (0)