/// <summary> /// Add Operand to this node /// </summary> /// <param name="operand"></param> public void AddOperand(BoolExpr operand) { ((OperandArray)Operands).Add(operand); }
/// <summary> /// Get pair of next token and boolexpr, /// and then remove that characters and whitespaces /// </summary> private Tuple <Symbol, BoolExpr> Tokenize(StringBuilder src) { int nRead = 1; Symbol symbol = Symbol.END; BoolExpr expr = null; // remove whitespaces while (src.Length > 0 && @" \t\n\r\f".IndexOf(src[0]) != -1) { src.Remove(0, 1); } // end of source? if (src.Length == 0) { return(Tuple.Create(symbol, expr)); } switch (src[0]) { case '(': symbol = Symbol.LP; break; case ')': symbol = Symbol.RP; break; case '1': symbol = Symbol.VAL; expr = new BoolExpr(BoolExpr.NodeType.TRUE); break; case '0': symbol = Symbol.VAL; expr = new BoolExpr(BoolExpr.NodeType.FALSE); break; case '!': symbol = Symbol.NOT; expr = new BoolExpr(BoolExpr.NodeType.NOT); break; case '&': symbol = Symbol.AND; expr = new BoolExpr(BoolExpr.NodeType.AND); break; case '|': symbol = Symbol.OR; expr = new BoolExpr(BoolExpr.NodeType.OR); break; case '=': if (src.Length >= 2 && src[1] == '>') { nRead = 2; symbol = Symbol.IMP; expr = new BoolExpr(BoolExpr.NodeType.IMP); } break; case '<': if (src.Length >= 3 && src[1] == '=' && src[2] == '>') { nRead = 3; symbol = Symbol.IFF; expr = new BoolExpr(BoolExpr.NodeType.IFF); } break; default: // identifier var m = IdentifierSyntax.Match(src.ToString()); if (m.Success) { nRead = m.Value.Length; symbol = Symbol.VAL; expr = new BoolExpr(BoolExpr.NodeType.VAR, m.Value); } else { throw new Exception("Syntax Error -1"); } break; } // remove tokenized characters src.Remove(0, nRead); return(Tuple.Create(symbol, expr)); }