Beispiel #1
0
 /// <summary>
 /// Add Operand to this node
 /// </summary>
 /// <param name="operand"></param>
 public void AddOperand(BoolExpr operand)
 {
     ((OperandArray)Operands).Add(operand);
 }
Beispiel #2
0
        /// <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));
        }