В настоящее время я изучаю, как работают лексеры и парсеры, и у меня есть следующий вопрос о состоянии машины. Например, мне нужно раскрасить текст по следующему правилу:
Для этого правила простая таблица перехода состояний будет выглядеть так:
current event next action
IDLE $ COLOR -
COLOR any - OnColor()
COLOR \n IDLE -
Это вызовет действие OnColor () для каждого символа между '$' и концом строки, чтобы я мог его раскрасить. Конечно, то же самое может быть автоматически сгенерировано из регулярного выражения, но я действительно хочу знать, как это работает, перед использованием тяжелой магии :). Далее идет проблема: если у меня есть правило:
(хочу закрасить любую строку текста, заканчивающуюся долларом, таблица переходов между состояниями не очень понятна:
current event next action
IDLE any - -
IDLE $ DOUND_DOLLAR -
FOUND_DOLLAR \n IDLE OnDollar()
FOUND_DOLLAR any IDLE -
Я могу научить мой конечный автомат вызывать OnDollar (), если он находит знак «$» в конце строки, но что я могу сделать, чтобы раскрасить текст, который был ДО встречи со знаком доллара? Каковы общие закономерности решения таких проблем? Конечно, это будет 1 строка с регулярным выражением, но мне действительно интересно узнать, как такой парсер может быть реализован через конечный автомат и возможен ли он вообще.