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

Nikolay Mishin mi на ya.ru
Чт Янв 22 12:28:41 PST 2015


Руслан,
я тут понаписав парсеров на регулярках
с удовольсвием послушал бы про MarpaX::Repa
и как с помощью него распарсить скажем css
или html, если это, конечно, возможно,
ну для примера, как сделать грамматику для такой конструкции:

      BEGIN DSSUBRECORD
         Name "$APT_DBNAME"
         Prompt "DB2 Database"
         Default "BANKDATA"
         HelpTxt "Default DB2 database to use"
         ParamType "0"
         ParamLength "0"
         ParamScale "0"
      END DSSUBRECORD

если это вообще стоит делать,т.к. я просто
это распарсил такой функцией:

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