OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 02:30

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




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

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


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

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

Такие обсуждения я нахожу для себя исключительно полезными. Я, конечно, понимаю, что эти обсуждения не достойны настоящих специалистов, которые и так всё знают и для них обсуждать тут нечего.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
igor писал(а):
Слово "тонкости" в названии топика должно было предупредить Вас об этой "глубине".

Такие обсуждения я нахожу для себя исключительно полезными.
Думаю, разумно ориентироваться на уровень типичного ополченца-непрофессионала-первокурсника.

Если кто-то от такого обмусоливания вслух лучше что-то поймет, -- оно и хорошо.


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

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


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

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

Знаете, чем ведущий инженер отличается от простого инженера? Тем, что он перестаёт корчить из себя суперспециалиста, и не брезгует лишний раз заглянуть в учебник, если в этом есть необходимость.

PS: Но, довольно оффтопа :) Предлагаю всем нам вернуться в тему.


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

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
igor писал(а):
Ну, тут Вы не правы
Тут-то мы как раз и ПРАВЫ.
Замечу еще, что я не смог бы себе позволить вышестоящий пост, не прочитавши п.3 "Сообщения о ..."
В процитированной Вами фразе, специально выделены курсивом слова "так же ... там же". Так вот, "так же" следует читать: "с математической точностью".
Скажем, в приложении B все записано в виде, понятном даже "тупому компьютеру". Разночтения невозможны в принципе. А в п.3 "тупой компьютер" никогда не поймет, что такое терминал char. Вот терминал letter - поймет, а char - нет.
Это и так очевидно ??? Возможно... Но именно из "очевидностей" и возникают почти все заморочки.
Некоторые вещи прописанны "словами" (отмечу еще раз: в отличие от приложения B). Мне это представляется совершенно понятным, например. А вот за "тупой компьютер" - уже не поручусь.
Ну например:
Цитата:
Комментарии могут вставляться между любой парой лексем в программе
- это как раз то, с чего Вы начинали топик, как мне показалось.
Но я не вижу здесь тех самых "особенностей", которые Вы обозначили в названии топика
В каком языке это НЕ ТАК, интересно :?:

Далее, Вы озадачились различением лексем разной длины. И что занимательно, в п.3 "Сообщения о ..." - об этом ни слова :!:
Ну я и высказал свои соображения о причинах этого умолчания. И оказалось, что это от того, что у меня избыток снобизма в следствии некого якобы профессионализма.
Ну да бог с ним: выскажите свои соображения этого умолчания, и давайте их обсудим.


igor писал(а):
Предлагаю всем нам вернуться в тему

Да запросто.
Вы отметили, что лексика очень подробно (с чем я согласен по большому счету-то) расписана в п.3.
Вот и славненько. Давайте покажем пальцем на то утверждение из этого текста, которое Вы считаете "особенностью"
Как бы в точном соответствии с названием топика.
А пока у меня вообще не получается понять предмета обсуждения. Ну не вижу я тех самых "особенностей"


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Galkov писал(а):
Скажем, в приложении B все записано в виде, понятном даже "тупому компьютеру". Разночтения невозможны в принципе. А в п.3 "тупой компьютер" никогда не поймет, что такое терминал char. Вот терминал letter - поймет, а char - нет.
В теории формальных языков понятие символа является базовым и не нуждается в определении.
В самом начале п.3 сказано, что используется набор литер ASCII плюс расширение Latin-1, определённое в стандарте ISO 8859-1. На мой взгляд, исчерпывающая информация.

Galkov писал(а):
Цитата:
Комментарии могут вставляться между любой парой лексем в программе
- это как раз то, с чего Вы начинали топик, как мне показалось.
... Но я не вижу здесь тех самых "особенностей", которые Вы обозначили в названии топика
Я начал свой топик с того, что мне показалось странным, что метку экспорта можно отрывать от идентификатора. Но дальнейшее обсуждение показало, что всё в порядке, распереживался я зря :) . Не знаю, чего Вы так кипятитесь.

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

Galkov писал(а):
Вы отметили, что лексика очень подробно (с чем я согласен по большому счету-то) расписана в п.3.
Вот и славненько. Давайте покажем пальцем на то утверждение из этого текста, которое Вы считаете "особенностью"
Как бы в точном соответствии с названием топика.
А пока у меня вообще не получается понять предмета обсуждения. Ну не вижу я тех самых "особенностей"
Хорошо, попробую пояснить.
Например, вещественная константа в экспоненциальной форме состоит из таких логических частей, как мантисса и порядок. Но, несмотря на это, эта константа является единой лексемой, между её частями нельзя вставить пробел (или комментарий).
Метка экспорта тоже не сама по себе. Она логически связана с идентификатором, после которого она стоит. Но в этом случае логические части "помеченного идентификатора" разрывать можно. Это та самая тонкость (Вы её называете особенностью, но это сути не меняет), которая и обсуждалась вначале.
Хочу Вам напомнить, что обсуждение уже состоялось. Все точки над i расставлены. Если у Вас есть что-то сказать или добавить или Вы подметили какие-нибудь другие тонкости или особенности, то буду рад послушать и продолжить обсуждение.


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

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
igor писал(а):
В теории формальных языков понятие символа является базовым и не нуждается в определении.
В самом начале п.3 сказано, что используется набор литер ASCII плюс расширение Latin-1, определённое в стандарте ISO 8859-1. На мой взгляд, исчерпывающая информация.
Ваш взгляд неправильный.
Не любой символ из набора литер ASCII плюс расширение Latin-1, определённое в стандарте ISO 8859-1 - принадлежит терминалу char
А только те символы, которые могут составить терминал string. А это не любой символ. Например есть фраза, намекающая на это:
Цитата:
Пробелы и концы строк не должны появляться внутри лексем (за исключением комментариев, а также пробелов в литерных цепочках)
Не исключаю, что у нас с Вами будет разное понимание "пробела". Например, для меня (сразу по прочтении) "табулятор" (0x09) является "пробелом", но я не уверен, что он (как и все остальное с кодами <32) допустим внутри string. Хотя точно должен быть допустим между лексемами. Вроде бы...
Вы точно знаете, что такое "концы строк" ??? Напомню между прочим, что у никсоидов и в винде - это не очень одно и тоже.
Вам до сих пор кажется информация исчерпывающей ???
В принципе, тут надо БЫ не спорить, а просто поглядеть определения. О чем я и говорил, собственно.


igor писал(а):
Я начал свой топик с того, что мне показалось странным, что метку экспорта можно отрывать от идентификатора. Но дальнейшее обсуждение показало, что всё в порядке, распереживался я зря :) . Не знаю, чего Вы так кипятитесь.
Ну можно так и про любой dereferencing (".", "^", "$") говорить.
Может показаться странным... А может и не показаться
И не кипячусь я. А просто говорю то, что именно думаю. Критичность - это мой способ мышления. Уверяю Вас к себе я отношусь не менее критично (но логические конструкции, выдержавшие такое "испытание на надежность", становятся значительно устойчивее к ветрам жизни).
И мне кажется, что это дает результаты. Например, мне уже точно известно, что "Сообщение о ..." я прочитал значительно внимательнее Вас. Именно потому, что думаю (по Вашему - кипячусь) над каждой фразой.

igor писал(а):
Это та самая тонкость (Вы её называете особенностью, но это сути не меняет), которая и обсуждалась вначале.
Это правда. Слово я перепутал. Наверное от того, что "особенность" мне понятна (здесь не так как обычно), а "тонкость" - не понять что. Пытался посмотреть, чтбы изменить в связи с этим прозрением в своем посте - не нашел.... Есть "тонкость" употреблять не отдельно а совместно "тонкости Оберонов", с акцентом на второе слово.


igor писал(а):
Хочу Вам напомнить, что обсуждение уже состоялось. Все точки над i расставлены. Если у Вас есть что-то сказать или добавить или Вы подметили какие-нибудь другие тонкости или особенности, то буду рад послушать и продолжить обсуждение.
Ну и я хочу Вам напомнить, что я не более, чем высказал непонимание предмета этого топика.
Да, Вы перечислили как бы "тонкости Оберонов". Но это не "тонкости Оберонов" (опять чуть не написал особенности). Это "тонкости" почти любого языка программирования. Навскидку открываю первое попавшееся в Дельфях, и влепляю туда (раньше такое в голову не приходило) всякие "комментарии"
Код:
Control {Гы-Гы-Гы}^
{ TEST }
.Icon := ToIcon(_data).handle;
И никаких проблем. Естественно.
В связи с этим у меня возникло непонимание, чем же Оберон провинился. Можно даже сказать наоборот: "тонкостями" это стало БЫ, если бы в Оберонах было не так. Но там именно так же. По типовому
И это мнение я высказал. Мне до сих пор (и после Вашего разъяснения - тоже) непонятно какие есть тонкости у лексики Оберонов, выделяющие его из других языков.
Не испытывая никакого нервного возбуждения. Его начинают обычно испытывать другие. Почему-то.
Но я (как и любой другой участник) имею право высказать такое мнение. Потому-что оно именно такое получилось. И послушать к нему контраргументы.


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Galkov писал(а):
Да, Вы перечислили как бы "тонкости Оберонов". Но это не "тонкости Оберонов" (опять чуть не написал особенности). Это "тонкости" почти любого языка программирования. ...
И это мнение я высказал. Мне до сих пор (и после Вашего разъяснения - тоже) непонятно какие есть тонкости у лексики Оберонов, выделяющие его из других языков.
Отгадайте с одного раза почему я эту тему поместил в ветку форума "Компонентный Паскаль", и покончим с этим.

На счёт пробелов. Я использую для себя понятие так называемых "белых" (blank) символов. К этим символам я отношу пробел (20Х), символ табуляции (09Х) и символ конца строки (Unix: 0AX; Mac: 0DX; Windows: 0DX+0AX).
Да. К сожалению, символ конца строки оказался платформозависимым, и в случае Windows представляет собой не один символ, а два.

"Белые" символы примечательны тем, что:
1. Они не могут появляться внутри лексем;
2. Они могут вставляться в любом количестве (включая ноль раз) между лексемами.
3. Между некоторыми классами лексем должен быть хотя бы один "белый" символ.

КП оговаривает одно исключение из правила 1. Пробелы могут появляться внутри строковых констант. На счёт остальных "белых" символов такое исключение не оговаривается, значит они (TAB и EOL) не должны появляться внутри строковых констант, потому что строковые константы являются лексемами (см. правило 1).

Замечу, что остальные управляющие символы (кроме 0Х) я отношу к классу игнорируемых символов.
Например, в КП мы можем посреди исходника вставить вьюшку, и это не смутит компилятор. Потому что для вьюшек своеобразным тэгом является символ 02Х (если не ошибаюсь). Встретив в тексте этот символ, компилятор его игнорирует, а заодно и саму вьюшку. Вот Вам кстати и особенность именно КП, которую Вы так жаждали увидеть. Правда, совсем другая, не та о которой шла речь в начале темы.


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

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Уфффф :|

Во первых, я так и не понял, продолжаете ли Вы настаивать, что в "Сообщении о ..." лексика написана однозначно, и читается без проблем.
Ведь единственное, что я утверждал - не хватает математической строгости.
Как оно реально читается - да какая разница, в конце-то концов.

Мне совершенно понятно, когда мы начинаем изучать тонкости некоторой объективной реальности. Изучили, сформировали некоторую математическую модель, обсуждаем "тонкости" этой модели, возможно корректируем свое мат.описание по результатам обсуждения.

Но у нас-то ведь сразу дана некая математическая абстракция, которую мы, человеки, сами и придумали. Это не есть объективная реальность, которая живет своей жизнью, от нас независимой.
Вот и не могу я взять в толк, чего тут можно изучать, когда надо просто посмотреть определения.
Взять, и посмотреть. И не "на словах", а в неком формальном языке, понятном даже "тупому компьютеру"
Потому-что белые пробелы, черные пробелы, платформозависимость перевода строки - не серьезно все это.
Кто-то дал такие формальные определения - это один язык. Кто-то - другие, и это будет чуть-чуть другой язык. Не лучше и не хуже. Просто другой.
А может и тот же, но это уже предмет специального исследования (именно поэтому я легче застрелился бы, чем позволил себе вольности отклонения от формального определения, данного Авторами Языка)
Ну не инопланетяне же сделали этот язык.

Совершенно не пойму (в смысле - в моей голове это никак не укладывается), как можно произносить такие слова: "... я отношу к классу игнорируемых символов"
Так можно говорить, если "я создаю свою лексику для своего языка". Но язык-то уже есть!!! И он имеет свое формальное определение, независимо от того, видели мы это определение, или нет.
Ну существует же, например, Lex-овский формализм, в котором все магические словеса про пробелы, переводы строк и комментарии записываются абсолютно формально.

Правомерен только один вопрос: эта "формальная запись" соответствует этому конкретному языку, или нет. С точным ответом: да, или нет.
Вот так мне кажется...


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Неплохой тут кейс для "Психологии форумов".


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Galkov писал(а):
Совершенно не пойму (в смысле - в моей голове это никак не укладывается), как можно произносить такие слова: "... я отношу к классу игнорируемых символов"
Это слова разработчика :wink: (не КП!).
Совершенно не пойму, что Вы совершенно не поймёте! Если я говорю "...я отношу...", значит эти слова относятся не к какому-либо конкретному языку, а к самой лексике в моём понимании. Я оставляю за собой право говорить здесь в том числе и о лексике вообще, безотносительно к какому-либо языку. Такое абстрагирование бывает очень полезно, а для программистов - просто необходимо.

Galkov писал(а):
Так можно говорить, если "я создаю свою лексику для своего языка".
А Вы исключаете такой вариант? Чем тогда, по Вашему, у меня вызван такой интерес к лексике?

Это форум программистов. Программисты иногда пишут сканеры, если в этом возникает необходимость. (См., например, ссылку Александра Ильина в этой теме.)


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

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
igor писал(а):
Это слова разработчика :wink: (не КП!).
Совершенно не пойму, что Вы совершенно не поймёте! Если я говорю "...я отношу...", значит эти слова относятся не к какому-либо конкретному языку, а к самой лексике в моём понимании.
Это другой разговор: я хочу сделать несколько другую лексику и обсудить ее отличия, например, от Оберонов.
Вот именно этого я не понимал. А должен был :?: :)

Если это "лексические тонкости Оберонов" - говорить о моем (к примеру) видении "технологии белых пробелов" - совершенно неуместно. Ну я этого и не делал.
В Вашей (которую Вы только-что изложили) постановке - уместно абсолютно.
Тут лично я поступал бы примерно так (0 - не считается, естественно):
    1) Между лексемами: все, что <=32 - пропускается
    2) В строках: все, что <32 - недопустимо (лексическая ошибка)
    3) В комментариях - допустимы все символы + лексема комментарий
    4) Штатные лексемы: сами разберутся, на чем надо заканчивать, пробелы и служебные символы в их состав не входят же.
Подозреваю, что почти во всех языках (в т.ч. и в КП - но не знаю про него точно) так и делают. Без заморочек с платформенно-зависимым "концом строки"

Ну хорошо, забыли про КП, совместимости, святости стандартов, и т.п. ...
Тогда предложение: остановиться на неком конкретном формализме, и изложить предполагаемую лексику (не КП!!!) именно в нем.
Ибо словеса - это от лукавого. Не верю я им до конца, хоть и сам ими пользуюсь. У меня, к примеру, сегодня живьем flex (с его формализмом) стоит, но и некий другой не явился бы проблемой.
Ну это конечно, если Вам интересно.


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Galkov писал(а):
Тут лично я поступал бы примерно так (0 - не считается, естественно):
    1) Между лексемами: все, что <=32 - пропускается
    2) В строках: все, что <32 - недопустимо (лексическая ошибка)
    3) В комментариях - допустимы все символы + лексема комментарий
    4) Штатные лексемы: сами разберутся, на чем надо заканчивать, пробелы и служебные символы в их состав не входят же.
Подозреваю, что почти во всех языках (в т.ч. и в КП - но не знаю про него точно) так и делают. Без заморочек с платформенно-зависимым "концом строки"
Я рад, что разговор ворачивается в правильное русло :) .
Ваши правила привлекают своей простотой. Но тут есть одна тонкость (опять это слово! :) ). Слово "пропускается" в правиле 1) можно трактовать двояко:
1. Сканер, встретив такой символ, принудительно завершает текущую лексему, и далее ищет первый символ следующей лексемы.
2. Сканер делает вид, что этого символа нет, и тупо переходит к другому символу, возможно не прерывая текущую лексему. (Это то, что я обозначил словом "игнорирует").

Думаю, что Вы имели в виду первую трактовку. Тогда с учётом "<=32" и "<32" (т.е. "включая пробел" и "не вкл-я пробел"), Ваши правила в целом эквивалентны тем, которые ранее изложил я. Отличия заключаются только в том, как трактовать управляющие символы, кроме пустого символа, табуляции и концов строки. Я предлагал их игнорировать, а Вы, если я правильно понял, предлагаете их пропускать.

Здесь следует учитывать то, что в некоторых редакторах исходного кода такие символы никак не отображаются на экране. Можно загрузить в редактор листинг, который был подготовлен в другом редакторе, и потом долго "чесать репу", недоумевая почему компилятор выдаёт синтаксическую ошибку на ровном месте. А всё дело в том, что предыдущий редактор понавставлял там "левых" символов. Может там форматирование было так сделано или ещё что, не важно.

Такой пример может показаться надуманным, но я лично напарывался на такую ситуацию. Причём подвох исходил из виндовского "блокнота". После того, как я поправил в нём исходный текст модуля, несколько раз меняя раскладку Рус-Лат, в файле возник "мусор", который в окне блокнота не был виден (FAR помог разобраться).

Можно, конечно, предварительно пропустить исходник через драйвер исходного текста (ещё один модуль), который до парсера-сканера всё почистит.
А ещё можно посоветовать использовать правильные редакторы, но хорошо написаный сканер не должен предъявлять таких требований.

Что касается платформозависимости символа конца строки, то это, как правило, не вызывает проблем. Можно написать универсальный код, который будет корректно обрабатывать любые концы строк. Мне как-то доводилось писать такой код. Кстати, в Блэкбоксовских документах (*.odc) используются Mac'овские концы строк.

PS: Конкретный пример лексики на РБНФ было бы не плохо. Но нету его :) . Всяких тривиальных примеров и в учебниках полно. А не тривиальные требуют слишком много времени.


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

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

2) Некоторые фразы у Вирта мне показались не очень убедительными. Нас в данном топике интересует разделение компилятора на лексер/парсер.
И чего же мы видим. Сначала как бы определяются регулярные языки (стр 28), и тут же сообщается, что "Для распознавания регулярных выражений необходимо и достаточно иметь конечный автомат ...". Мимоходом сообщается, что автоматы разделяются на детерминированные и недетерминированные (к чему это - не думаю, что швейцарские студенты раскусят это лукавство с ходу), и далее идет обсуждение только детерминированных, с правилами вывода кода из РБНФ, и условиями на эти выражения для применимости этих правил.
С моей точки зрения, лукавство заключается в том, что лексеры в массе своей - это недетерминированные автоматы.
Детерминированность предполагает разрешение любой альтернативы по первому же символу.
А это не так, да хоть бы и для Оберон-0
Ну посмотрите, к примеру, на каком символе будут различимы 3 патерна: ELSE, ELSIF, и ident :wink:
А ведь с точки зрения пользователя, недетерминированный автомат - совсем не кошмар в графическом представлении.
Если детерминированный представляется графом, в котором в каждый момент "активна" только одна вершина, то в недерминированном - их просто несколько, вот и вся разница. Также как и в детерминированном, какие-то из вершин являются "целевыми", а весь набор активных в данный момент вершин является "целевым", если в нем есть хотя бы одна "целевая"
Мне даже кажется, что наиболее важной причиной выделения лексера в отдельную функциональность - это оставить детерминированность парсеру. Хотя тот уже не просто автомат, а как бы - "стековый". Вот парсер - тот ДА, все альтернативы распознает с первой лексемы, вся недетерминированность сосредоточена в лексере.
Грубо говоря, борьба идет за единичку в определении грамматики: хоть LL(1), хоть LR(1).
По-моему, это более значительная причина, чем указанная Виртом "независимость от конкретного представления ..."

3) Далее, главное правило лексера Вирт так и не обозначил ведь, хотя оно и используется по полной программе
Это же Ваш вопрос о различении константного символа...
Ну скажем, он определил как бы синтаксис для РБНФ-лексера на стр 28. Исходя из которого, как бы совершенно логически вывел коды для GetSym (между прочим, приведенный Виртом GetSym не скушает лексики самого РБНФ - комбинация """ для него криминальна).
А вы попробуйте проверить им же выше означенные условия для применимости правил вывода. И ничего у Вас не выйдет. Вам придется доказать (!!!) что после нетерминала identifier ну никак не может следовать буква.
Ну да, не может (поэтому код-то верный).
Только это ни откуда не следует!!!
Это такая договоренность есть для всех лексеров - выбирать символы из входного потока до посинения, пока не отвалятся ВСЕ патерны. И последний отвалившийся и будет принятой лексемой (если конечно отвал произошел из "целевого" состояния).
Это правило делает некорректным смешение патернов лексера и парсера в одну кучку. Правила проверки однозначности разрешения альтернатив перестанут работать.
Ну посмотрите упражнение 4.2 на стр. 42...
Ну неправильно это: первые 2 строчки в приложении A1, и первые 9 - в приложении A2
Отдельно должны быть лексика и синтаксис. Потому что между ними вставлено вышеозначенное правило лексеров. И только после этого начнут правильно работать "правила проверки", приведенные Виртом.

4) Формализм для определения лексеров я кажется читал еще в Dragon-book...
Выглядит упрощенно примерно так:
Код:
P1 {Action1}
P2 {Action2}
P3 {Action3}
....
Где Pi - регулярные выражения для разных лексем, а ActionI - действия, предписанные разработчиком при распознавании лексемы. Причем тут есть следующая заморочка: если для примера ничего не делать, то лексер устанавливает свои автоматы (все вместе которые можно рассматривать как один недетерминированный автомат) в стартовое состояние, и начинает принимать текст дальше. Хоть весь текст может скушать за один присест.
Разработчик явно указывает в Action типа такого {... RETURN LexemID}, тогда парсер получит чего надо, и должен будет вызвать лексер еще раз.
Вот такое получается формальное определение магического слова "пропустить", которое мы употребляли ранее.
Есть еще фокус: отвалиться последними могут одновременно несколько патернов. Например, для служебного слова и идентификатора. Тут тоже совершенно точное правило - срабатывает Action для того патерна, который записан раньше. Поэтому совершенно обязательно сначала записывают патерны для служебных слов, а потом для идентификатора.
Как бы в подтверждение, что это не мои фантазии, а давно общепринято:
flex.pdf писал(а):
0.8 How the input is matched
When the generated scanner is run, it analyzes its input looking for strings which match any of its patterns. If it finds more than one match, it takes the one matching the most text (for trailing context rules, this includes the length of the trailing part, even though it will then be returned to the input). If it finds two or more matches of the same length, the rule listed first in the flex input file is chosen.


5) В общем, как-то так :)


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Galkov писал(а):
2) Некоторые фразы у Вирта мне показались не очень убедительными. ... Сначала как бы определяются регулярные языки (стр 28), и тут же сообщается, что "Для распознавания регулярных выражений необходимо и достаточно иметь конечный автомат ...". Мимоходом сообщается, что автоматы разделяются на детерминированные и недетерминированные (к чему это - не думаю, что швейцарские студенты раскусят это лукавство с ходу), и далее идет обсуждение только детерминированных, с правилами вывода кода из РБНФ, и условиями на эти выражения для применимости этих правил.
С моей точки зрения, лукавство заключается в том, что лексеры в массе своей - это недетерминированные автоматы.
Вы, наверное правы, что есть лексеры, которые являются недетерминированными автоматами. Книга Дракона, на которую Вы ссылались, даёт на этот случай жалкую рекомендацию "быть аккуратными". А ещё предостерегает, что дескать иногда приходится откатываться назад, чтобы "перебрать все возможные варианты". Ужас!

Но Никлаус Вирт придерживается иной точки зрения. Источника под рукой нет, процитирую Вирта по памяти: "Задачи, которые нам приходится решать при помощи программирования, и так достаточно сложны, чтобы искать для себя сложностей ещё и в языке". Иными словами говоря, можно разработать такой язык, в котором лексика будет задана детерминированным регулярным языком, а синтаксис - детерминированным контекстно-свободным языком. То, что это возможно, Вирт убедительно доказал делом. Можно, конечно, разработать язык с фразовой структурой (самая сложная грамматика по Хомскому), но какой в этом смысл, если в этой сложности нет никакой необходимости.

В отличие от авторов Книги Дракона, Вирт в принципе не рассматривает дурацкие языки с птичьим синтаксисом. И вместо невнятного "будьте аккуратными", даёт чёткие критерии детерминированности. Ни добавить, ни отнять.

Galkov писал(а):
Детерминированность предполагает разрешение любой альтернативы по первому же символу.
А это не так, да хоть бы и для Оберон-0
Ну посмотрите, к примеру, на каком символе будут различимы 3 патерна: ELSE, ELSIF, и ident :wink:
Перечисленные Вами паттерны относятся к одному и тому же классу лексем. А это значит, что у них одинаковое множество начальных символов First().

Я долго не мог в этом разобраться. Помогла Книга Дракона. (Да-да, в ней, несмотря на мою критику, тоже много ценного :) ). А именно, там дано разъяснение в чём разница между лексемой и токеном. Раньше я считал их синонимами (см. в начале этой ветки). Условно сканер (этот термин мне привычнее, чем "лексер") можно разделить как бы на две фазы: первая фаза разбивает сплошной входной тест на лексемы; а вторая фаза преобразует полученные лексемы в токены. ELSE, ELSIF и ident - это лексемы одного и того же класса, но им соответствуют совершенно разные токены. Парсер знать ничего не желает о каких-то там лексемах, ему нужны только токены.
Galkov писал(а):
Вот парсер - тот ДА, все альтернативы распознает с первой лексемы, вся недетерминированность сосредоточена в лексере.
Извините за прямоту, но это бред! :)
И сканер, и парсер во всех Оберонах работают с детерминированным синтаксисом.
Цитата:
... (между прочим, приведенный Виртом GetSym не скушает лексики самого РБНФ - комбинация """ для него криминальна).
Комбинация """ запрещена семантикой языка. Именно для того, чтобы смягчить это ограничение, для строковых констант определены два вида обрамляющих символов: " и '.

И ещё одно замечание. Сканер структурно входит в состав парсера, хоть они и находятся, как правило, в разных модулях. Другими словами говоря, лексика - это то же синтаксис, только на уровне элементарных терминальных символов, в то время как обычный синтаксис строится на уровне абстактных терминальных символов.


Последний раз редактировалось igor Понедельник, 25 Январь, 2010 14:55, всего редактировалось 1 раз.

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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Коллеги, вы чего...

Регулярные грамматики, детерминированные и недетерминированные автоматы равномощны, приводятся друг к другу эквивалентными преобразованиями - и определяют класс регулярных языков.


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
Регулярные грамматики, детерминированные и недетерминированные автоматы равномощны, приводятся друг к другу эквивалентными преобразованиями - и определяют класс регулярных языков.
Это хорошо. :)

А вот Ахо и сотоварищи, похоже не заморачиваются такими преобразованиями (см. примеры в первых главах Книги Дракона).
Видимо, неправильные книжки в детстве читали :lol: .


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Не обижайте дядю Ахо :)
Есть там всё - и алгоритмы перевода НКА-ДКА, и трансляция регулярных выражений в НКА...


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

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
igor писал(а):
Такие сущности, как числа, обычно не хранятся в таблице имён
Легко! Например в Форте.
Правда там и как таковой "таблицы имён" нет... :lol:


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

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


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

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


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

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