синтаксический анализ
От: night beast СССР  
Дата: 05.04.10 08:28
Оценка:
Что можно почитать по теории синтаксического анализа?

Интересуют последние достижения.

И еще попутно вопрос:
понадобилось динамически добавлять/удалять правила грамматики.
как лучше это реализовать?
Re: синтаксический анализ
От: LaptevVV Россия  
Дата: 05.04.10 08:45
Оценка: 2 (1)
Здравствуйте, night beast, Вы писали:

NB>Интересуют последние достижения.

NB>И еще попутно вопрос:
NB>понадобилось динамически добавлять/удалять правила грамматики.
NB>как лучше это реализовать?
Это смотри в сторону грамматик ВанВейгартена. Тот который занимался Алголом-68.
Называется Двухуровневые грамматики ВанВейнгартена.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: синтаксический анализ
От: night beast СССР  
Дата: 05.04.10 09:02
Оценка:
Здравствуйте, LaptevVV, Вы писали:

NB>>Интересуют последние достижения.

NB>>И еще попутно вопрос:
NB>>понадобилось динамически добавлять/удалять правила грамматики.
NB>>как лучше это реализовать?
LVV>Это смотри в сторону грамматик ВанВейгартена. Тот который занимался Алголом-68.
LVV>Называется Двухуровневые грамматики ВанВейнгартена.

извини за наглость, а нет ссылки на почитать?
а то что-то гугл ничего конкретного не дает
Re[3]: синтаксический анализ
От: LaptevVV Россия  
Дата: 05.04.10 10:29
Оценка: 5 (2)
Здравствуйте, night beast, Вы писали:

LVV>>Это смотри в сторону грамматик ВанВейгартена. Тот который занимался Алголом-68.

LVV>>Называется Двухуровневые грамматики ВанВейнгартена.

NB>извини за наглость, а нет ссылки на почитать?

NB>а то что-то гугл ничего конкретного не дает
Давно это было. Гугла истчо не было... И интернета истчо не было...
Так что ссылок на первоисточники в интернет — нету... Только в бумажном виде.
Но вот посмотрите сюда:
http://www.math.spbu.ru/user/mbk/TUTORY/%D0%A1%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D0%B8%D1%81%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B9%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82.html
и сюда:
http://www.rsdn.ru/forum/cpp/775377.hot.aspx
Автор: Nick_
Дата: 23.08.04
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: синтаксический анализ
От: night beast СССР  
Дата: 05.04.10 11:26
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>>>Это смотри в сторону грамматик ВанВейгартена. Тот который занимался Алголом-68.

LVV>>>Называется Двухуровневые грамматики ВанВейнгартена.

NB>>извини за наглость, а нет ссылки на почитать?

NB>>а то что-то гугл ничего конкретного не дает
LVV>Давно это было. Гугла истчо не было... И интернета истчо не было...
LVV>Так что ссылок на первоисточники в интернет — нету... Только в бумажном виде.
LVV>Но вот посмотрите сюда:
LVV>http://www.math.spbu.ru/user/mbk/TUTORY/%D0%A1%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D0%B8%D1%81%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B9%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82.html

немного не то ( я так понял местный аналог yacc )
не умеет строить грамматику на лету.
но все равно спасибо

LVV>и сюда:

LVV>http://www.rsdn.ru/forum/cpp/775377.hot.aspx
Автор: Nick_
Дата: 23.08.04
Re: синтаксический анализ
От: mefrill Россия  
Дата: 05.04.10 11:31
Оценка: 8 (2)
Здравствуйте, night beast, Вы писали:

NB>Что можно почитать по теории синтаксического анализа?


Хорошая книжка Parsing Techniques — A Practical Guide.


NB>И еще попутно вопрос:

NB>понадобилось динамически добавлять/удалять правила грамматики.
NB>как лучше это реализовать?

Чтобы ответить на этот вопрос, надо сначала знать, как правила хранятся. Вообще, некоторые алгоритмы требуют предварительной обработки грамматики для своей работы, другие не требуют. Вот тот же bison по грамматике строит автомат специального вида, поэтому пробразует грамматику в такой автомат. Грамматик подает программе на вход, из нее генерится автомат, который представляет собой просто набор функций на Си. Можно сделать к этому делу дополнительный модуль хранения правил грамматики и при ее модификации вызывать bison для генерации нового автомата. Конечно, тогда надо будет и сишный код заново компилировать. Другие алгоритмы не требуют предварительной обработки, для них правила даются как есть. Это, например, алгоритм Эрли.

В любом случае, модуль хранения грамматики ты должен будешь написать сам, а алгоритм синтаксического анализа использовать для этого модуля отдельно.
Re[2]: синтаксический анализ
От: night beast СССР  
Дата: 05.04.10 12:23
Оценка:
Здравствуйте, mefrill, Вы писали:

NB>>И еще попутно вопрос:

NB>>понадобилось динамически добавлять/удалять правила грамматики.
NB>>как лучше это реализовать?

M>Чтобы ответить на этот вопрос, надо сначала знать, как правила хранятся. Вообще, некоторые алгоритмы требуют предварительной обработки грамматики для своей работы, другие не требуют. Вот тот же bison по грамматике строит автомат специального вида, поэтому пробразует грамматику в такой автомат. Грамматик подает программе на вход, из нее генерится автомат, который представляет собой просто набор функций на Си. Можно сделать к этому делу дополнительный модуль хранения правил грамматики и при ее модификации вызывать bison для генерации нового автомата. Конечно, тогда надо будет и сишный код заново компилировать. Другие алгоритмы не требуют предварительной обработки, для них правила даются как есть. Это, например, алгоритм Эрли.


алгоритм Эрли — сложность О(n^3) (это очень много)
bison при построении строит таблицу. то есть все правила должны быть известны.

хочется в интерпретаторе определять грамматики на подобии tex макросов:
\def \expr \expr "+" \term | \term
\def \term \term "*" \factor | \factor
\def \factor \@id | "(" \expr ")"

и использовать: \expr a + b;
вот такая вот задача
Re: синтаксический анализ
От: WolfHound  
Дата: 05.04.10 12:35
Оценка: 2 (1) +1
Здравствуйте, night beast, Вы писали:

NB>понадобилось динамически добавлять/удалять правила грамматики.

NB>как лучше это реализовать?
Смотри PEG. В отличии от BNF этот формализм описывает как разбирать, а не генерировать текст.
Расширяемая динамически реализация Katahdin. Он конечно тормоз но это проблемы реализации.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: синтаксический анализ
От: batu Украина  
Дата: 05.04.10 17:53
Оценка: 1 (1)
Здравствуйте, night beast, Вы писали:

NB>Что можно почитать по теории синтаксического анализа?


NB>Интересуют последние достижения.


NB>И еще попутно вопрос:

NB>понадобилось динамически добавлять/удалять правила грамматики.
NB>как лучше это реализовать?
Классическими работами по синтаксическому анализу являются "Компиляторы. Принципы, технологии, инструменты .Ахо, Сети,Ульман" и "Теория синтаксического анализа, перевода и компиляции. Ахо, Ульман Т.1 и Т.2"
Занимался этими проблемами. Есть интересные наработки. Получается просто. Но для этой простоты нужно сделать сложные вещи. А именно, новый язык представления синтаксиса. Чуть сложнее БНФ. Если сделать транслятор задуманой системы, то решаются практически все проблемы. И эффективности и динамического изменения грамматики.. Фактически с этого языка получаем непосредственно транслятор
нового языка. Правила в кратце следующие.

Введение. Правила описания грамматик.

Система Lada имеет собственные средства описания грамматики, поэтому в тексте использована именно эта нотация, краткое описание которой ниже.

1. Понятие определяется оператором Determination, за которым следует имя определяемого понятия и далее определяющая последовательность понятий в скобках. При необходимости определить сразу несколько понятий они заключаются в фигурные скобки (либо в круглые скобки через запятую) после оператора Determination. Раздел 2.1. Объекты, заключенные в скобки будем называть группой.
2. Имя определяемого понятия может содержать не больше сорока букв, либо любые знаки, заключенные в именные скобки «"». Более подробно смотри правила именования (Раздел 1).
3. Последовательность знаков непосредственно участвующая в разборе выделяется текстовыми кавычками ««» и «»».
4. Последовательность определений в квадратных скобках (группа), и знаком «|» после открывающей скобки обозначает выбор одного варианта из этой последовательности.
5. Надстрочное значение, после закрывающей скобки определяет максимальное количество допустимых повторений понятий объединенных группой, которую закрывает эта скобка.
6. Подстрочное значение после группы понятий указывает минимальное количество вхождений данного понятия в определение. Значение 0 допускает отсутствие группы понятий в разборе.
7. Знак «¬» перед понятием (или группой понятий) означает, что в разборе допустимо все что угодно кроме этого понятия (или группы понятий).


Примеры.

1. Determination Цифра [|0, 1, 2, 3, 4, 5, 6, 7, 8 , 9]
2. Determination Letter [|А, B, … , я]
3. Determination
{
Word {Letter}140
Название {«"» {¬ «"»}128 «"»}
}

Полное описание языка могу прислать. Тут его кто-то выставил старую версию без моего ведома.А потом мне сообщил. Так я попал на этот сайт)
Теоретические проработки можем обсудить.
Re[3]: синтаксический анализ
От: mefrill Россия  
Дата: 05.04.10 19:37
Оценка:
Здравствуйте, night beast, Вы писали:

NB>алгоритм Эрли — сложность О(n^3) (это очень много)


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

NB>bison при построении строит таблицу, то есть все правила должны быть известны.


Ну так в чем проблема, я же писал: при изменении грамматики заново генеришь автомат. Только бизон это еще и компилирует, что совсем необязательно.

NB>хочется в интерпретаторе определять грамматики на подобии tex макросов:

NB>\def \expr \expr "+" \term | \term
NB>\def \term \term "*" \factor | \factor
NB>\def \factor \@id | "(" \expr ")"

NB>и использовать: \expr a + b;

NB>вот такая вот задача

Здесь сложность в том, что такие грамматики могут не укладываться в LR-автоматы и даже не быть однозначными. Надо применять алгоритм Томиты или Эрли. Вопрос только, как семантику к ним определять будешь?
Re[4]: синтаксический анализ
От: night beast СССР  
Дата: 06.04.10 03:36
Оценка:
Здравствуйте, mefrill, Вы писали:

NB>>bison при построении строит таблицу, то есть все правила должны быть известны.


M>Ну так в чем проблема, я же писал: при изменении грамматики заново генеришь автомат. Только бизон это еще и компилирует, что совсем необязательно.


NB>>хочется в интерпретаторе определять грамматики на подобии tex макросов:

NB>>\def \expr \expr "+" \term | \term
NB>>\def \term \term "*" \factor | \factor
NB>>\def \factor \@id | "(" \expr ")"

NB>>и использовать: \expr a + b;

NB>>вот такая вот задача

M>Здесь сложность в том, что такие грамматики могут не укладываться в LR-автоматы и даже не быть однозначными. Надо применять алгоритм Томиты или Эрли.


думаю, класса SLR-грамматик должно хватить

M>Вопрос только, как семантику к ним определять будешь?


\def \expr -> \expr#e "+" \term#t | \term#t { action }
Re[2]: синтаксический анализ
От: night beast СССР  
Дата: 06.04.10 03:47
Оценка:
Здравствуйте, batu, Вы писали:

NB>>Что можно почитать по теории синтаксического анализа?


NB>>Интересуют последние достижения.


NB>>И еще попутно вопрос:

NB>>понадобилось динамически добавлять/удалять правила грамматики.
NB>>как лучше это реализовать?
B>Классическими работами по синтаксическому анализу являются "Компиляторы. Принципы, технологии, инструменты .Ахо, Сети,Ульман" и "Теория синтаксического анализа, перевода и компиляции. Ахо, Ульман Т.1 и Т.2"

угу. читал.
только книги старые. вот и интересно, что нового в области...

B>Занимался этими проблемами. Есть интересные наработки. Получается просто. Но для этой простоты нужно сделать сложные вещи. А именно, новый язык представления синтаксиса. Чуть сложнее БНФ. Если сделать транслятор задуманой системы, то решаются практически все проблемы. И эффективности и динамического изменения грамматики.. Фактически с этого языка получаем непосредственно транслятор

B>нового языка. Правила в кратце следующие.

B>Введение. Правила описания грамматик.


B>Система Lada имеет собственные средства описания грамматики, поэтому в тексте использована именно эта нотация, краткое описание которой ниже.


B> Полное описание языка могу прислать. Тут его кто-то выставил старую версию без моего ведома.А потом мне сообщил. Так я попал на этот сайт)


просматривал по диагонали.
без обид, не зацепило что-то.
зачем вводить свои определения, когда уже есть устоявшаяся терминология?

B>Теоретические проработки можем обсудить.


какой класс грамматик описывается?
Re[3]: синтаксический анализ
От: batu Украина  
Дата: 06.04.10 07:37
Оценка:
Здравствуйте, night beast, Вы писали:

N
NB>просматривал по диагонали.
NB>без обид, не зацепило что-то.
NB>зачем вводить свои определения, когда уже есть устоявшаяся терминология?


NB>какой класс грамматик описывается?

Не от хорошей жизни пришлось переделывать. В классическом варианте строится дерево из описания граммантики, и идет анализ этого дерева. У меня можно в описание синтаксиса добавлять функциональную часть. И операторы тоже. Потому класс грамматик шире. И алгоритм разбора не всегда возвращается в случае неудачи в начало ветки, а может перебрать варианты в средине и продолжить. Получается как в фунциональном программировании. Только возможности еще шире.
Можно, например, разобрать грамматику, порождающую язык.. Сори, не знаю как тут степень писать.. напишу как смогу. na^nb^nc^n. И есть еще нюансы.В классическом определении грамматик нет четкого разделения где рекурсия, а где цикл. Все определяется как рекурсия. Разница в эффективности реализации разбора очевидна. Еще один момент, нетерминальные символы приходится вводить по мере необходимости самой грамматики, а не в терминах логики создаваемого языка. У меня нет необходимости создавать промежуточные нетерминальные символы. Вкратце где-то так..Я б прикрепил файл с примерчиком. Но здесь недавно. И не знаю как это сделать.
Re[3]: синтаксический анализ
От: batu Украина  
Дата: 06.04.10 07:45
Оценка:
Кстати, понятия "нетерминальные символы" у меня нет. Так как в них нет необходимости. Грамматика описывается в терминах создаваемого языка.
Re[4]: синтаксический анализ
От: night beast СССР  
Дата: 06.04.10 09:46
Оценка:
Здравствуйте, batu, Вы писали:

NB>>просматривал по диагонали.

NB>>без обид, не зацепило что-то.
NB>>зачем вводить свои определения, когда уже есть устоявшаяся терминология?

NB>>какой класс грамматик описывается?

B>Не от хорошей жизни пришлось переделывать. В классическом варианте строится дерево из описания граммантики, и идет анализ этого дерева. У меня можно в описание синтаксиса добавлять функциональную часть. И операторы тоже. Потому класс грамматик шире. И алгоритм разбора не всегда возвращается в случае неудачи в начало ветки, а может перебрать варианты в средине и продолжить. Получается как в фунциональном программировании. Только возможности еще шире.
B>Можно, например, разобрать грамматику, порождающую язык.. Сори, не знаю как тут степень писать.. напишу как смогу. na^nb^nc^n. И есть еще нюансы.

а оно точно надо? вроде существующие грамматики нормально с описанием языков справляются..

B>В классическом определении грамматик нет четкого разделения где рекурсия, а где цикл. Все определяется как рекурсия. Разница в эффективности реализации разбора очевидна.


LR анализаторы работают по таблице без рекурсивных вызовов.

B>Еще один момент, нетерминальные символы приходится вводить по мере необходимости самой грамматики, а не в терминах логики создаваемого языка. У меня нет необходимости создавать промежуточные нетерминальные символы.


на самом деле это не критично.
какая сложность разбора твоих определений (линейная/квадратичная)?

B>Вкратце где-то так..Я б прикрепил файл с примерчиком. Но здесь недавно. И не знаю как это сделать.


зайди в свой профиль. там есть вкладка Файл. можно загрузить файл на сайт. получившуюся ссылку можно вставить в сообщение через тег [url]
Re[4]: синтаксический анализ
От: night beast СССР  
Дата: 06.04.10 09:53
Оценка:
Здравствуйте, batu, Вы писали:

B>Кстати, понятия "нетерминальные символы" у меня нет. Так как в них нет необходимости. Грамматика описывается в терминах создаваемого языка.


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

вот WolfHound
Автор: batu
Дата: 05.04.10
упомянул PEG, там тоже лексический анализ не требуется.
Re[2]: синтаксический анализ
От: mefrill Россия  
Дата: 06.04.10 10:35
Оценка: +1
Здравствуйте, batu, Вы писали:

Из приведенного примера и правил совершенно непонятно, можно ли справа в группах определителей задавать имена понятий или нет. Если нет, то это просто определений некоего подмножества класса регулярных языков (учитывая, что итерации там вроде нет). Если можно, то это контекстно-свободный язык, но тоже с ограничениями.

Имена понятий и есть нетерминалы в терминологии Хомского.
Re[3]: синтаксический анализ
От: batu Украина  
Дата: 06.04.10 12:41
Оценка:
Здравствуйте, mefrill, Вы писали:

M>Здравствуйте, batu, Вы писали:


M>Из приведенного примера и правил совершенно непонятно, можно ли справа в группах определителей задавать имена понятий или нет. Если нет, то это просто определений некоего подмножества класса регулярных языков (учитывая, что итерации там вроде нет). Если можно, то это контекстно-свободный язык, но тоже с ограничениями.


M>Имена понятий и есть нетерминалы в терминологии Хомского.

С определением нетерминалов все понятно. А вот насчет можно ли справа... Ничего не понял.. Какие имена, где справа? Можно еще раз?
Re[5]: синтаксический анализ
От: batu Украина  
Дата: 06.04.10 13:14
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, batu, Вы писали:


B>>Кстати, понятия "нетерминальные символы" у меня нет. Так как в них нет необходимости. Грамматика описывается в терминах создаваемого языка.


NB>ну, как минимум цифры и буквы являются терминалами.

NB>в КС грамматиках правила тоже можно описать без них. они нужны чтобы упростить разбор.
Речь идет о нетреминалах. Т.е. о понятиях которые определяються только с целью форулирования грамматики. Т.е. некие промежуточные понятия которые вводяться с одной целью описания самой грамматики.

Вот, например, понятие группа в языке Lada. Подсточное значение выделил тегом i, а надстрочное Bold. Извинюсь, не знаю как здесь отредактировать.


Determination Группа (Determination: Понятие)
{
Switch Скобка
{
Case Круглая «(»
Case Фигурная «{»
Case Квадратная «[»}
Else {Result=False Exit Determination: Группа}
}
ExecuteOnSwitch Скобка
{
Круглая { Понятие {«,» Понятие}0255 «)»}
Фигурная {{Понятие}255 «}»}
Квадратная {«|»{Значение}0}0 {{Понятие}255 «]»}
}
[| "Подстрочное значение", "Надстрочное значение"]02 Формула 16.
}

В обычном описании пришлось бы определить как минимум три нетерминальных символа "Группа с круглыми скобками" "Квадратными", и "фигурными". Да еще и среди них пришлось бы что-то переопределять. А понятие группа, не просто "Не терминальный симовол" а понятие самого определяемого языка.
Ну, и понятно, что если выражение необходимо повторить, то оно определяется в группе с надстрочным значением количества повторений, Т.е. организует цикл. В классическом определении повторение необходимо было бы определить его как рекурсию. Ну, и выполняемый оператор Switch позволяет между ним и ExecuteOnSwitch вставить общую часть, конечно, если она понадобится. И вообще, это не описание грамматики будет, а непосредственно программа создающая транслятор с этого языка. Надо только добавить еще так называемую "реализацию". Но, это другая тема. Подскажите как здесь ставить надстрочные и подстрочные значения.
Re[5]: синтаксический анализ
От: batu Украина  
Дата: 06.04.10 13:24
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, batu, Вы писали:


NB>>>просматривал по диагонали.

NB>>>без обид, не зацепило что-то.
NB>>>зачем вводить свои определения, когда уже есть устоявшаяся терминология?

NB>>>какой класс грамматик описывается?

B>>Не от хорошей жизни пришлось переделывать. В классическом варианте строится дерево из описания граммантики, и идет анализ этого дерева. У меня можно в описание синтаксиса добавлять функциональную часть. И операторы тоже. Потому класс грамматик шире. И алгоритм разбора не всегда возвращается в случае неудачи в начало ветки, а может перебрать варианты в средине и продолжить. Получается как в фунциональном программировании. Только возможности еще шире.
B>>Можно, например, разобрать грамматику, порождающую язык.. Сори, не знаю как тут степень писать.. напишу как смогу. na^nb^nc^n. И есть еще нюансы.

NB>а оно точно надо? вроде существующие грамматики нормально с описанием языков справляются..


B>>В классическом определении грамматик нет четкого разделения где рекурсия, а где цикл. Все определяется как рекурсия. Разница в эффективности реализации разбора очевидна.


NB>LR анализаторы работают по таблице без рекурсивных вызовов.


B>>Еще один момент, нетерминальные символы приходится вводить по мере необходимости самой грамматики, а не в терминах логики создаваемого языка. У меня нет необходимости создавать промежуточные нетерминальные символы.


NB>на самом деле это не критично.

NB>какая сложность разбора твоих определений (линейная/квадратичная)?

Со всем согласен. На вопрос о сложности, сложность разбора зависит от сложности грамматики. Если ее природа рекурсивна, то никуда от рекурсии не денешься, со всеми вытекающими следствиями по сложности. (замечание. Некоторые рекурсии можно развернуть в цикл). Потому сочинитель языка должен иметь ввиду будущую сложность разбора. Ну, а дело языка для записи грамматик, сделать наглядной эту сложность, ну и дать инструмент для выхода из положения.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.