OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 18 Апрель, 2024 13:57

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Лексические тонкости Оберонов
СообщениеДобавлено: Среда, 06 Январь, 2010 13:28 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Лексема - это, как известно, минимальная конструкция, имеющая самостоятельный смысл. Это неформальное определение оставляет разработчику языка простор в выборе того, какие синтаксические конструкции являются "минимальными, имеющими самостоятельный смысл", а какие нет. Неаккуратность в этом вопросе может привести к забавным примерам:
Код:
VAR a

(* многостраничный комментарий :) *)

*: INTEGER;
Этот пример компилируется без сучка и задоринки. Думаю, что большинство Оберон-программистов и не подозревают, что им предоставлена "ценная" возможность отрывать метку экспорта от своего идентификатора :) . Точно также можно оторвать импортированный идентификатор от имени модуля, а также поле от записи.

Между тем, синтаксис нетерминалов IdentDef и Qualident относится к классу регулярных выражений, и ни что не мешало придать им статус лексической единицы.

Справедливости ради, следует отметить, что на практике эти тонкости не вызывают никаких проблем :D .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Среда, 06 Январь, 2010 14:15 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Это, между прочим, говорит о том, что комментарий в некоторых местах нужно просто запретить.
А вообще про звездочки я уже возникал... :) Для С-программера звездочка как красная тряпка-указатель... :)
Лучше было бы сделать видимость с помощью обычного ключевого слова...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Среда, 06 Январь, 2010 15:34 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Валерий Лаптев писал(а):
Это, между прочим, говорит о том, что комментарий в некоторых местах нужно просто запретить.
Комментарий и так уже в некоторых местах запрещён :roll: . Я имел в виду внутри лексем.
То есть, если бы IdentDef обозначал класс лексем, то между идентификатором и меткой экспорта не то что комментарий, пробел даже нельзя было бы вставить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 13:05 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
igor писал(а):
Между тем, синтаксис нетерминалов IdentDef и Qualident относится к классу регулярных выражений, и ни что не мешало придать им статус лексической единицы.

А как будет разрешаться неоднозначность на уровне сканера? Работа сканера должна зависеть от контекста? Или требовать обязательно ставить пробелы?
Код:
x := a*b
ident ":=" ident "*" ident
ident ":=" identDef ident

x := a.b.c.d
ident ":=" ident "." ident "." ident "." ident
ident ":=" qualIdent "." ident "." ident
ident ":=" qualIdent "." qualIdent
igor писал(а):
Справедливости ради, следует отметить, что на практике эти тонкости не вызывают никаких проблем :D .
Сами и отвечаете на вопрос обоснованности такого усложнения.

P.S.
Код:
 int main (int argc, char *
/* многостраничный комментарий */
*
/* многостраничный комментарий */
argv)
{ return 0; }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 17:22 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Евгений Темиргалеев писал(а):
А как будет разрешаться неоднозначность на уровне сканера? Работа сканера должна зависеть от контекста? Или требовать обязательно ставить пробелы?
Код:
x := a*b
ident ":=" ident "*" ident
ident ":=" identDef ident

Да, действительно :roll: . Если нетерминал IdentDef возвести в ранг лексем identDef, то РБНФ для начального символа грамматики сканера будет выглядеть так:
Код:
lexeme = {blank} (ident | identDef | number | ... ).
Такой синтаксис хоть и является регулярным, как я справедливо подметил, но не является детерминированным (вот в чём ошибка!), потому что альтернативы ident и identDef могут иметь одинаковые начальные символы, со всеми вытекающими последствиями.

PS: Должен сказать, что "синий букварь" здорово помогает разобраться во всех этих вопросах :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 17:54 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Рассмотрим три конкретных лексемы: число "20", идентификатор "X" и символьную константу "20Х". Вопрос: как сканер умудряется их различать, ведь "20" и "20Х" начинаются одинаково?

Ответ потрясающий, конечно :) . Дело в том, что он их в первом приближении и не различает вовсе. С точки зрения сканера лексема "20Х" - это тоже число. Но только число, имеющее определённый атрибут (DevCPS.numtyp), уточняющий, что это число является кодом символа.

Сообшение о языке (КП) тоже не врёт: "Лексемы суть идентификаторы, числа, операции и ограничители". Символьной константы в этом списке нет.
Вобщем, всё сходится :) .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 19:11 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Если говорить о лексике КП, то в сообщении о языке, имхо, не хватает одного правила:
"Между идентификаторами и числами, следующими друг за другом в любом сочетании, должен быть хотя бы один пробел или конец строки ( или символ табуляции)."


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 19:45 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
igor писал(а):
Рассмотрим три конкретных лексемы: число "20", идентификатор "X" и символьную константу "20Х". Вопрос: как сканер умудряется их различать, ведь "20" и "20Х" начинаются одинаково?
Мой сканер многоуровневый, он их различает так. На первом уровне есть понятие последовательности цифр ("20") и последовательности букв ("X"). На следующем уровне, где производится распознавание чисел, ожидается, что за последовательностью цифр может идти буква H, X, E или D, которая и определяет тип числовой константы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 21:11 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Александр Ильин писал(а):
Мой сканер многоуровневый, он их различает так.
... за последовательностью цифр может идти буква H, X, E или D, которая и определяет тип числовой константы.
А каким образом этот тип числовой константы становится известен парсеру? Если сканер сохраняет результат второго уровня в какой-либо глобальной переменной и экспортирует её, то это и есть тот самый атрибут, о котором я говорил. В этом случае Ваш сканер использует ту же основную идею, что и блэкбоксовский сканер.

Принципиально в этом вопросе, на мой взгляд, то, что если после последовательности цифр идёт буква Х (или другая), то это не меняет класса лексемы. Она по прежнему остаётся числом. Получается, что такой лексемы как символьная константа вообще как бы нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 22:02 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
На входе токены Scanner.ident (последовательность букв) и Scanner.number (последовательность цифр). На выходе токены ScanNumber.hexNumber, ScanNumber.hexChar, ScanNumber.realNumber, ScanNumber.longRealNumber либо ScanNumber.error. Глобальной переменной нет, а идёт преобразование потока токенов от простых к сложным. Соответственно, токены не только могут заменяться, но и их количество на выходе может быть меньше, чем на входе. На самом первом уровне приходят отдельные символы, на последнем - распознанные неделимые сущности. Например, строковые константы, блоки комментариев, цепочки пробелов и т.п. - всё то, внутреннее устройство чего не имеет значения для дальнейшей обработки.

Если после уровня ScanNumber в потоке остался токен Scanner.number, то это может быть только обычное десятичное число без всяких модификаторов. Таким образом, состояние сканера максимально локализовано.
igor писал(а):
Получается, что такой лексемы как символьная константа вообще как бы нет.
Получается, что у меня такие лексемы есть? Интересно, какие это может повлечь последствия?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 23:19 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сначала, на всякий случай уточню, что термины "токен" и "лексема" являются синонимами. Причём, к термину "токен" тяготеют, имхо, в основном зарубежные спецы.

Александр Ильин писал(а):
... идёт преобразование потока токенов от простых к сложным.
Вот эта фраза даёт ключ к пониманию. Думаю, что определение "сложный" в данном случае следует трактовать как "состоящий из простых". Похоже, у Вас реализована концепция "суперлексем". Ведь из определения лексем следует, что лексемы не могут внутри себя содержать другие лексемы. Но из того алгоритма, который Вы описали, следует, что некоторые "лексемы на выходе" могут включать в себя несколько "лексем на входе". Вот такие составные лексемы и называются суперлексемами. С точки зрения теории формальных языков эта концепция несколько подмывает фундамент науки. Но на практике это работает :) .
Александр Ильин писал(а):
igor писал(а):
Получается, что такой лексемы как символьная константа вообще как бы нет.
Получается, что у меня такие лексемы есть? Интересно, какие это может повлечь последствия?
Хм... Есть одна хорошая новость и одна плохая (С) :) .
Хорошая новость состоит в том, что таблица имён несколько упрощается. В ней теперь не нужно хранить дополнительные атрибуты лексем. Достаточно и самих лексем.
А плохая новость ..., я пока не до конца продумал :) . Подозреваю, что может возникнуть проблема, на которую указывал Евгений. Я имею в виду необходимость обязательно вставлять пробелы между определёнными классами лексем. Впрочем, этот вопрос пока остаётся открытым. (Время третий час ночи. Спать пора! :) )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 23:24 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Удивляюсь я на Вас.... То у Вас заморочки в C-шных неравенствах, то как отличить числовые лексемы :shock:

Как различает ??? Да он устроен так, этот лексер !!!
Принимает самую длинную лексему - это он устроен так, по определению. Любой лексер. И никаких проблем с этим ни у каких лексеров не возникает. И не возникало никогда.


Последний раз редактировалось Galkov Пятница, 08 Январь, 2010 23:55, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 23:43 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Galkov писал(а):
Удивляюсь я на Вас.... :shock:

Как различает ??? Да он устроен так этот лексер !!!
Принимает самую длинную лексему - это он устроен так, по определению. Любой лексер.
Какой ещё "любой лексер"? Лично я обсуждаю отличия устройства моего лексера ( viewtopic.php?f=30&t=2205 ) от описанного в книге "Построение компиляторов" Н.Вирта (он же используется в ОС Oberon и компиляторе BlackBox).

- Папа, а как устроен мозг?
- Отстань, сынок, у меня голова другим забита!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Пятница, 08 Январь, 2010 23:59 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Александр, я не знаю устройства именно Вашего лексера :wink:
Но рискну предположить, что и Ваш принимает "самую длинную" лексему.
В противном случае - ни хрена у Вас работать не будет.

Вывод: ирония была крайне неуместна :P


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Суббота, 09 Январь, 2010 00:01 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Или что, надо две страницы разъяснять, что "20X" более длинная лексема, чем "20" :?:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Суббота, 09 Январь, 2010 00:20 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Galkov писал(а):
Но рискну предположить, что и Ваш принимает "самую длинную" лексему.
В противном случае - ни хрена у Вас работать не будет.
Вопрос как раз и состоит в том, что считать лексемой, и как оно должно или может работать.
Galkov писал(а):
Или что, надо две страницы разъяснять, что "20X" более длинная лексема, чем "20"
Для моего сканера "20" и "X" - это две разные лексемы, которые объединяются только при определённых условиях.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Суббота, 09 Январь, 2010 00:28 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Вот и я говорю - офигеть можно от глубины вопроса
Так же, как и от разборок с неравенствами :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Суббота, 09 Январь, 2010 00:33 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Александр Ильин писал(а):
Для моего сканера "20" и "X" - это две разные лексемы, которые объединяются только при определённых условиях
Должен Вам посочувствовать.
Теоретически, можно гланды по разному вырезать...
Но, например, комментарии между этими двумя лексемами - это находка, конечно же


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Суббота, 09 Январь, 2010 00:53 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Galkov писал(а):
Должен Вам посочувствовать.
Спасибо за сочувствие. И за вклад в обсуждение, конечно же! Мы приближаемся к обещанной вами второй странице.
Galkov писал(а):
надо две страницы разъяснять


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Лексические тонкости Оберонов
СообщениеДобавлено: Суббота, 09 Январь, 2010 04:51 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
А я вполне серьезно, между прочим.
Есть ОПРЕДЕЛЕНИЯ в лексике, синтаксисе, ну и в семантике в какой-то степени.
И начинается обсуждение, как следует понимать эти определения - дурдом ведь.
Чего там обсуждать - понимать как написано. Это написанное, даже тупой компьютер понимает.

Это касается как "синтаксиса неравенств", так применения "пробелов", переводов строк, комментариев...
Кстати говоря, если уж в синтаксис КП в "Сообщении о языке..." прописан с математической точностью, то не понятно, почему так же не расписана лексика (регулярные выражения для лексем) - там же.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB