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); }
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("+=", "-=", "*=", "/=", "%=", "&=", "^=", "|="); }