[Moscow.pm] Синтаксический анализ на Perl. Транслятор.

Nikolay Mishin mi на ya.ru
Сб Янв 24 11:34:22 PST 2015


Руслан, супер, спасибо, работает,а я что-то и забыл про
use Regexp::Common qw /delimited/; !

23.01.2015, 14:21, "Ruslan Zakirov" <ruslan.zakirov на gmail.com>:
> 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.
>
> ,
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org

-- 
С уважением
Николай Мишин



Подробная информация о списке рассылки Moscow-pm