//Read a structure private static void ReadValueStruct(char c, Parser parser) { //Ignore whitespace if (char.IsWhiteSpace(c)) { return; } //Catch comments if (c == '/') { parser.StateStack.Push(State.COMMENT); parser.CurrentString.Clear(); parser.CurrentString.Append(c); return; } //Check for the end of the structure if (c == '}') { KVObject value = parser.ObjStack.Pop(); parser.ObjStack.Peek().AddProperty(value.Key, new KVValue(KVType.OBJECT, value)); parser.StateStack.Pop(); return; } //Start looking for the next property name parser.StateStack.Push(State.PROP_NAME); parser.CurrentString.Clear(); parser.CurrentString.Append(c); }
public KV3File( KVObject root, string encoding = "text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d}", string format = "generic:version{7412167c-06e9-4698-aff2-e63eb59037e7}") { Root = root; Encoding = encoding; Format = format; }
public Parser() { //Initialise datastructures ObjStack = new Stack <KVObject>(); StateStack = new Stack <State>(); StateStack.Push(State.HEADER); Root = new KVObject("root"); ObjStack.Push(Root); PreviousChar = '\0'; CharBuffer = new Queue <char>(); CurrentString = new StringBuilder(); }
//Seeking value state private static void SeekValue(char c, Parser parser) { //Ignore whitespace if (char.IsWhiteSpace(c) || c == '=') { return; } //Check struct opening if (c == '{') { parser.StateStack.Pop(); parser.StateStack.Push(State.VALUE_STRUCT); parser.ObjStack.Push(new KVObject(parser.CurrentString.ToString())); } //Check for array opening else if (c == '[') { parser.StateStack.Pop(); parser.StateStack.Push(State.VALUE_ARRAY); parser.StateStack.Push(State.SEEK_VALUE); parser.ObjStack.Push(new KVObject(parser.CurrentString.ToString(), true)); } //Check for array closing else if (c == ']') { parser.StateStack.Pop(); parser.StateStack.Pop(); KVObject value = parser.ObjStack.Pop(); parser.ObjStack.Peek().AddProperty(value.Key, new KVValue(KVType.ARRAY, value)); } //String opening else if (c == '"') { //Check if a multistring or single string was found string next = PeekString(parser, 4); if (next.Contains("\"\"\n") || next == "\"\"\r\n") { //Skip the next two "'s SkipChars(parser, 2); parser.StateStack.Pop(); parser.StateStack.Push(State.VALUE_STRING_MULTI); parser.CurrentString.Clear(); } else { parser.StateStack.Pop(); parser.StateStack.Push(State.VALUE_STRING); parser.CurrentString.Clear(); } } //Boolean false else if (ReadAheadMatches(parser, c, "false")) { parser.StateStack.Pop(); //Can directly be added parser.ObjStack.Peek().AddProperty(parser.CurrentName, new KVValue(KVType.BOOLEAN, false)); //Skip next characters SkipChars(parser, "false".Length - 1); } //Boolean true else if (ReadAheadMatches(parser, c, "true")) { parser.StateStack.Pop(); //Can directly be added parser.ObjStack.Peek().AddProperty(parser.CurrentName, new KVValue(KVType.BOOLEAN, true)); //Skip next characters SkipChars(parser, "true".Length - 1); } //Null else if (ReadAheadMatches(parser, c, "null")) { parser.StateStack.Pop(); //Can directly be added parser.ObjStack.Peek().AddProperty(parser.CurrentName, new KVValue(KVType.NULL, null)); //Skip next characters SkipChars(parser, "null".Length - 1); } // Number else if (char.IsDigit(c)) { parser.StateStack.Pop(); parser.StateStack.Push(State.VALUE_NUMBER); parser.CurrentString.Clear(); parser.CurrentString.Append(c); } //Flagged resource else { parser.StateStack.Pop(); parser.StateStack.Push(State.VALUE_FLAGGED); parser.CurrentString.Clear(); parser.CurrentString.Append(c); } }