[Moscow.pm] Синтаксический анализ на Perl. Транслятор.
Ruslan Zakirov
ruslan.zakirov на gmail.com
Пт Янв 23 03:20:25 PST 2015
2015-01-22 23:28 GMT+03:00 Nikolay Mishin <mi на ya.ru>:
> Руслан,
> я тут понаписав парсеров на регулярках
> с удовольсвием послушал бы про MarpaX::Repa
> и как с помощью него распарсить скажем css
> или html, если это, конечно, возможно,
>
С HTML сложно, но возможно, есть Marpa::HTML (не помню точное имя) который
делает парсинг согласно HTML5 стандарту (по словам автора модуля, он же
автор Marpa). Там все старшно внутри.
> ну для примера, как сделать грамматику для такой конструкции:
>
> BEGIN DSSUBRECORD
> Name "$APT_DBNAME"
> Prompt "DB2 Database"
> Default "BANKDATA"
> HelpTxt "Default DB2 database to use"
> ParamType "0"
> ParamLength "0"
> ParamScale "0"
> END DSSUBRECORD
>
> если это вообще стоит делать,т.к. я просто
> это распарсил такой функцией:
>
cd ~/projs/mods/MarpaX-Repa/
git co master
cp examples/template.pl ttt.pl
vi ttt.pl
прикрепил
>
> sub split_fields_by_new_line {
> my ($curr_record) = @_;
> my %fields_and_values = ();
> while (
> $curr_record =~ m/
> (?<name>\w+)[ ]"(?<value>.*?)(?<!\\)"|
> ((?<name2>\w+)[ ]\Q=+=+=+=\E
> (?<value2>.*?)
> \Q=+=+=+=\E)
> /xsg
> )
> {
> my ($value, $name) = ('', '');
> if (defined $+{name}) {
> $name = $+{name};
> $value = $+{value};
> }
> elsif (defined $+{name2}) {
> $name = $+{name2};
> $value = $+{value2};
> }
> $fields_and_values{$name} = $value;
> }
> return \%fields_and_values;
> }
>
>
>
> > Marpa, Parse::RecDescent, Parse::Yapp, Parse::Eyapp.
> >
> > Первый мне очень нравиться. Попрбуйте с MarpaX::Repa. "Репу" написал сам
> и мне очень удобно с ним писать парсеры ибо можно написать грамматику и не
> определить все токены, то есть итеративно дополнять в процессе свой парсер
> без фатальных ошибок на этапе компиляции парсера. В новых версиях Marpa
> есть Scanless интерфейс - это самое близкое к Repa так как включает лексер
> и самое простое для начала.
> >
> > 2015-01-14 12:34 GMT+03:00 Харпалёв Иван <ivan.kharpalev на gmail.com>:
> >
> >> Доброго времени, могучий MoscowPM!
> >>
> >> Сейчас пишу небольшой язык.
> >> То есть пишу транслятор из него в awk и С. (Сначала в awk, чтобы
> потренироваться, а потом в C, там типизация, там сложнее).
> >>
> >> Когда язык был совсем примитивный, я его парсил регэкспами и по
> рабоче-крестьянски собирал код на целевом языке.
> >> Но язык подростает. И рефакторить оказывается очень печально.
> >>
> >> Как я понимаю весь процесс работы транслятора состоит из стандартных
> стадий, например:
> >> токенизация
> >> построение дерева разбора
> >> сбор кода на целевом языке из полученного описания.
> >>
> >> В общем тория у меня хромает и очень интересна. Но первым делом
> практика.
> >> Скажите, чем строить дерево синтаксического разбора?
> >> что-то вроде
> >>
> >> --
> >>
> >> Moscow.pm mailing list
> >>
> >> moscow-pm на pm.org | http://moscow.pm.org
> >
> > --
> > Best regards, Ruslan.
> --
> С уважением
> Николай Мишин
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
--
Best regards, Ruslan.
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150123/1fc58e05/attachment-0001.html>
----------- следущая часть -----------
A non-text attachment was scrubbed...
Name: ttt.pl
Type: text/x-perl-script
Size: 1778 bytes
Desc: отсутствует
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150123/1fc58e05/attachment-0001.bin>
Подробная информация о списке рассылки Moscow-pm