Skip to content

Commit ef5b750

Browse files
committed
Fixed tokenisation, updated format function
1 parent d38cbf5 commit ef5b750

File tree

4 files changed

+12
-43
lines changed

4 files changed

+12
-43
lines changed

v2/BooleanExpressionParser/.vscode/launch.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
"A.B",
1212
"A+B",
1313
"!(A+B+C)",
14-
"T+F+F.F",
15-
"!A+B"
14+
"((A.B&C) OR A) AND (NOT B + !C)"
1615
],
1716
"cwd": "${workspaceFolder}",
1817
"console": "integratedTerminal", // enables input (instead of internalConsole)

v2/BooleanExpressionParser/Formatter.cs

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,15 @@ namespace BooleanExpressionParser;
44

55
class Formatter
66
{
7-
public static string FormatAstAsInfix(Node root)
7+
public static string FormatInfixTokens(IEnumerable<Token> tokens)
88
{
99
var sb = new StringBuilder();
1010

11-
void Visit(Node node)
12-
{
13-
switch (node)
14-
{
15-
case AndOperatorNode op:
16-
VisitAndWrap(op.Left);
17-
sb.Append(" AND ");
18-
VisitAndWrap(op.Right!);
19-
break;
20-
21-
case OrOperatorNode op:
22-
VisitAndWrap(op.Left);
23-
sb.Append(" OR ");
24-
VisitAndWrap(op.Right!);
25-
break;
26-
27-
case NotOperatorNode op:
28-
sb.Append($"NOT (");
29-
Visit(op.Left);
30-
sb.Append(")");
31-
break;
32-
33-
case VariableNode var:
34-
sb.Append(var.Name);
35-
break;
36-
37-
}
38-
}
39-
40-
void VisitAndWrap(Node node)
11+
foreach (var token in tokens)
4112
{
42-
if (node is AndOperatorNode || node is OrOperatorNode) sb.Append("(");
43-
Visit(node);
44-
if (node is AndOperatorNode || node is OrOperatorNode) sb.Append(")");
13+
sb.Append(token.ToString());
4514
}
4615

47-
Visit(root);
48-
4916
return sb.ToString();
5017
}
5118

v2/BooleanExpressionParser/Parser.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ public Ast GrowAst(IEnumerable<Token> tokens)
9494
}
9595
}
9696

97-
if (stack.Count != 1) throw new Exception("Expression invalid - stack not empty");
97+
if (stack.Count != 1)
98+
{
99+
throw new Exception($"Expression invalid - stack not empty. Stack: {String.Join(", ", stack)}");
100+
}
98101

99102
var root = stack.Pop();
100103

v2/BooleanExpressionParser/Program.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@ static void Main(params string[] args)
1212

1313
foreach (var expression in args)
1414
{
15-
var trimmed = expression.Replace(" ", "");
16-
var tokeniser = new Tokeniser(trimmed);
15+
var tokeniser = new Tokeniser(expression);
1716
var infixTokens = tokeniser.Tokenise();
1817

1918
var parser = new Parser();
2019
var prefixTokens = parser.ParseTokens(infixTokens);
21-
var ast = parser.GrowAst(prefixTokens);
2220

2321
Console.WriteLine($"Expression: {expression}");
24-
Console.WriteLine($"Infix: {Formatter.FormatAstAsInfix(ast.Root)}");
2522
Console.WriteLine($"Prefix: {Formatter.FormatPrefixTokens(prefixTokens)}");
23+
Console.WriteLine($"Infix: {Formatter.FormatInfixTokens(infixTokens)}");
24+
25+
var ast = parser.GrowAst(prefixTokens);
2626

2727
var evaluator = new Evaluator(ast);
2828
var table = evaluator.EvaluateAll();

0 commit comments

Comments
 (0)