Perl 6 的 Grammar 學習總結

語法解析的目的是爲了轉換,讓這門語言可以逐步進化成一種語言。 這種語言的內核確定是 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 的正則表達式語言,是全部語言中所沒有的。

預約義執行 actions object:

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 和 rule

token 定義的 regex 永遠不會回溯:

token ident { [ <alpha> | \- ] \w* }

等價於:

regex ident { [ <alpha>: | \-: ]: \w*: }

rule 定義的規則不但不能回溯,並且缺省是 :sigspace 模式:

regex :ratchet :sigspace { ... }

token, rule 都是從 regex 演化而來:

相關文章
相關標籤/搜索