private static LexObject LexExisting(int lineNum, int charNum, char c, LexObject existing) { switch (existing.Type) { case LexType.Value: if (Char.IsWhiteSpace(c)) { return(null); } if (NonValueCharacters.Contains(c)) { return(LexNew(lineNum, charNum, c)); } existing.Value += c.ToString(CultureInfo.InvariantCulture); return(existing); case LexType.String: existing.Value += c.ToString(CultureInfo.InvariantCulture); return(c == '"' ? null : existing); case LexType.Comment: return(c == '\n' ? null : existing); default: return(LexNew(lineNum, charNum, c)); } }
private static void Assert(LexObject obj, bool value, string error) { if (!value) { throw new ProviderException("Unable to parse FGD. " + error.Trim() + "\n" + "On line " + obj.LineNumber + ", character " + obj.CharacterNumber); } }
private static VariableType ParseVariableType(LexObject obj) { var type = obj.Value.ToLower().Replace("_", ""); VariableType vt; if (Enum.TryParse(type, true, out vt)) { return(vt); } throw new ProviderException("Unable to parse FGD. Invalid variable type: " + type + ".\n" + "On line " + obj.LineNumber + ", character " + obj.CharacterNumber); }
private static ClassType ParseClassType(string type, LexObject obj) { type = type.ToLower().Replace("class", ""); ClassType ct; if (Enum.TryParse(type, true, out ct)) { return(ct); } throw new ProviderException("Unable to parse FGD. Invalid class type: " + type + ".\n" + "On line " + obj.LineNumber + ", character " + obj.CharacterNumber); }
private static IEnumerable <LexObject> Lex(TextReader reader) { var lineNum = 1; var charNum = 0; int i; LexObject current = null; while ((i = reader.Read()) >= 0) { var c = Convert.ToChar(i); if (c == '\n') { lineNum++; charNum = 0; } else { charNum++; } if (current == null) { current = LexNew(lineNum, charNum, c); } else { var le = LexExisting(lineNum, charNum, c, current); if (le != current) { yield return(current); current = le; } } } if (current != null) { yield return(current); } }
private static LexObject LexExisting(char c, LexObject existing) { switch (existing.Type) { case LexType.Value: if (Char.IsWhiteSpace(c)) { return null; } if (NonValueCharacters.Contains(c)) { return LexNew(c); } existing.Value += c.ToString(); return existing; case LexType.String: existing.Value += c.ToString(); return c == '"' ? null : existing; case LexType.Comment: return c == '\n' ? null : existing; default: return LexNew(c); } }
private static VariableType ParseVariableType(LexObject obj) { var type = obj.Value.ToLower().Replace("_", ""); VariableType vt; if (Enum.TryParse(type, true, out vt)) { return vt; } throw new ProviderException("Unable to parse FGD. Invalid variable type: " + type + ".\n" + "On line " + obj.LineNumber + ", character " + obj.CharacterNumber); }
private static ClassType ParseClassType(string type, LexObject obj) { type = type.ToLower().Replace("class", ""); ClassType ct; if (Enum.TryParse(type, true, out ct)) { return ct; } throw new ProviderException("Unable to parse FGD. Invalid class type: " + type + ".\n" + "On line " + obj.LineNumber + ", character " + obj.CharacterNumber); }