public static string ReadPropertyValue(ReadFile input) { string lValue = string.Empty; bool lEscaped = false; while (!input.EOF) { char c = input.Get(); if ((c == ']') && (!lEscaped)) { return(lValue); } lValue = lValue + c.ToString(); if (lEscaped) { lEscaped = false; } else if (c == EscapeCharacter) { lEscaped = true; } } return(lValue); }
public static Property ReadProperty(ReadFile input) { string lName = string.Empty; string lValue = string.Empty; while (!input.EOF) { char c = input.Get(); if (Char.IsLetter(c)) { lName = lName + c.ToString(); } if (c == '[') { lValue = ReadPropertyValue(input); return(new Property(lName, lValue)); } } return(null); }
public static SGFTokens Tokenize(ReadFile input) { SGFTokens lTokens = new SGFTokens(); if (!input.IsOk()) { lTokens.SetErrorMessage(input.GetErrorMessage()); return(lTokens); } while (!input.EOF) { char c = input.Peek(); if (Char.IsLetter(c)) { Property lProperty = ReadProperty(input); if (lProperty == null) { lTokens.SetErrorMessage("ERROR: unable to parse sgf file"); return(lTokens); } lTokens.Add(new SGFToken(lProperty)); } else { input.Get(); // read past the character if (c == '[') { lTokens.RemovePreviousWhitespace(); SGFToken lSGFToken = lTokens.LastToken(); if ((lSGFToken == null) || (lSGFToken.Type != TokenType.PROPERTY)) { lTokens.SetErrorMessage("ERROR: unable to parse sgf file"); return(lTokens); } string lValue = ReadPropertyValue(input); lSGFToken.Property.AdditionalValues.Add(lValue); } else if (c == '(') { lTokens.Add(new SGFToken(TokenType.OPENPARAN)); } else if (c == ')') { lTokens.Add(new SGFToken(TokenType.CLOSEPARAN)); } else if (c == ';') { lTokens.Add(new SGFToken(TokenType.SEMICOMMA)); } else if (WhitespaceCharacters.IndexOf(c) >= 0) { lTokens.AddWhitespace(c.ToString()); } } } return(lTokens); }