ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
28 августа
315002 Топик полностью
fk0, легенда (14.03.2012 17:09 - 17:13, просмотров: 72) ответил Михаил Е. на Чтож ты так нервничаешь, успокойся. AlexD говорил про 1 байт для приема, а не для работы всего парсера. А четыре автомата это не очень то сложно, AlexD прав. А 4 байта состояний автоматов этот вовсе не 2^32 состояний, используется всего несколько
Попробуй дать оценку минимально возможному количеству состояний. Во-первых речь уже не о так называемом "недетерминированном конечном автомате" (Структуры данных и алгоритмы - Ахо, Хопкрофт, Ульман -- для справки). Потому, что он должен же как-то различать слова с одинаковыми префиксами, например. Детерминированный КА отличается тем, что при приёме очередного символа он переходит в некое другое однозначное состояние -- в данном случае, это очевидно не так для одинаковых префиксов у двух токенов, например. Для интересующихся на rsdn есть статья . Вообще для лексического анализа обычно используются НКА (отсылаю к литературе) и AlexD видимо изобрёл что-то новое не иначе. Так вот обращаться с НКА можно двумя способами далее. Либо как описано в статье, на которую ссылка, сохранять список возможных состояний, либо преобразовать НКА в ДКА (детерминированный автомат). Выше дана ссылка на книгу, если не ошибаюсь, там приведён подробный метод преобразования. В худшем случае число состояний ДКА примерно пропорционально ex. Такие вещи не программируются руками попросту ввиду объёма, а если и программируются вообще, то там автомат управляется таблицей, и таблицы генерируются автоматически. Число состояний НКА же, примерно пропорционально числу символов в наиболее длинном токене. Я где-то не прав? И уж стоило бы промолчать про EBNF. Это куда проще. И совершенно непонятно вообще, как не имея формальной грамматики можно (из головы) что-то программировать. Возвращаясь к автоматам -- в случае НКА у него есть память в виде переменной состояния ("множество" -- это не байт и не два, разве что только упаковать его в битовый массив, то может в 4 и влезет), в которой в "неявном" виде хранится анализируемый токен. Чем это отличается от накопления символов в переменной и выполнения strcmp() по списку? Последнее, боюсь, только проще для программирования, чем углубление в теорию автоматов... Отвечая на ваше сообщение: 4 байта в 4-х ДКА (а тут говорят только о ДКА, всегда когда говорят "автомат"...) -- это N1*N2*N3*N4 состояний, где Nx -- число состояний одного автомата. Да, не 2^32, но достаточно много.
[ZX]