[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