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