perl6 grammars

89
Regexes and Grammars in Perl 6

Upload: andysh

Post on 18-Nov-2014

21.319 views

Category:

Documents


6 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Perl6 grammars

Regexesand Grammars

in Perl 6

Page 2: Perl6 grammars

Preface

Page 3: Perl6 grammars
Page 4: Perl6 grammars

Synopsis 5

Page 5: Perl6 grammars

Synopsis 5Regexes and Rules

Page 6: Perl6 grammars

S05

Page 7: Perl6 grammars

Damian ConwayAllison RandalPatrick MichaudLarry WallMoritz Lenz

Page 8: Perl6 grammars

Created: 24 Jun 2002Last Modified: 30 Aug 2010Version: 132

Page 9: Perl6 grammars

54 pages

Page 10: Perl6 grammars

Part I

Regexes

Page 11: Perl6 grammars

Random factsand terminology

Page 12: Perl6 grammars

Regular expressionsin Perl 5 were not regular

Page 13: Perl6 grammars

Regular expressionsin Perl 5 were not regular

Regular expressionsin Perl 6 are called regexes

Page 14: Perl6 grammars

Regular expressionsin Perl 5 were not regular

Regular expressionsin Perl 6 are called regexes

Which means “kinda like a regular expression”

Page 15: Perl6 grammars

Match objectcontains result of matching

$/

Page 16: Perl6 grammars

Capture variable indexesstart with 0

$0

Page 17: Perl6 grammars

$0, $1, etc.are part of $/

Page 18: Perl6 grammars

my $q = "Hotels in Berlin";$q ~~ /in\s(.*)/;

say $0; # Berlinsay $/[0]; # Berlin

Page 19: Perl6 grammars

Metacharacters

are everything except Unicode letters or numbers or underscore

Page 20: Perl6 grammars

Quotes

may be used for creating atoms

'I will never use PHP again. '*

Page 21: Perl6 grammars

Repetition

(\d+ \s?) ** 3

(\d+ \s?) ** 5..10

\d+ ** ','

Page 22: Perl6 grammars

/x modifier gone

"ab" ~~ / a b /;say $/; # ab

Page 23: Perl6 grammars

/s, /m modifiers gone

"a1\nb2\nc3" ~~ /^^ .2 $$/;

"a1\nb2\nc3" ~~ /\N+/;

Page 24: Perl6 grammars

/e modifier gone

$str =~ s/pattern/{action()}/;

Page 25: Perl6 grammars

Modifier syntax

@names = $str =~ m:i/MiSteR \s (\w+)/;

Page 26: Perl6 grammars

Brackets

Page 27: Perl6 grammars

Capturing group

( . . . )

Page 28: Perl6 grammars

Non-capturing group

[ . . . ]

Page 29: Perl6 grammars

Character class

<[ . . . ]>

Page 30: Perl6 grammars

Embedded closure

{ . . . }

Page 31: Perl6 grammars

Embedded closure

{ . . . }

> "500" ~~ /(\d+) {$0 < 200 or fail}/===SORRY!===

Page 32: Perl6 grammars

Named rule or token

<. . .>

Page 33: Perl6 grammars

Part II

Grammars

Page 34: Perl6 grammars

Keywords

Page 35: Perl6 grammars

grammargrammarruletokenprotoTOP

Page 36: Perl6 grammars

grammar Grammar { rule TOP {...} rule some_rule {...} token some_token {...}}

Page 37: Perl6 grammars

grammar Grammar { rule TOP {...} rule some_rule {...} token some_token {...}}Syntax is similarto class definition

Page 38: Perl6 grammars

grammar Grammar { rule TOP {...} rule some_rule {...} token some_token {...}}Grammar.parse($string);

Page 39: Perl6 grammars

Example.Step by step

Page 40: Perl6 grammars

Executed by Rakudo

rakudo.org

Page 41: Perl6 grammars

Executed by Rakudo

rakudo.org

Sometimes it fails

Page 42: Perl6 grammars
Page 43: Perl6 grammars

City

Page 44: Perl6 grammars

grammar SearchQuery {

}

Page 45: Perl6 grammars

grammar SearchQuery { rule TOP { }}

Page 46: Perl6 grammars

grammar SearchQuery { rule TOP { ^ $ }}

Page 47: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ }}

Page 48: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ }}

Easy, isn't it?

Page 49: Perl6 grammars

Grammars are part of the language

Page 50: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ } rule query { }}

Page 51: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ } rule query { <city> }}

Page 52: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ } rule query { <city> } token city { }}

Page 53: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ } rule query { <city> } token city { }}

N. B.

rules

token

Page 54: Perl6 grammars

token is a "word"

Page 55: Perl6 grammars

rule is a "phrase"

Page 56: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ } rule query { <city> } token city { }}

Page 57: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ } rule query { <city> } token city { <capital> }}

Page 58: Perl6 grammars

grammar SearchQuery { rule TOP { ^ <query> $ } rule query { <city> } token city { <capital> } token capital { }}

Page 59: Perl6 grammars

my $result = SearchQuery.parse("Amsterdam");say $result.perl;

Page 60: Perl6 grammars

Match.new( from => 0, orig => "Amsterdam", to => 9, named => { query => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { city => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { capital => Match.new( from => 0, orig => "Amsterdam", to => 9, ), }, ), }, ), },)

Page 61: Perl6 grammars

Match.new( from => 0, orig => "Amsterdam", to => 9, named => { query => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { city => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { capital => Match.new( from => 0, orig => "Amsterdam", to => 9, ), }, ), }, ), },)

Matched text

Page 62: Perl6 grammars

Match.new( from => 0, orig => "Amsterdam", to => 9, named => { query => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { city => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { capital => Match.new( from => 0, orig => "Amsterdam", to => 9, ), }, ), }, ), },)

rule query {}

Page 63: Perl6 grammars

Match.new( from => 0, orig => "Amsterdam", to => 9, named => { query => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { city => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { capital => Match.new( from => 0, orig => "Amsterdam", to => 9, ), }, ), }, ), },)

token city {}

Page 64: Perl6 grammars

Match.new( from => 0, orig => "Amsterdam", to => 9, named => { query => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { city => Match.new( from => 0, orig => "Amsterdam", to => 9, named => { capital => Match.new( from => 0, orig => "Amsterdam", to => 9, ), }, ), }, ), },)

token capital {}

Page 65: Perl6 grammars

Country

Page 66: Perl6 grammars

rule query { <city> | <country>}

Page 67: Perl6 grammars

rule query { <city> | <country>}rule country { 'Afghanistan' | 'Akrotiri' | 'Albania' | 'Algeria' | 'American Samoa' | 'Andorra' . . .}

Page 68: Perl6 grammars

my $result = SearchQuery.parse("Amsterdam");say $result.perl;

$result = SearchQuery.parse("China");say $result.perl;

Page 69: Perl6 grammars

rule query { <city> ',' <ws>? <country> | <city> | <country>}

Page 70: Perl6 grammars

rule query { <city> ',' <ws>? <country> | <city> | <country>}

SearchQuery.parse("Tirana, Albania");

Page 71: Perl6 grammars

rule query { <city> ',' <ws>? <country> | <city> | <country>}

SearchQuery.parse("Tirana, Albania");

Page 72: Perl6 grammars

Capturing and accessing

Page 73: Perl6 grammars

Everything goesto Match object

$/

Page 74: Perl6 grammars

SearchQuery.parse("Tirana, Albania");say $<query><city>;say $<query><country>;

Page 75: Perl6 grammars

SearchQuery.parse("Tirana, Albania");say $<query><city>;say $<query><country>;

Tirana

Albania

Page 76: Perl6 grammars

SearchQuery.parse("Tirana, Albania");say $<query><city>;say $<query><country>;

say $/<query><city>;say $/<query><country>;

Shortcut

Full syntax

Page 77: Perl6 grammars

rule query { 'Hotels in'? [ <city> ',' <ws>? <country> | <city> | <country> ] }

Page 78: Perl6 grammars

SearchQuery.parse("Tirana, Albania");say $<query><city>;say $<query><country>;

SearchQuery.parse\ ("Hotels in Tirana, Albania");say $<query><city>;say $<query><country>;

Page 79: Perl6 grammars

rule date { <day> <month> } token day { \d+ ['st' | 'nd' | 'th']? } token month { 'January' | 'February' | 'March' | 'April' . . .

Page 80: Perl6 grammars

SearchQuery.parse("Hotels in Tirana, Albania from 25th December");

SearchQuery.parse("Hotels in Tirana, Albania from 25 December");

Page 81: Perl6 grammars

What will $<query><date>

print?

Page 82: Perl6 grammars

What will $<query><date>

print?

25th Decemberor

25 December

Page 83: Perl6 grammars

token day { (\d+) {$0 <= 31 or fail} }

How to check days

Page 84: Perl6 grammars

rule query { 'Hotels in '? [ <city> ',' <ws>? <country> | <city> | <country> ] [ 'from' <date> 'to' <date> ]? [ 'for' <guest_number> ]? }

Page 85: Perl6 grammars

token guest_number { \d | 'one' | 'two' | 'three' | 'four' | 'five' }

Page 86: Perl6 grammars

"Hotels in Tirana, Albania from25 December to 7 January for two"

Page 87: Perl6 grammars

rule date { 'today' | 'tomorrow' | [ <day> <month> ] }

Page 88: Perl6 grammars

$ perl6 10-all.pl Hotels in Amsterdam, Netherlands from 1 January to 5 February for three City: Amsterdam Country: Netherlands From: 1 January To: 5 February Guests: three

Page 89: Perl6 grammars

__END__

Andrew Shitov talks.shitov.ru | [email protected]