<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2015-01-22 23:28 GMT+03:00 Nikolay Mishin <span dir="ltr"><<a href="mailto:mi@ya.ru" target="_blank">mi@ya.ru</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Руслан,<br>
я тут понаписав парсеров на регулярках<br>
с удовольсвием послушал бы про MarpaX::Repa<br>
и как с помощью него распарсить скажем css<br>
или html, если это, конечно, возможно,<br></blockquote><div><br></div><div>С HTML сложно, но возможно, есть Marpa::HTML (не помню точное имя) который делает парсинг согласно HTML5 стандарту (по словам автора модуля, он же автор Marpa). Там все старшно внутри.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
ну для примера, как сделать грамматику для такой конструкции:<br>
<br>
      BEGIN DSSUBRECORD<br>
         Name "$APT_DBNAME"<br>
         Prompt "DB2 Database"<br>
         Default "BANKDATA"<br>
         HelpTxt "Default DB2 database to use"<br>
         ParamType "0"<br>
         ParamLength "0"<br>
         ParamScale "0"<br>
      END DSSUBRECORD<br>
<br>
если это вообще стоит делать,т.к. я просто<br>
это распарсил такой функцией:<br></blockquote><div><br></div><div>







<p class="">cd ~/projs/mods/MarpaX-Repa/</p></div><div>git co master</div><div>







<p class="">cp examples/<a href="http://template.pl">template.pl</a> <a href="http://ttt.pl">ttt.pl</a></p></div><div>vi <a href="http://ttt.pl">ttt.pl</a></div><div> </div><div>прикрепил</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
sub split_fields_by_new_line {<br>
    my ($curr_record) = @_;<br>
    my %fields_and_values = ();<br>
    while (<br>
        $curr_record =~ m/<br>
(?<name>\w+)[ ]"(?<value>.*?)(?<!\\)"|<br>
((?<name2>\w+)[ ]\Q=+=+=+=\E<br>
(?<value2>.*?)<br>
\Q=+=+=+=\E)<br>
/xsg<br>
      )<br>
    {<br>
        my ($value, $name) = ('', '');<br>
        if (defined $+{name}) {<br>
            $name  = $+{name};<br>
            $value = $+{value};<br>
        }<br>
        elsif (defined $+{name2}) {<br>
            $name  = $+{name2};<br>
            $value = $+{value2};<br>
        }<br>
        $fields_and_values{$name} = $value;<br>
    }<br>
    return \%fields_and_values;<br>
<div class=""><div class="h5">}<br>
<br>
<br>
<br>
> Marpa, Parse::RecDescent, Parse::Yapp, Parse::Eyapp.<br>
><br>
> Первый мне очень нравиться. Попрбуйте с MarpaX::Repa. "Репу" написал сам и мне очень удобно с ним писать парсеры ибо можно написать грамматику и не определить все токены, то есть итеративно дополнять в процессе свой парсер без фатальных ошибок на этапе компиляции парсера. В новых версиях Marpa есть Scanless интерфейс - это самое близкое к Repa так как включает лексер и самое простое для начала.<br>
><br>
> 2015-01-14 12:34 GMT+03:00 Харпалёв Иван <<a href="mailto:ivan.kharpalev@gmail.com">ivan.kharpalev@gmail.com</a>>:<br>
><br>
>> Доброго времени, могучий MoscowPM!<br>
>><br>
>> Сейчас пишу небольшой язык.<br>
>> То есть пишу транслятор из него в awk и С. (Сначала в awk, чтобы потренироваться, а потом в C, там типизация, там сложнее).<br>
>><br>
>> Когда язык был совсем примитивный, я его парсил регэкспами и по рабоче-крестьянски собирал код на целевом языке.<br>
>> Но язык подростает. И рефакторить оказывается очень печально.<br>
>><br>
>> Как я понимаю весь процесс работы транслятора состоит из стандартных стадий, например:<br>
>> токенизация<br>
>> построение дерева разбора<br>
>> сбор кода на целевом языке из полученного описания.<br>
>><br>
>> В общем тория у меня хромает и очень интересна. Но первым делом практика.<br>
>> Скажите, чем строить дерево синтаксического разбора?<br>
>> что-то вроде<br>
>><br>
>> --<br>
>><br>
>> Moscow.pm mailing list<br>
>><br>
>> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
><br>
> --<br>
> Best regards, Ruslan.<br>
</div></div><span class=""><font color="#888888">--<br>
С уважением<br>
Николай Мишин<br>
</font></span><div class=""><div class="h5"><br>
<br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Best regards, Ruslan.</div>
</div></div>