Я пытаюсь написать простой язык манипулирования данными в Perl (только для чтения, это означало для преобразования SQL-вдохновил запросов в фильтры и свойства для использования с Vsphere Perl API: http://pubs.vmware.com/vsphere-60/topic/com.vmware.perlsdk.pg.doc/viperl_advancedtopics.5.1.html_)Написание простого парсера в Perl: с выходом lexer, куда идти дальше?
настоящее время у меня что-то подобное на выходе лексического анализатора, если я понимаю, это правильно - список лексем, как это (Data :: Dumper печатает массив хэшей):
$VAR1 = {
'word' => 'SHOW',
'part' => 'verb',
'position' => 0
};
$VAR2 = {
'part' => 'bareword',
'word' => 'name,',
'position' => 1
};
$VAR3 = {
'word' => 'cpu,',
'part' => 'bareword',
'position' => 2
};
$VAR4 = {
'word' => 'ram',
'part' => 'bareword',
'position' => 3
};
Теперь то, что я хотел бы сделать, это построить синтаксическое дерево. Документация, которую я видел до сих пор, в основном касается использования модулей и генерации грамматик из BNF, но на данный момент я не могу обернуть вокруг себя.
Я хотел бы поработать с относительно простым процедурным кодом, вероятно, рекурсивным, чтобы сделать некоторую уродливую реализацию самостоятельно.
То, что я в настоящее время думает о строит строку из $token->{'part'}s
так:
my $parts = 'verb bareword bareword ... terminator';
, а затем работает большой и уродливый регулярное выражение против него, (аб), используя возможности Perl, чтобы вставить код в регулярные выражения: http://perldoc.perl.org/perlretut.html#A-bit-of-magic:-executing-Perl-code-in-a-regular-expression:
$parts =~/
^verb(?{ do_something_smart })\s # Statement always starts with a verb
(bareword\s(?{ do_something_smart }))+ # Followed by one or more barewords
| # Or
# Other rules duct taped here
/x;
Все, что я нашел до сих пор требует твердого знания CS и/или лингвистики, и я не в состоянии даже понять.
Что мне делать с выходом lexer для начала понимания и tinker с правильным анализом? Что-то вроде «создайте набор временных хэшей, представляющих меньшую часть оператора» или «удалите подстроки, пока строка не будет пустой, а затем подтвердите, что вы получаете».
Я знаю книгу Дракона и SICP, но в это время мне бы хотелось что-то светлее.
Спасибо!
Тогда я перефразирую вопрос. –
Почему бы вам не использовать существующий парсер, например [Marpa :: R2] (http://p3rl.org/Marpa::R2) или [Parse :: RecDescent] (http://p3rl.org/Parse: : RecDescent)? – choroba
@choroba, документация не нажимает. Не знаю достаточно теории, чтобы понять это. Первоначально вопрос был на простом чтении, но вроде бы он был бы закрыт. Мне все равно хотелось бы самому написать парсерную часть, даже если она сосать - это поможет мне понять, как работают парсеры. Если бы речь шла исключительно о том, чтобы все было сделано, я бы пошел с «консервированными» запросами и примерами, которые предлагает VMWare (он тоже работает над этим), но, похоже, это простая и в то же время достаточно полезная задача, чтобы заставить меня учиться что-то новое. –