Добрый день!
Помогите пожалуйста разобраться с конечными автоматами. Нужно сделать разбор текста формата json. Да, знаю, есть инструменты flex и bison, которые могут делать парсеры по описанию грамматики, но мне нужно разобраться как реализовать конечный автомат на C++ без применения этих инструментов. Я нарисовал следующую диаграмму состояний: здесь. Такой автомат не может работать с вложенными конструкциями: объектами и массивами, только с последовательностью пар «name»:value.
Вопросы в следующем:
1. Допустим такой автомат будет переключаться из состояния в состояние по мере чтения символов, но как на практике можно это использовать? Была идея при переходе в нужные состояния генерировать события: например перешли в состояние ожидания кавычки, сработал обработчик и записал положение начала строки, считали другую кавычку - другой обработчик, записали конец строки. Все бы хорошо, но значения могут быть строками (в кавычках), числами и литералами (без кавычек), и не получается единообразно получать начала и концы строк. Или может нужно как-то по-другому перерисовать диаграмму? Вообще как применяются конечные автоматы на практике в плане архитектуры?
2. Я читал, что для обработки вложенных конструкций применяются Магазинные автоматы. Как можно нарисовать диаграмму такого автомата? Что должно храниться в стеке? Как реализовать в плане архитектуры такой автомат? Когда считывается фигурная скобка, по идее, нужно сохранить в стек текущее состояние. Какой состояние будет при этом у нового автомата? Init? Хорошо, а когда будет закрывающая скобка, нужно вернуть из стека прежнее состояние. А какое оно должно быть? Мы сохраняли состояние ожидания фигурной скобки. Куда дальше переходить из этого состояния? Ведь на этом уровне автомат не должен знать что там внутри скобок.
А какая должна быть архитектура? Как представить автомат? В виде класса? Что пихать в стек? В общем, много вопросов. Подскажите пожалуйста как решаются подобные задачи с конечными автоматами.