Форум
Философия программирования
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, vdimas, Вы писали: V>Здравствуйте, WolfHound, Вы писали: V>>>БНФ задает ВЕСЬ класс контекстно свободных грамматик, который самый важный на сегодня. WH>>То-то чуть менее чем все языки КЗ. WH>>А для некоторых типа С++ даже нельзя построить адекватное КС надмножество. V>Как раз в С++ конфликты совсем детские и решаются еще до парсинга, на этапе лексера + таблицы символов. Без отдельного этапа пост-обработки после парсинга. V>>>В любом случае нужна нотация, нейтральная к способу разбора. WH>>Зачем? V>Хотя бы, чтобы иметь возможность переность грамматику без изменений от парсера к парсеру и сравнивать результаты. :xz: V>>>Дык, никто не спорит. Все пока больше спрашивают. Очевидно же, что ПЕГ задает лишь некий подкласс грамматик и навскидку можно насочинять полно мест, где будет хромать (твой же пример с if/else). WH>>Чего? V>Какой else к какому if относится. WH>>Какие скобки? Ты про a < b > c; ? WH>>Так его никакой БНФный парсер не разберет. WH>>А вот разбирающие грамматики можно подкрутить так чтобы разбирали. V>Ну так я уже который раз спрашиваю... Именно, на уровне грамматики - никак. А на уровне конструкции парсера и спецификации языка всё решается более чем элементарно. Для С++ существенно то, что задается строгий порядок: сначала объявление типа и лишь потом его использование (в отличие от C#). Даже внутри классов: сначала надо объявить типы, потом их использовать, в отличие от мемберов (!!!). Это позволяет со 100% точностью отличить типы от не типов во время парсинга и правильно распознать угловые скобки, или другие символы, типа *, &, ^. Т.е. вот лексер во время разбора тебе выдает нетерминал "Идентификатор", а ты его ищешь в таблице типов и подменяешь нетерминалами "ИдентификаторТип" или "ИдентификаторЗначение". Т.е. вставляешь м/у лексером и парсером эдакий "КЗ-фильтр", но на уровне подмножества КС-грамматики языка, по которой работает парсер, ты уже имеешь совершенно бесконфликтную схему (по крайней мере относительно этих значков). Примитивщина же. V>Вот я и спрашивал, а у вас как? Если через нотификацию конфликта или через "оперативную" обработку специально-введенных нетерминалов-заместителей, то это скукотища, т.к. это известно еще со времен твоего ругаемого дракона и многократно хуже того элегантного трюка, который позволяют формальные правила языка С++. WH>>Какая еще классика? WH>>Как то что написал относится к этому утверждению? WH>>[q] WH>>Это так, только если контекстно-свободная грамматика является неоднозначной. Т.е. если она не является на самом деле контекстно-свободной и мы располагаем лишь подмножеством контекстно-свободных правил из полной системы правил грамматики. WH>>[/q] V>Блин, столько возни вокруг банальности... Я написал это, т.к. вижу во всей ветке, что не различается в спорах, где полная грамматика языка, а где грамматика некоего парсера. Ключевое всегда то, что практически-полезный язык, который мы собираемся парсить, не может быть неоднозначным. Грамматику этого языка я называю "полной". Поэтому, чтобы спор не превратился в бессмысленный, надо всегда помнить, что целевой язык может быть однозначным или никаким. Но, в БНФ по-определению можно записать только КС-правила из этой полной грамматики. Об этом я и пытался напомнить без подробностей в многа букф. V>К тому же, без указания, какие нетерминалы являются целевыми, а какие промежуточные, невозможно было утверждать про неоднозначность в твоем примере. Считай, что я с так лихо обошелся с твоим примером, чтобы тоже напомнить кое-что из БНФ... потому как вы слишком буквально воспринимаете правила редукции. Не обязано каждое правило в БНФ соответствовать 1:1 конечному АСТ, это тоже принципиально и тоже часто упускается, создавая трудности на ровном месте. Ты же наверняка многократно приводил недетерминированный автомат лексера к детерминировану, так? И тебя же не смущало, что в исходной записи в БНФ (если перейти от регулярных выражений к БНФ) он был бы точно такой же неоднозначной грамматикой в общем случае? Просто промежуточные нетерминалы, которые ты должен был бы ввести в систему уравнений БНФ для возможности записи исходной грамматики, склеиваются затем в один, если существует преобразование НКА->ДКА, или выдается конфликт состояний, если для пребразования в ДКА надо склеить [i]различимые[/i] нетерминалы. Именно это я и показал на твоем примере. V>============ V>На остальное потом.
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …