# Perl 6 Example from: https://examples.perl6.org/categories/parsers/SimpleStrings.html
use v6;
grammar String::Simple::Grammar {
rule TOP {^ <string> $}
# Note for now, {} gets around a rakudo binding issue
token string { <quote> {} <quotebody($<quote>)> $<quote> }
token quote { '"' | "'" }
token quotebody($quote) { ( <escaped($quote)> | <!before $quote> . )* }
token escaped($quote) { '\\' ( $quote | '\\' ) }
}
# The parse-tree builder ultimately returns the string itself.
class String::Simple::Actions {
method TOP($/) { make $<string>.made }
method string($/) { make $<quotebody>.made }
method quotebody($/) { make [~] $0.map: {.<escaped>.made or ~$_} }
method escaped($/) { make ~$0 }
}
# Here is a sample string:
my $sample = q{"This is a quote"};
my $result = String::Simple::Grammar.parse: $sample; # parse it
say $result.gist;
# A more complicated sample: '\''
$sample = "'\\\''";
$result = String::Simple::Grammar.parse: $sample; # parse it
say $result.gist;