Как я могу использовать метасинтаксис регулярного выражения perl6, <foo regex>? - PullRequest
0 голосов
/ 07 мая 2018

В грамматиках perl6, как объяснено здесь (обратите внимание, что проектные документы не гарантируются актуальными после завершения реализации), если за открывающей угловой скобкой следует идентификатор, то конструкция - это вызов подправила, метода или функции.

Если символ, следующий за идентификатором, является открывающей пареной, то это вызов метода или функции, например: <foo('bar')>. Как будет объяснено ниже на странице, если первый символ после идентификатора является пробелом, то остальная часть строки вплоть до угла закрытия будет интерпретироваться как аргумент регулярного выражения для метода - в кавычках:

 <foo bar>

более или менее эквивалентно

 <foo(/bar/)>

Как правильно использовать эту функцию? В моем случае я анализирую данные, ориентированные на строки, и пытаюсь объявить правило, которое инициирует отдельный поиск по текущей анализируемой строке:

#!/usr/bin/env perl6
# use Grammar::Tracer ;

grammar G {
    my $SOLpos = -1 ;   # Start-of-line pos

    regex TOP {  <line>+  }

    method SOLscan($regex) {
        # Start a new cursor
        my $cur = self."!cursor_start_cur"() ;

        # Set pos and from to start of the current line
        $cur.from($SOLpos) ;
        $cur.pos($SOLpos) ;

        # Run the given regex on the cursor
        $cur = $regex($cur) ;

        # If pos is >= 0, we found what we were looking for
        if $cur.pos >= 0 {
            $cur."!cursor_pass"(self.pos, 'SOLscan')
        }

        self
    }

    token line {
        { $SOLpos = self.pos ; say '$SOLpos = ' ~ $SOLpos }
        [
        || <word> <ws> 'two' { say 'matched two' }  <SOLscan \w+> <ws> <word>
        || <word>+ %% <ws>    { say 'matched words' }
        ]
        \n
    }

    token word  {  \S+  }
    token ws    {  \h+  }
}

my $mo = G.subparse: q:to/END/ ;
hello world
one two three
END

Как есть, этот код выдает:

$ ./h.pl
$SOLpos = 0
matched words
$SOLpos = 12
matched two
Too many positionals passed; expected 1 argument but got 2
  in method SOLscan at ./h.pl line 14
  in regex line at ./h.pl line 32
  in regex TOP at ./h.pl line 7
  in block <unit> at ./h.pl line 41
$

Строка 14 - $cur.from($SOLpos). Если закомментировано, строка 15 выдает ту же ошибку. Похоже, что .pos и .from только для чтения ... (может быть: -)

Есть идеи, что такое правильное заклинание? Обратите внимание, что любое предлагаемое решение может быть далеким от того, что я сделал здесь - все, что я действительно хочу сделать, это понять , как механизм должен использоваться.

1 Ответ

0 голосов
/ 31 декабря 2018

Это не похоже на в соответствующем каталоге в roast , так что, боюсь, это сделало бы его функцией "Еще не реализовано".

...