Skip to content

Commit 2d07ecd

Browse files
committed
Added implication (=>), removed support for using <> as brackets
1 parent 8ad1685 commit 2d07ecd

File tree

5 files changed

+20
-4
lines changed

5 files changed

+20
-4
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class ImplicationOperatorNode : OperatorNode
2+
{
3+
public ImplicationOperatorNode(Node left, Node right) : base(left, right) { }
4+
5+
public override bool Evaluate(Dictionary<string, bool> variables) => Left.Evaluate(variables) || !Right!.Evaluate(variables);
6+
}

BooleanExpressionParser/Parser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public IEnumerable<Token> ParseTokens(IEnumerable<Token> tokens)
2626
case NandOperatorToken:
2727
case NorOperatorToken:
2828
case XnorOperatorToken:
29+
case ImplicationOperatorToken:
2930
while ((stack.Count > 0 && stack.Peek() is OperatorToken && stack.Peek() is not OpenParenToken) && ((stack.Peek() as OperatorToken)!.Precedence >= (token as OperatorToken)!.Precedence))
3031
{
3132
output.Enqueue(stack.Pop());
@@ -88,6 +89,7 @@ public Ast GrowAst(IEnumerable<Token> tokens)
8889
case NandOperatorToken:
8990
case NorOperatorToken:
9091
case XnorOperatorToken:
92+
case ImplicationOperatorToken:
9193
if (stack.Count < 2) throw new Exception($"2 parameters needed for operator ${token}");
9294

9395
if (token is AndOperatorToken)
@@ -102,6 +104,8 @@ public Ast GrowAst(IEnumerable<Token> tokens)
102104
stack.Push(new XorOperatorNode(stack.Pop(), stack.Pop()));
103105
else if (token is XnorOperatorToken)
104106
stack.Push(new XnorOperatorNode(stack.Pop(), stack.Pop()));
107+
else if (token is ImplicationOperatorToken)
108+
stack.Push(new ImplicationOperatorNode(stack.Pop(), stack.Pop()));
105109
break;
106110

107111
case NotOperatorToken:

BooleanExpressionParser/Tokeniser.cs

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

55
class Tokeniser
66
{
7-
private readonly Regex regex = new Regex(@"([([{<]|[)\]}>]|\w+|[.&+!¬|])\s*");
7+
private readonly Regex regex = new Regex(@"([([{]|[)\]}]|[\w]+|[.&+!¬|]|=>)\s*");
88
private readonly string input;
99

1010
public Tokeniser(string input)
@@ -27,15 +27,16 @@ public IEnumerable<Token> Tokenise()
2727

2828
yield return token switch
2929
{
30-
"(" or "[" or "{" or "<" => new OpenParenToken(),
31-
")" or "]" or "}" or ">" => new CloseParenToken(),
30+
"(" or "[" or "{" => new OpenParenToken(),
31+
")" or "]" or "}" => new CloseParenToken(),
3232
"AND" or "." or "&" => new AndOperatorToken(),
3333
"OR" or "+" or "|" => new OrOperatorToken(),
3434
"NOT" or "!" or "¬" => new NotOperatorToken(),
3535
"XOR" => new XorOperatorToken(),
3636
"NAND" => new NandOperatorToken(),
3737
"NOR" => new NorOperatorToken(),
3838
"XNOR" => new XnorOperatorToken(),
39+
"=>" or "IMPLIES" => new ImplicationOperatorToken(),
3940
_ => new VariableToken(token)
4041
};
4142
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class ImplicationOperatorToken : OperatorToken
2+
{
3+
public ImplicationOperatorToken() : base(0) { }
4+
public override string ToString() => "=>";
5+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class XnorOperatorToken : OperatorToken
22
{
3-
public XnorOperatorToken() : base(3) { }
3+
public XnorOperatorToken() : base(1) { }
44
public override string ToString() => "XNOR";
55
}

0 commit comments

Comments
 (0)