Skip to content

Commit 5639c6a

Browse files
committed
Cleaned up parsing code
1 parent b1bbe94 commit 5639c6a

File tree

1 file changed

+34
-34
lines changed

1 file changed

+34
-34
lines changed

BooleanExpressionParser/Parser.cs

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@ namespace BooleanExpressionParser;
22

33
class Parser
44
{
5+
static readonly Dictionary<Type, Type> TokenNodeMap = new Dictionary<Type, Type>
6+
{
7+
{ AndOperatorToken, AndOperatorNode },
8+
{ OrOperatorToken, OrOperatorNode },
9+
{ NotOperatorToken, NotOperatorNode },
10+
{ NandOperatorToken, NandOperatorNode },
11+
{ NorOperatorToken, NorOperatorNode },
12+
{ XorOperatorToken, XorOperatorNode },
13+
{ XnorOperatorToken, XnorOperatorNode },
14+
{ ImplicationOperatorToken, ImplicationOperatorNode },
15+
16+
};
17+
518
public Parser()
619
{
720
}
@@ -19,15 +32,8 @@ public IEnumerable<Token> ParseTokens(IEnumerable<Token> tokens)
1932
output.Enqueue(token);
2033
break;
2134

22-
case AndOperatorToken:
23-
case OrOperatorToken:
24-
case NotOperatorToken:
25-
case XorOperatorToken:
26-
case NandOperatorToken:
27-
case NorOperatorToken:
28-
case XnorOperatorToken:
29-
case ImplicationOperatorToken:
30-
while ((stack.Count > 0 && stack.Peek() is OperatorToken && stack.Peek() is not OpenParenToken) && ((stack.Peek() as OperatorToken)!.Precedence >= (token as OperatorToken)!.Precedence))
35+
case OperatorToken op:
36+
while ((stack.Count > 0 && stack.Peek() is OperatorToken && stack.Peek() is not OpenParenToken) && ((stack.Peek() as OperatorToken)!.Precedence >= op!.Precedence))
3137
{
3238
output.Enqueue(stack.Pop());
3339
}
@@ -83,35 +89,29 @@ public Ast GrowAst(IEnumerable<Token> tokens)
8389
if (!variables.Contains(var.Name)) variables.Add(var.Name);
8490
break;
8591

86-
case AndOperatorToken:
87-
case OrOperatorToken:
88-
case XorOperatorToken:
89-
case NandOperatorToken:
90-
case NorOperatorToken:
91-
case XnorOperatorToken:
92-
case ImplicationOperatorToken:
93-
if (stack.Count < 2) throw new Exception($"2 parameters needed for operator ${token}");
94-
95-
if (token is AndOperatorToken)
96-
stack.Push(new AndOperatorNode(stack.Pop(), stack.Pop()));
97-
else if (token is OrOperatorToken)
98-
stack.Push(new OrOperatorNode(stack.Pop(), stack.Pop()));
99-
else if (token is NorOperatorToken)
100-
stack.Push(new NorOperatorNode(stack.Pop(), stack.Pop()));
101-
else if (token is NandOperatorToken)
102-
stack.Push(new NandOperatorNode(stack.Pop(), stack.Pop()));
103-
else if (token is XorOperatorToken)
104-
stack.Push(new XorOperatorNode(stack.Pop(), stack.Pop()));
105-
else if (token is XnorOperatorToken)
106-
stack.Push(new XnorOperatorNode(stack.Pop(), stack.Pop()));
107-
else if (token is ImplicationOperatorToken)
108-
stack.Push(new ImplicationOperatorNode(stack.Pop(), stack.Pop()));
109-
break;
110-
11192
case NotOperatorToken:
11293
if (stack.Count < 1) throw new Exception($"1 parameter needed for operator ${token}");
11394
stack.Push(new NotOperatorNode(stack.Pop()));
11495
break;
96+
97+
// All other operators
98+
case OperatorToken:
99+
if (stack.Count < 2) throw new Exception($"2 parameters needed for operator ${token}");
100+
101+
OperatorNode node = token switch
102+
{
103+
AndOperatorToken => new AndOperatorNode(stack.Pop(), stack.Pop()),
104+
OrOperatorToken => new OrOperatorNode(stack.Pop(), stack.Pop()),
105+
NorOperatorToken => new NorOperatorNode(stack.Pop(), stack.Pop()),
106+
NandOperatorToken => new NandOperatorNode(stack.Pop(), stack.Pop()),
107+
XorOperatorToken => new XorOperatorNode(stack.Pop(), stack.Pop()),
108+
XnorOperatorToken => new XnorOperatorNode(stack.Pop(), stack.Pop()),
109+
ImplicationOperatorToken => new ImplicationOperatorNode(stack.Pop(), stack.Pop()),
110+
_ => throw new Exception($"Unknown operator ${token}")
111+
};
112+
113+
stack.Push(node);
114+
break;
115115
}
116116
}
117117

0 commit comments

Comments
 (0)