示例#1
0
        private string ReadOperator(SymbolSequence op)
        {
            var x = _chars.GetNext();

            if (!char.IsPunctuation(x) && !char.IsSymbol(x))
            {
                _chars.PutBack(x);
                return(op.Operator);
            }
            var nextOp = op.Get(x);

            if (nextOp == null)
            {
                _chars.PutBack(x);
                return(op.Operator);
            }

            var recurse = ReadOperator(nextOp);

            if (recurse != null)
            {
                return(recurse);
            }
            _chars.PutBack(x);
            if (!string.IsNullOrEmpty(op.Operator))
            {
                return(op.Operator);
            }
            return(null);
        }
示例#2
0
        public TokenScanner(ICharacterSequence chars)
        {
            _chars     = chars ?? throw new ArgumentNullException(nameof(chars));
            _operators = new SymbolSequence();

            // punctuation
            _operators.Add(".", ",", ";");

            // Parens
            _operators.Add("(", ")");

            // Arithmetic operators
            _operators.Add("+", "-", "/", "*", "&", "|", "^");

            // Unary ~. Unary - and + are covered above
            _operators.Add("~");

            // "=" is both for comparison and assignment
            _operators.Add("=");

            // Comparison operators
            _operators.Add("!=", "<>", ">", "<", ">=", "<=");

            // Assignment operators
            _operators.Add("+=", "-=", "*=", "/=", "%=", "&=", "^=", "|=");
        }