igor писал(а):
Вы, наверное правы, что есть лексеры, которые являются недетерминированными автоматами. Книга Дракона, на которую Вы ссылались, даёт на этот случай жалкую рекомендацию "быть аккуратными". А ещё предостерегает, что дескать иногда приходится откатываться назад, чтобы "перебрать все возможные варианты". Ужас!
1) Мое утверждение, что не просто есть, а большинство
2) Полный формализм позволяет описать и лексеры с "откатами". Но это определяется не формализмом, а фантазиями разработчика. Кстати говоря, "инструмент" делает такие предупреждения разработчику. Ибо "откаты" усложняют целевой код. Скажем, формально записанные требования к лексеру Оберон-0 откатов не потребуют.
Ужас или не ужас, но именно так устроена жизнь: кто-то живет "ужасно", а кто-то - красиво.
А инструмент просто сообщает свой "диагноз", ни на чем не настаивая. Как и положено инструменту, собственно
igor писал(а):
Иными словами говоря, можно разработать такой язык, в котором лексика будет задана детерминированным регулярным языком, а синтаксис - детерминированным контекстно-свободным языком
Вот и славненько. Только лексика Оберонов, являясь регулярной, не является детерминированной
Вот так может выглядеть часть ее
формального определения:
Код:
{blank} {/* пустышка=пропуску */}
...
"<" {... RETURN lxLT}
"<=" {... RETURN lxLE}
ELSE {... RETURN lxELSE}
ELSIF {... RETURN lxELSIF}
...
{alpha}{alphanum}* {... RETURN lxIdent}
{digit}+ {... RETURN lxInteger}
{digit}{hexdigit}*X {... RETURN lxChar}
...
. {... RETURN lxNull}
Хотите верьте, хотите нет - но это определение хоть и регулярного, но недерминированного "синтаксиса"
Который самыми различными способами может быть сведен к конечному автомату (писал выше)
Помните автоматные коды для комментария в параллельном топике
Ну никак они не выводятся правилами Вирта. Но коллеги написали абсолютно правильно.
Как я делаю такой вывод ??? Написал
формальное определение для этого комментария (с пустым action) и сравнил с кодами коллег.
igor писал(а):
Перечисленные Вами паттерны относятся к одному и тому же классу лексем.
Ну давайте еще вводить будем классы классов лексем
Соглашусь, выкрутиться из ситуации, оставаясь в рамках, изложенных Виртом - непросто.
Но изобретать новые сущности - зачем спрашивается ???
Вы правильно думали: токены и лексемы - синонимы. Они и сейчас такие же, как мне кажется.
igor писал(а):
Извините за прямоту, но это бред!
Насчет извинить - легко !!!
Ровно в тот момент, когда Вы примените формальные правила Вирта проверки детерминированности.
Возмите нетерминал ident и определите для него множество FOLLOW, и проверите на непересечение с множеством FIRST для {letter|digit}
Руководствуясь не "здравым смыслом", а именно приведенным синтаксисом, анализируя вхождения этого нетерминала в синтаксические уравнения.
Вот я пробовал, и сообщаю свои выводы по результатам этих попыток. А Вы, мне показалось - еще нет.
Попробуйте, увлекательное занятие. И потом сверим наши результаты, может я и не прав, посмотрим.
Например, для упражнения 4.2 на стр.42. Или для синтаксиса в приложениях A1 и A2.
igor писал(а):
Другими словами говоря, лексика - это то же синтаксис, только на уровне элементарных терминальных символов, в то время как обычный синтаксис строится на уровне абстактных терминальных символов
Ну тогда я тоже сделаю замечание (хоть и не в первый раз)
Для парсера, вопрос:
сколько символов следет принять из входного потока - не стоит. Все
А для лексера - абсолютно актуальный вопрос. И на него дан ответ (ни из чего не выводимый), единый для всех в природе существующих лексеров, известный как правило "самой длинной лексемы"
Вот Вам и весь сказ.