Perl 6 - Grammar 筆記

一個(gè) Grammar 調(diào)了很久, 先分解下:

  • 解析[ ] 里面的數(shù)據(jù):
use v6;
use Grammar::Debugger;

grammar Lines {
    token TOP {
        ^ <line>+ $
    }

    token line {
        \[
        <student>+ % <semicolon>
        \]
        \n                   # 換行 \n 是最容易被忽略的地方, 坑了很多次了!
    }

    token student {
       <myname>+ % <comma>   # 分隔符也可以是一個(gè) subrule
    }

    token myname {
        <[A..Za..z-]>+       # 字符類的寫法 <[...]>
    }

    token comma {
        ',' \s+              # 逗號(hào), 分號(hào) 不能裸露出現(xiàn)在 token 中
    }

    token semicolon {
        ';' \s+
    }

}

my $parse = Lines.parsefile('test.txt');
say $parse;

test.txt 的內(nèi)容如下:

[Lue, Fan]
[Lou, Man-Li]
[Tian, Mijie; Zhou, Lin; Zou, Xiao; Zheng, Qiaoji; Luo, Lingling; Jiang, Na; Lin, Dunmin]

下面的 Grammar 用于解析一個(gè)字符串, 由于 tokens 不能回溯, 所以當(dāng)解析 $str 時(shí)使用了 Grammar 的繼承, 重寫了 university 這個(gè) token:

use v6;
use Grammar::Debugger;

my $string = "[Wang, Zhiguo; Zhao, Zhiguo] Hangzhou Normal Univ, Ctr Cognit & Brain Disorders, Hangzhou, Zhejiang, Peoples R China; [Wang, Zhiguo; Theeuwes, Jan] Vrije Univ Amsterdam, Dept Cognit Psychol, Amsterdam, Netherlands";

grammar University::Grammar {
    token TOP             { ^ <university> $             }
    token university      { [ <bracket> <info> ]+ % '; ' }
    token bracket         { '[' <studentname>  '] '      }
    token studentname     { <stdname=.info>+ % '; '      }
    token info            { <field>+ % ', '              }
    token field           { <-[,\]\[;\n]>+               }
}

# grammar 像類一樣可以繼承, 里面的 token 可以被重寫
grammar MyUniversity  is University::Grammar {
    token university      { <info>+ % '; ' }
}

my $str = "Zhejiang Univ, Coll Environm & Resources Sci, Dept Resource Sci, Hangzhou 310029, Peoples R China; La Trobe Univ, Dept Agr Sci, Bundoora, Vic 3083, Australia; Hangzhou Normal Coll, Fac Life Sci, Hangzhou, Peoples R China";

my $parsed = University::Grammar.parse($string);
# my $parsed = MyUniversity.parse($str);

for @($parsed<university><info>) -> $f {
    say $f<field>[0];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容