語法解析的目的是爲了轉換,讓這門語言可以逐步進化成一種語言。 這種語言的內核確定是 Lisp,但外形倒是創做者最喜歡的。正則表達式
全部過去的東西均可以使用,但有更新的東西。更新的語言。 這些語言都是互通的。用任何一種語言寫的代碼,都是能夠轉換成另外的代碼。算法
Perl 6 容許下面的 identifier:數組
person's-name first-name middle-name last-name
但不容許下面的形式:數據結構
list->vector string? sort!
Perl 6 定義了不少操做符,但這些操做符不能自定義,只能在源碼中定義:ide
+ - * ^ /
既然有 JSON 數據交換格式,就應當有算法交換格式,就好象是輸出產品,也輸出技術:工具
正則表達式是一種描述規則的語言,而傳統語言是描述算法的語言。regex 就好象 Prolog,咱們把想要的描述出來,計算機會幫咱們算出符合條件的序列。學習
Perl 6 將 regex 做爲第一類對象抽象出來並不奇怪,但他將 Grammar 也抽象出來了。測試
像一個類或模塊同樣設計 Grammar,那麼就要學習 Perl 6 設計類的規則。spa
若是 regex 以點 dot(.) 開始,那麼這個 regex 將不會保存在 Match Object 中,也就是 <regex> 在 Match 中默認是命名捕獲的。設計
regex foo { <.bar> }
那麼在 regex 也儘可能使用 bracket 來進行設計。
在 Grammar 中,regex 也是有關鍵字的:
my $match = YourGrammar.parse($some-string);
只有括號和命名 regex 纔會捕獲東西,但內置的 <:LC> 會捕獲東西嗎?
默認,調用 .parse() 這個方法,將首先查找 Grammar 中 TOP 的 regex, 用這個 規則來解析字符串。若是沒有找到 TOP,就會報錯。因此 <TOP> 也是關鍵字。能夠把 TOP 當成 Grammar 的入口。固然,你能夠不用:
my $match = YourGrammar.parse($some-string, :rule<fred>);
Grammar 就像 Class 同樣,能夠繼承,能夠改寫。必定有核心的設計者將 Perl 6,Perl5 Ruby 等語言的 Grammar 設計出來,以便你們測試。一旦熟悉這種語言, 就能夠將 Antrl 等軟件的 g4 資源轉換過來。
代碼能夠直接用大括號內嵌進來,但繼承的詞法和語法規則是什麼呢?
grammar Foo { regex foo { blah blah { say "hi" } blah blah } } "aaa" ~~ / a { say "hi" } b/
在 regex 中插入代碼要當心回溯 backtracking.
另一種在 regex 插入代碼的行爲是插入一個子程序。
grammar foo { regex foo { <.setup> blah blah } method setup { # do stuff here } }
Perl 6 的正則表達式語言,是全部語言中所沒有的。
my $match = Grammar.parse($string, :rule($start-regex), :actions($actions-object));
Antlr 只是 Java 的一個工具,而 Perl 6 是一個作相同事的語言。內置了一個虛擬機,解釋器,還有一個編譯器。
對於帶數量符號的捕獲,是保存在數組中,Perl 5 是否是也是這樣呢?
if "hello" =~ s/(\w)+/a/g { say @+; }
實際只捕獲了一個位置,因此,Perl 5 並非這樣。儘可能用 regex <token> 來獲取指定位置的數據結構。
token 定義的 regex 永遠不會回溯:
token ident { [ <alpha> | \- ] \w* }
等價於:
regex ident { [ <alpha>: | \-: ]: \w*: }
rule 定義的規則不但不能回溯,並且缺省是 :sigspace 模式:
regex :ratchet :sigspace { ... }
token, rule 都是從 regex 演化而來: