У меня такая задача: сделать парсер языка (для начала Pascal'я)
Причем парсер нужен на C#. Я огляделся вокруг и увидел, что в R# для генерации парсера выбрали Coco. Я скачал его, посмотрел. Нашел ATG файлы для Pasal и ATG файл для Delphi.
Но они оказались не совместимы с Coco для C#. Может кто-нибудь сталкивался с такой проблемой..
A>У меня такая задача: сделать парсер языка (для начала Pascal'я) A>Причем парсер нужен на C#. Я огляделся вокруг и увидел, что в R# для генерации парсера выбрали Coco. Я скачал его, посмотрел. Нашел ATG файлы для Pasal и ATG файл для Delphi. A>Но они оказались не совместимы с Coco для C#. Может кто-нибудь сталкивался с такой проблемой..
У меня похожая проблема — парсер Object Pascal на Object Pascal Кое-что я тоже нашел — в проекте ParserBuilder (sourcefourge.net/projects/parserbuilder). В тем есть ATG для Object Pascal (в зачаточном состоянии) и ATG для Pascal — попробуйте.
Здравствуйте, psg, Вы писали:
psg>У меня похожая проблема — парсер Object Pascal на Object Pascal Кое-что я тоже нашел — в проекте ParserBuilder (sourcefourge.net/projects/parserbuilder). В тем есть ATG для Object Pascal (в зачаточном состоянии) и ATG для Pascal — попробуйте.
Да, я его тоже скачал..
Но как раз оттуда ATG файлы не подходят к C#'ному Coco
Буда разбираться как к нему писать ATG файл..
Здравствуйте, agos, Вы писали:
A>Посмотрел, спасибо за инфу.. A>Но проблема всё равно остаётся, эти файлы не совестимы с Coco для C# A>Впрочем я уже настроился на то, что буду писать сам. Заодно лучше разберусь
Кстати, могу дать улучненный нами Coco. А то исходный совсем влоб был с С-ей портирован.
Что касается несовместимости граматик... это странно, так как синтаксис Коки мало изменился по сравнению с С-ишным. На что ругается?
И кстати, а что так странно то? Парсер Пасклая на Шарпе?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Кстати, могу дать улучненный нами Coco. А то исходный совсем влоб был с С-ей портирован.
Буду не против Скинь, пожалуйста, на nigo(at)fca.ru Спасибо!!
VD>Что касается несовместимости граматик... это странно, так как синтаксис Коки мало изменился по сравнению с С-ишным. На что ругается?
Я взял Коко для паскаля, нашел там грамматику для Паскаля же и напрямую подставил в Coco для C#
coco.exe Op4.ATG
на это он мне ругнулся
Coco/R (Mar 3, 2004)
-- line 4 col 19: undefined name
-- line 49 col 1: "END" expected
2 errors detected
Первая ошибка мне вроде как понятна, видимо Coco не понимает CHR
А со второй непонятно, наверное, ему комментарии не понравились
К сожалению, у меня пока не получается посидеть, поэксперементировать — работы много, но сейчас кусок свой закончу, плотно займусь..
VD>И кстати, а что так странно то? Парсер Пасклая на Шарпе?
В качестве диплома решили сделать некую обучающую систему проверки исходных текстов. Причем хочется что-бы это всё дело было доступно через инет, ну и недолго думая решили писать Web-сервис на C#
Ну а так, как у нас в ВУЗе основной язык обучения является Паскаль, то и решено было первый транслятор сделать именно с Паскаля.
Здравствуйте, Dimentiy, Вы писали:
D>Здравствуйте, psg, Вы писали:
psg>>У меня похожая проблема — парсер Object Pascal на Object Pascal
D>А для какой конкретно цели? А то вроде готовые есть.
Нужно построить syntax tree для unit (project, library, package), модифицировать его, и снова сгенерировать код на ObjectPascal. Это нужно для автоматической генерации кода.
Сейчас мы используем разметку unit'а с помощью специальных комментариев, но это уже начинает напрягать, т.к. уже половина текста завалена этими специальными комментариями...
Отсюда кстати вытекает еще одно требование к этому парсеру — он должен сохранять форматирование исходного модуля. Вот именно таких я пока не нашел, хотя есть и достаточно неплохие реализации, например парсер из CodeLens (у него еще и лицензия BSD, вообще песня
Здравствуйте, agos, Вы писали:
A>Первая ошибка мне вроде как понятна, видимо Coco не понимает CHR A>А со второй непонятно, наверное, ему комментарии не понравились A>К сожалению, у меня пока не получается посидеть, поэксперементировать — работы много, но сейчас кусок свой закончу, плотно займусь..
Немного посидел, в итоге начало даже получатся
вот только coco глюкавая
если что не так с exception'ами вылетает
Я вот только понять не могу, что за куски кода в ATG файлах??
Здравствуйте, agos, Вы писали:
A>Буду не против Скинь, пожалуйста, на nigo(at)fca.ru Спасибо!!
Это 1.5 мега. Выдержит твое мыло?
VD>>Что касается несовместимости граматик... это странно, так как синтаксис Коки мало изменился по сравнению с С-ишным. На что ругается? A>Я взял Коко для паскаля, нашел там грамматику для Паскаля же и напрямую подставил в Coco для C# A>на это он мне ругнулся A>
A>Coco/R (Mar 3, 2004)
A>-- line 4 col 19: undefined name
A>-- line 49 col 1: "END" expected
A>2 errors detected
A>
Ты бы указал бы хоть каких строки именно указывал Кока.
A>а вот и сам файл (начало его) A>
A>CHARACTERS
A> eol = CHR(13) .
A>
Естественно! Это же файл рассчитан на паскалевский синтаксис. Для Шарповского Коки нужно так:
eol = '\u000a'. /* 10 = line feed */
A> noQuote1 = ANY — "'".
Кстати, у меня были клюки с "ANY — ххх". Так что окуратнее.
A>IGNORE A> CHR(9) .. CHR(13)
Опять же та же фингя.
A>COMMENTS FROM "(*" TO "*)" (* 4- 5 *)
Кментарий в конце строки пасклевский. Шарповый кока поддерживает только сшиный "/* ... */"
A>TOKENS
A> bracketOpn =
A> "[" | "(." .
A> bracketCls =
A> "]" | ".)" .
Вообще-странно. Такое ощущение, что это не ATG Паскля, а самого Коки. Ведь в паскале нет "(.".
A>Первая ошибка мне вроде как понятна, видимо Coco не понимает CHR
Естествнно. Еще раз повторю. Это ATG для коки с синтаксисом Паскля (модифицированного для Паскля). Тебе нужно или искать этот вариант Коки, или заменить всю эту хрень обратно на сишный стиль.
A>А со второй непонятно, наверное, ему комментарии не понравились
Именно.
A>В качестве диплома решили сделать некую обучающую систему проверки исходных текстов. Причем хочется что-бы это всё дело было доступно через инет, ну и недолго думая решили писать Web-сервис на C# A>Ну а так, как у нас в ВУЗе основной язык обучения является Паскаль, то и решено было первый транслятор сделать именно с Паскаля.
Нда... Странно...
Ну, вообще-то конечно парсить Паскль (особенно классический) проще всего. Это чисто LL(1) язык. Для него даже расширения КокиР не нужны. Но по-моему логичнее уж было бы тогда парсить его на Дельфи.
Зачем все эит веб-сервисы вообще не ясно. Но если из парсера сделать КОМ-сервер, то не будет проблем использовать его и из Шарпа.
Если уж очень охота именно на Шарпе, то модифицируй ATG, чтобы он был совместим с Шарповским Кокой.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Это 1.5 мега. Выдержит твое мыло?
Выдержит и не такое выдерживало
VD>Естествнно. Еще раз повторю. Это ATG для коки с синтаксисом Паскля (модифицированного для Паскля). Тебе нужно или искать этот вариант Коки, или заменить всю эту хрень обратно на сишный стиль.
Я уже во всем (ну не совсем ) разобрался. Парсер уже работает. пришлось граматику подкурочить.
Та грамматика, что у меня от DElphi 4, завтра буду доделывать до чистого паскаля
Правда вот этого я тоже не понял
TOKENS
bracketOpn =
"[" | "(." .
bracketCls =
"]" | ".)" .
Но я удалил (. и .) от греха подальше, этим и ограничился
VD>Ну, вообще-то конечно парсить Паскль (особенно классический) проще всего. Это чисто LL(1) язык. Для него даже расширения КокиР не нужны. Но по-моему логичнее уж было бы тогда парсить его на Дельфи.
По большому счету .Net и C# в частности были выбраны только для совмещения приятного с полезным (обучение + написание диплома)
VD> Это чисто LL(1) язык.
Мне с этим ещё не совсем понятно. Завтра почитаю литературу, думаю разберусь
VD>Зачем все эит веб-сервисы вообще не ясно. Но если из парсера сделать КОМ-сервер, то не будет проблем использовать его и из Шарпа.
А веб-сервисы нужны вообще для понта. По сути, я так думаю, хватит и веб-приложения, но решили сделать и то и другое
VD>Если уж очень охота именно на Шарпе, то модифицируй ATG, чтобы он был совместим с Шарповским Кокой.
Уже Только я всё никак не пойму, что за код в ATG для C#??
Здравствуйте, agos, Вы писали:
A>Выдержит и не такое выдерживало
Кинул.
A>Я уже во всем (ну не совсем ) разобрался. Парсер уже работает. пришлось граматику подкурочить. A>Та грамматика, что у меня от DElphi 4, завтра буду доделывать до чистого паскаля
Это называется кастрировать. В Паскле мой самый любимый прел — это то что тип массива зависит от количества элементов и строка из 4 символов совершенно отличный тип от строки из 5 символов.
A>Правда вот этого я тоже не понял A>TOKENS A> bracketOpn = A> "[" | "(." . A> bracketCls = A> "]" | ".)" . A>Но я удалил (. и .) от греха подальше, этим и ограничился
Смотри где это используется. Вообще-то скорее всего ' | "(."' нужно выбрасить.
A>По большому счету .Net и C# в частности были выбраны только для совмещения приятного с полезным (обучение + написание диплома)
Ну, тады ой...
A>Мне с этим ещё не совсем понятно. Завтра почитаю литературу, думаю разберусь
LL(1) — значит что язык можно разбирать методом рекусивного спуска заглядывая только на один токен вперед. В том же Шарпе есть места где невозможно без заглядывания на более чем 1 символ определить, что за конструкция разбирается в этот момент.
Вообще-то прежде чем начинать заниматься такими местами лучше сначала разабраться с теорией. К тому же если вам дают такие задиния, то теорию уже должны были толкать. В общем смотри ссылки в статья о R# и тут http://www.smtp.ru/~drmad/.
VD>>Зачем все эит веб-сервисы вообще не ясно. Но если из парсера сделать КОМ-сервер, то не будет проблем использовать его и из Шарпа. A>А веб-сервисы нужны вообще для понта. По сути, я так думаю, хватит и веб-приложения, но решили сделать и то и другое
A>Уже Только я всё никак не пойму, что за код в ATG для C#??
В смысле? В КокеР для Шарпа действительно есть некоторые модификации для Шарпа. Например они контролируют, чтобы ты не использовал для модификаторов ключевые слова из Шарпа. Но в остальном там практически исходная С-ишная версия. У них же почти все основы совпадают.
Это как раз Паскалевскую версию изменяли.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Кинул.
Получил САПАСИБА!!
VD>Смотри где это используется. Вообще-то скорее всего ' | "(."' нужно выбрасить.
Судя по тому, что всё откомпилировалось, (. и .) нигде не использовалось
A>>По большому счету .Net и C# в частности были выбраны только для совмещения приятного с полезным (обучение + написание диплома) VD>Ну, тады ой...
A>>Мне с этим ещё не совсем понятно. Завтра почитаю литературу, думаю разберусь
VD>LL(1) — значит что язык можно разбирать методом рекусивного спуска заглядывая только на один токен вперед. В том же Шарпе есть места где невозможно без заглядывания на более чем 1 символ определить, что за конструкция разбирается в этот момент.
Здорово — мне одна эта фраза сказала больше, чем несколько страниц в двух книгах
VD>Вообще-то прежде чем начинать заниматься такими местами лучше сначала разабраться с теорией. К тому же если вам дают такие задиния, то теорию уже должны были толкать. В общем смотри ссылки в статья о R# и тут http://www.smtp.ru/~drmad/.
Такую темы мы сами выбрали, кафедра просто утвердила. А по теории нам давали формальные грамматики, но до этого мы там не дошли.
А в теории компиляторов мы дошли только до БНФ. Вот так нас учат
В итоге сейчас изучаю эти разделы сам, хоть не с нуля и то хорошо.
A>>Уже Только я всё никак не пойму, что за код в ATG для C#?? VD>В смысле? В КокеР для Шарпа действительно есть некоторые модификации для Шарпа. Например они контролируют, чтобы ты не использовал для модификаторов ключевые слова из Шарпа. Но в остальном там практически исходная С-ишная версия. У них же почти все основы совпадают.
Не, я имею в виду, что в моём ATG файле нет ни строчки кода, есть только BNF (EBNF?), а ели заглянуть в CSharp.ATG то там можно найти вот это:
Здравствуйте, agos, Вы писали:
A>Судя по тому, что всё откомпилировалось, (. и .) нигде не использовалось
Оно и понятно. Вопрос в том, что будет если в Паскалевском исходнике вместо '[' указать '(.'.
A>Здорово — мне одна эта фраза сказала больше, чем несколько страниц в двух книгах
Вообще-то во всех книжках про это дело довольно подробно говорится. Только черезчур заумно. Порой простейщие вещи объясняются на базе трехэтажных абстраций и головоломных формул. Но тут уж ничего не поделаешь. В основном народ занимавшийся формализацией этой области бил математиками...
A>Такую темы мы сами выбрали, кафедра просто утвердила. А по теории нам давали формальные грамматики, но до этого мы там не дошли. A>А в теории компиляторов мы дошли только до БНФ. Вот так нас учат A>В итоге сейчас изучаю эти разделы сам, хоть не с нуля и то хорошо.
А если не сикрет на кого учишся и где?
A>Не, я имею в виду, что в моём ATG файле нет ни строчки кода, есть только BNF (EBNF?),
Именно EBNF.
A> а ели заглянуть в CSharp.ATG то там можно найти вот это: A>
A>/*---------------------------- auxiliary methods ------------------------*/
A>static void Error (string s) {
A> if (errDist >= minErrDist) Errors.Error(la.line, la.col, s);
A> errDist = 0;
A>}
A>
A>Я так понимаю, что этот код один в один идет в генерённые файлы???
Да. Но используется именно в логике парсера.
A> Т.е. это просто "тюнинг" получаемого сканера?
Нет. Это как раз борьба с не LL(1)-стью Шарпа. Половина этих функций используется для разрешения LL(1)-конфликтов. Вторая для семантических проверок. Например, проверок уместности модификаторов в конкретных конструкциях. Интересно что те же модификаторы в принципе можно четко описать в граматике, но при этом граматика резко распухает и усложняется. Не большая функция проверки позволяет сократить код парсера и сделать его более универсальным.
А так исходных cs.ATG тоже можно считать формально пустым. Правда то что я тебе прислал — это уже почти готовый парсер в AST (абстрактное синтаксическое дерево), и там кода хватает.
Кстати, как я понимаю вы хотите использовать парсер для очень похожих целей. Так что R# может оказаться для вас хорошим примером.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
A>>Судя по тому, что всё откомпилировалось, (. и .) нигде не использовалось VD>Оно и понятно. Вопрос в том, что будет если в Паскалевском исходнике вместо '[' указать '(.'.
Честно говоря не пробывал, но думаю, что выдаст ошибку.
A>>Здорово — мне одна эта фраза сказала больше, чем несколько страниц в двух книгах VD>Вообще-то во всех книжках про это дело довольно подробно говорится. Только черезчур заумно. Порой простейщие вещи объясняются на базе трехэтажных абстраций и головоломных формул. Но тут уж ничего не поделаешь. В основном народ занимавшийся формализацией этой области бил математиками...
Ну да. По крайней мере когда я читаю всю эту литерату, то часто задумываюсь, а как же это применить на компьютере..
VD>А если не сикрет на кого учишся и где?
В МГАПИ на программиста вроде как. Только из всей нашей группы только пару ребят могут что-то реальное написать
Я тут, кстати, проглядывал дипломы прошлого года и просто изумлялся. Такие лажовые работы я в своей группе в курсовых не часто встречал. И ничего все нормально сдали. Не понимаю я нашего образования..
Вот ещё интересно есть ли у кого-нибудь опыт сдавания дипломных проектов на кафедре где и слыхом не слыхивали о .NET.
В МГУ (я как раз на этой недели там курсы прохожу) MS подарила (давно уже правда) целый компьютерный класс и там у них, на базе этой аудитории, целое .Net комъюнити. А нашей шараге до всех новых технологий по барабану
A>>Не, я имею в виду, что в моём ATG файле нет ни строчки кода, есть только BNF (EBNF?), VD>Именно EBNF.
Интересно а грамматики используются при описаниях языков? Кто-нибудь реально расписывает четверку G=<N,T,P,S>?
В книге, которую читаю, есть небольшой пример грамматики Паскаля (объявление массива), так там сразу БНФ строят.
VD>А так исходных cs.ATG тоже можно считать формально пустым. Правда то что я тебе прислал — это уже почти готовый парсер в AST (абстрактное синтаксическое дерево), и там кода хватает.
Я заметил VD>Кстати, как я понимаю вы хотите использовать парсер для очень похожих целей. Так что R# может оказаться для вас хорошим примером.
В целом да, мы делаем примерно тоже, только с более простым языком и не задумываемся над передачей дерева разбора компилятору.. Так что тебе ещё раз огромное спасибо за помощь!!
Кстати, мне придется немного переделать твою Коку, т.к. она отказалась воспринимать IGNORE "CASE"
Сегодня с утра Coco.ATG переделал, завтра выдастся свободная минутка, тогда поизменяю Tabc.cs. Вроде больше ничего менять не нужно (или я не прав?).
Здравствуйте, agos, Вы писали:
A>Здравствуйте, VladD2, Вы писали:
A>>>Судя по тому, что всё откомпилировалось, (. и .) нигде не использовалось VD>>Оно и понятно. Вопрос в том, что будет если в Паскалевском исходнике вместо '[' указать '(.'. A>Честно говоря не пробывал, но думаю, что выдаст ошибку.
A>>>Здорово — мне одна эта фраза сказала больше, чем несколько страниц в двух книгах VD>>Вообще-то во всех книжках про это дело довольно подробно говорится. Только черезчур заумно. Порой простейщие вещи объясняются на базе трехэтажных абстраций и головоломных формул. Но тут уж ничего не поделаешь. В основном народ занимавшийся формализацией этой области бил математиками... A>Ну да. По крайней мере когда я читаю всю эту литерату, то часто задумываюсь, а как же это применить на компьютере..
VD>>А если не сикрет на кого учишся и где? A>В МГАПИ на программиста вроде как. Только из всей нашей группы только пару ребят могут что-то реальное написать A>Я тут, кстати, проглядывал дипломы прошлого года и просто изумлялся. Такие лажовые работы я в своей группе в курсовых не часто встречал. И ничего все нормально сдали. Не понимаю я нашего образования.. A>Вот ещё интересно есть ли у кого-нибудь опыт сдавания дипломных проектов на кафедре где и слыхом не слыхивали о .NET. A>В МГУ (я как раз на этой недели там курсы прохожу) MS подарила (давно уже правда) целый компьютерный класс и там у них, на базе этой аудитории, целое .Net комъюнити. А нашей шараге до всех новых технологий по барабану
A>>>Не, я имею в виду, что в моём ATG файле нет ни строчки кода, есть только BNF (EBNF?), VD>>Именно EBNF. A>Интересно а грамматики используются при описаниях языков? Кто-нибудь реально расписывает четверку G=<N,T,P,S>? A>В книге, которую читаю, есть небольшой пример грамматики Паскаля (объявление массива), так там сразу БНФ строят.
VD>>А так исходных cs.ATG тоже можно считать формально пустым. Правда то что я тебе прислал — это уже почти готовый парсер в AST (абстрактное синтаксическое дерево), и там кода хватает. A>Я заметил VD>>Кстати, как я понимаю вы хотите использовать парсер для очень похожих целей. Так что R# может оказаться для вас хорошим примером. A>В целом да, мы делаем примерно тоже, только с более простым языком и не задумываемся над передачей дерева разбора компилятору.. Так что тебе ещё раз огромное спасибо за помощь!! A>Кстати, мне придется немного переделать твою Коку, т.к. она отказалась воспринимать IGNORE "CASE" A>Сегодня с утра Coco.ATG переделал, завтра выдастся свободная минутка, тогда поизменяю Tabc.cs. Вроде больше ничего менять не нужно (или я не прав?).
Привет, грамматика Delphi для COCO случайно не сохранилась?