Сергей Ш.
969 сообщений
#14 лет назад
Привет всем! Стоит такая задача: написать простой парсер используя Visual C++ 6.0 (не знаю почему именно этот). Должен в тестовом файле найти записи e-mail. Грубо говоря записи начинающиеся с @.ru например. Я в этом ещё совсем новичок.Читал про lex и Yacc, но не понял как это реализовывается конкретно.
Евгений Н.
954 сообщения
#14 лет назад
Погугли "парсер email на с++"
Евгений Г.
1153 сообщения
#14 лет назад
Z_A_P, я не знаю, как у вас, а мы писали пусть и простенький, но транслятор в универе сами. Если не ошибаюсь, 3 курс. В этом, собственно, и задача курсового проекта. И, понятное дело, это все падает не вдруг с потолка, а тема изучается и принцип выполнения проекта изначально определен. Известны шаги разбора, известны принципы лексического, синтактического разборов, формирования постфиксной записи. Вопрос в качестве реализации этих алгоритов в виде кода. И там тоже все далеко не элементарно, особенно в синтаксическом разборе.
Я понимаю, что парсер - это не транслятор, но задачи похожи.

Ваша задача учебная или это что-то другое?
Сергей Ш.
969 сообщений
#14 лет назад
IFgeny, задача учебная. Это вообще лабораторная работа, но сам препод молодой и сам не знает как это сделать ещё - сидит разбирается. А мне дал сделать учебный курс. Так вот я пытаюсь понять суть.
Евгений Г.
1153 сообщения
#14 лет назад
Z_A_P, что-то странное. Препод, который не знает как сделать лабораторку по ведомому предмету... Пусть и молодой, откуда он взялся такой удалец на кафедре?
Цитата ("Z_A_P"):
А мне дал сделать учебный курс.
Т.е. учебного курса тоже нет? Ни лекций, ни методичек? Как предмет называется?
Что-то тут не то.
Евгений О.
2989 сообщений
#14 лет назад
Судя по примеру @.ru Вы хотите разбирать через регулярные выражения. Если да, то сначала требуется определить какая библиотека будет использоваться для обработки. Если PCRE то тут есть пример
Денис Ш.
7132 сообщения
#14 лет назад
elosoft, для учебного курса лучше именно самим синтаксический разбор писать... Тут цель другая - не решить кучу коммерческих задач, а научить людей азам.
Я бы не брал библиотеки, а копал в сторону простого анализатора.

Z_A_P, 6-ка используется, т.к. простая и маловесная. Если бы мне нужно было именно распарсить адреса в ручном режиме, то я бы искал @ в тексте, потом шел влево до разделителя (пробел или скобка) и враво до разделителя (пробел или скобка) проверяя символы на вхождение в словарь. Для исключения двойного прохода, я бы при нахождении символа разделителя, начинал бы кэшировать символы, проверяя их на вхождение в словарь, тогда попав на @ у меня была бы уже левая часть адреса... Задача очень простая, реализации можно сделать разные.
Евгений О.
2989 сообщений
#14 лет назад
Если совсем по уму делать, то нужно и то и то. Просто разбор строки и использование регулярных выражений достаточно сильно отличаются друг от друга в практическом использовании.
Денис Ш.
7132 сообщения
#14 лет назад
Цитата ("elosoft"):
Просто разбор строки и использование регулярных выражений достаточно сильно отличаются друг от друга в практическом использовании


Конечно отличаются. И очень сильно. В использовании регулярных выражений вы разбор строки переложили на стороннюю библиотеку, а при разборе строки вы это делаете сами.
Я написал про словарь символов, а это и есть уже набор регулярки . Я написал про поиск символа @ - это и есть разбор статического элемента регулярного выражения.
Вообще, поставленная задача ТС это реально на уровне лабы, не более.
Можно написать в лоб - для первого курса пройдет
Можно написать свою либу для обработки регулярки - для второго курса сойдет
Можно использовать готовые мощные инструменты - для курсача сойдет, как часть большего задания.

В учебе очень важно начинать с самых азов, чтобы в голове было понимание механизмов, заложенных в тех или иных инструментах... Если сразу браться за инструмент, то тяжело начать его использовать наиболее оптимально и эффективно.

Для данной задачи, например, было бы эффективно самому разобрать строку - прога будет работать гораздо быстрее, чем использование всяких универсальных парсеров и обработчиков регулярных выражений.
Сергей Ш.
969 сообщений
#14 лет назад
Нужно используя регулярные выражения а также lex и yacc.
Вот наткнулся на пример.Тут, видимо, читается текстовый файл(точнее html код) и ищется на '@' а 'mailto'.Для работы данного примера требуется подключать библиотеку?Как вообще этот код скомпилировать в Visual C++ ?
<?  
$filename = 'file.txt';
echo $i.". ";
$str = file_get_contents($filename);
preg_match_all('|href="mailto:(*)"|is',$str,$out);
if(empty($out)) echo " no mail";
else{
echo " get ".$out;
fwrite($handler,$out."\n");
}
echo "\n";
fclose($handler);
?>
Денис Ш.
7132 сообщения
#14 лет назад
Цитата ("Z_A_P"):
Нужно используя регулярные выражения а также lex и yacc


Так не интересно Вот своими ручками, вот это кайф...
Сергей Ш.
969 сообщений
#14 лет назад
shapod, Тем не менее Вы не могли бы описать как это в Visual C++ реализуется?(код выше)
Денис Ш.
7132 сообщения
#14 лет назад
Z_A_P, не мог бы. Я не знаю, что это за язык там в примере, и не знаю, что это за функции там используются.
Смею предположить, что это какой-нибудь ПХП. А в ПХП уже есть встроенные регулярки.
С лексом и яком не приходилось работать, а алгоритм разбора я уже описал.
Вообще не понятна такая привязанность к лексу и яку, если нет ни метод, ни программы...
Может вы не все нам тут описали?
Сергей Ш.
969 сообщений
#14 лет назад
Мне бы вообще понять с чего начать. На руках есть Visual C++,в методичке написано что при создании проекта там есть "Lexer and parser addwizard" но такого там не нашел =(
Евгений Г.
1153 сообщения
#14 лет назад
Цитата ("Z_A_P"):
Как вообще этот код скомпилировать в Visual C++ ?


Сначала написать аналогичный код на C++. В примере Php.
Евгений О.
2989 сообщений
#14 лет назад
Может пригодиться.

А также "The Lex & Yacc Page"
Денис Ш.
7132 сообщения
#14 лет назад
elosoft, та ну. ваша ссылка на .NET фреймверк поможет не больше чем пример кода на ПХП

Z_A_P, ну объясните зачем так циклиться на яке и лексе? Банальная задача может быть решена просто и незатейливо.

Вот еще материал для анализа:

Евгений Г.
1153 сообщения
#14 лет назад
shapod,
судя по тому, что пишет ТС
Цитата ("Z_A_P"):
Нужно используя регулярные выражения а также lex и yacc.

Видимо, задание такое. Другое дело, что, мне кажется, ТС никогда ничего на С++ ни разу не писал. Вот это уже проблема.

Z_A_P, скажите, что это за предмет и можете привести полный текст задания на лабораторку?
Можно и методичку.
Денис Ш.
7132 сообщения
#14 лет назад
IFgeny, странно звучит вот это:

Цитата ("Z_A_P"):
А мне дал сделать учебный курс.Так вот я пытаюсь понять суть.
Евгений Г.
1153 сообщения
#14 лет назад
shapod, ну, я выше уже писал про загадочность ситуации