Obvious answer - make parser. Parser is just some sort of finite-state machine. I would make one for you, but I currently don't have time for this. I just can give some advices. Parser parses text symbol by symbol. When each symbol is processed, parser either continues to stay in the same state, switches to another or performs some action. First of all you need to define symbol classes - white space, character, number, quote, opening bracket, closing braket, etc. What states can I suggest?
psWaitForDialogID - skip all white spaces (space, CRLF) before first dialog ID, first character switches parser to next state, any non character should cause error
psDialogID - store all characters to dialog ID variable, first non-character or white space switches parser to next state, creates Dialog object
psWaitForDialogOpeningBracket - skip all white space before first dialog opening bracket, any character, except white space or bracket causes error, closing bracket returns parser to psWaitForDialogID state
psWaitForDataID - skip all white spaces before data ID, etc.
psDataID - creates Data object and adds it to Dialog object
psWaitForDataOpeningBracket - closing bracket returns parser to psWaitForDataID state
psWaitForOptionID
psOptionID - creates Option object and adds it to Data object
psWaitForOptionBraket - closing bracket returns parser to psWaitForOptionID state
psWaitForNameOpeningQuote
psName
psWaitForValueOpeningQuote - error, if anything, but white space of quote, quote adds another option to Data object
Also, this parser is simple, but not optimal, cuz, as you can see, Dialog, Data and Option blocks have similar structure, so you can also use advanced parser - recursive one.