Re: Parse::RecDescent::FAQ: Question concerning newlines
[email protected] (Terrence Brannon) Thu, 20 Nov 2003 08:13:34 -0800
| Newsgroups | perl.recdescent |
|---|---|
| Message-ID | <[email protected]> |
Tom Kenter wrote:
>Hello Terrence Brannon,
>
>
>
Hi Tom,
>This is an email with a question about Parse::RecDescent. I send to you
>because your name was mentioned on the faq page as being the author of
>it. I hope I am right in doing so. If not, please accept my apologies.
>
>
>
I just maintain the FAQ. I don't answer all questions about P::RD. Here
are two resources:
The Parse::RecDescent Mailing List
http://lists.perl.org/showlist.cgi?name=recdescent
Perlmonks.org:
www.perlmonks.org
I have forwarded your email to the former so you might want to join
quickly in case someone answers
soon.
I am completely out of touch with practical use of P::RD these days.
>Now, the question is:
>How can I match a single newline in the middle of a rule?
>
>(By the way, I have read these items in the faq list, "NEWLINE
>PROCESSING", "Parsing Windows Init", (.ini) Files", "As end of line",
>but I feel my questions does not get answered there).
>
>This example (form "the man(1) of descent page") works:
>Command:
> LineRange 'c' LineRange
> LeftLine(s) "---\n" RightLine(s)
> { print "$item[3]c$item[1]\n";
> print map {s/>/</; $_} @{$item[6]};
> print $item[5];
> print map {s/</>/; $_} @{$item[4]};}
>
>But this doesn't:
>Command:
> LineRange 'c' LineRange
> LeftLine(s) "\n" RightLine(s) # <-- single newline, without dashes
> { print "$item[3]c$item[1]\n";
> print map {s/>/</; $_} @{$item[6]};
> print $item[5];
> print map {s/</>/; $_} @{$item[4]};}
>
>Why not?
>I tried changing it to '\n' and /\n/, and making a new rule
>newline:
> "\n"
> |
> '\n'
> \
> /\n/
>all of which to no avail...
>
>Also, I tried this:
>
>### begin listing ###
>
>use strict;
>use Parse::RecDescent;
>
>my $grammar =
> q {
> AdressenGramm: ValidLine(s)
>
>ValidLine: <skip: qr/[ \t]*/> word newline word
> { print "Found $item[1], $item[3]\n"; }
>word: /\w+/
>newline: /\n/
>};
>
>my $parser1 = new Parse::RecDescent($grammar);
>
>my $text = "word1\nword2";
>
>my $result1 = $parser1->AdressenGramm($text) or warn "Bad input1\n";
>
>### end listing ###
>
>which has this as output:
>Found \s*,
>
>which was somehow not quite what I expected...
>
>What I really want to have is a rule like this:
>
>SeveralLines:
> Word "\n" Word "\n" Word {
> print "found: $item[1], $item[2], $item[3]";
> }
>
>Word:
> /[A-Za-z]+/
>
>which would print
>found: abc, def, ghi
>for the input "abc\ndef\nghi";
>
>I hope to have been both elaborate and brief enough...
>
>Thanks!
>
>Kind regards,
>
>Tom
>
>
>