OberonCore
https://forum.oberoncore.ru/

Лексические тонкости Оберонов
https://forum.oberoncore.ru/viewtopic.php?f=29&t=2223
Страница 1 из 3

Автор:  igor [ Среда, 06 Январь, 2010 13:28 ]
Заголовок сообщения:  Лексические тонкости Оберонов

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

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

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

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

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

Автор:  Валерий Лаптев [ Среда, 06 Январь, 2010 14:15 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

Автор:  igor [ Среда, 06 Январь, 2010 15:34 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

Автор:  Евгений Темиргалеев [ Пятница, 08 Январь, 2010 13:05 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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; }

Автор:  igor [ Пятница, 08 Январь, 2010 17:22 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

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

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

Автор:  igor [ Пятница, 08 Январь, 2010 17:54 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

Рассмотрим три конкретных лексемы: число "20", идентификатор "X" и символьную константу "20Х". Вопрос: как сканер умудряется их различать, ведь "20" и "20Х" начинаются одинаково?

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

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

Автор:  igor [ Пятница, 08 Январь, 2010 19:11 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

Автор:  Александр Ильин [ Пятница, 08 Январь, 2010 19:45 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

Автор:  igor [ Пятница, 08 Январь, 2010 21:11 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

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

Автор:  Александр Ильин [ Пятница, 08 Январь, 2010 22:02 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

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

Автор:  igor [ Пятница, 08 Январь, 2010 23:19 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

Сначала, на всякий случай уточню, что термины "токен" и "лексема" являются синонимами. Причём, к термину "токен" тяготеют, имхо, в основном зарубежные спецы.

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

Автор:  Galkov [ Пятница, 08 Январь, 2010 23:24 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

Удивляюсь я на Вас.... То у Вас заморочки в C-шных неравенствах, то как отличить числовые лексемы :shock:

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

Автор:  Александр Ильин [ Пятница, 08 Январь, 2010 23:43 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

Galkov писал(а):
Удивляюсь я на Вас.... :shock:

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

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

Автор:  Galkov [ Пятница, 08 Январь, 2010 23:59 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

Александр, я не знаю устройства именно Вашего лексера :wink:
Но рискну предположить, что и Ваш принимает "самую длинную" лексему.
В противном случае - ни хрена у Вас работать не будет.

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

Автор:  Galkov [ Суббота, 09 Январь, 2010 00:01 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

Или что, надо две страницы разъяснять, что "20X" более длинная лексема, чем "20" :?:

Автор:  Александр Ильин [ Суббота, 09 Январь, 2010 00:20 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

Автор:  Galkov [ Суббота, 09 Январь, 2010 00:28 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

Вот и я говорю - офигеть можно от глубины вопроса
Так же, как и от разборок с неравенствами :)

Автор:  Galkov [ Суббота, 09 Январь, 2010 00:33 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

Автор:  Александр Ильин [ Суббота, 09 Январь, 2010 00:53 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

Galkov писал(а):
Должен Вам посочувствовать.
Спасибо за сочувствие. И за вклад в обсуждение, конечно же! Мы приближаемся к обещанной вами второй странице.
Galkov писал(а):
надо две страницы разъяснять

Автор:  Galkov [ Суббота, 09 Январь, 2010 04:51 ]
Заголовок сообщения:  Re: Лексические тонкости Оберонов

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

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

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/