Perl 6 - Grammar 笔记

一个 Grammar 调了很久, 先分解下:

  • 解析[ ] 里面的数据:
use v6;
use Grammar::Debugger;

grammar Lines {
    token TOP {
        ^ + $
    }

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

    token student {
       + %    # 分隔符也可以是一个 subrule
    }

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

    token comma {
        ',' \s+              # 逗号, 分号 不能裸露出现在 token 中
    }

    token semicolon {
        ';' \s+
    }

}

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

test.txt 的内容如下:

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

下面的 Grammar 用于解析一个字符串, 由于 tokens 不能回溯, 所以当解析 $str 时使用了 Grammar 的继承, 重写了 university 这个 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             { ^  $             }
    token university      { [   ]+ % '; ' }
    token bracket         { '['   '] '      }
    token studentname     { + % '; '      }
    token info            { + % ', '              }
    token field           { <-[,\]\[;\n]>+               }
}

# grammar 像类一样可以继承, 里面的 token 可以被重写
grammar MyUniversity  is University::Grammar {
    token university      { + % '; ' }
}

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) -> $f {
    say $f[0];
}

你可能感兴趣的:(Perl 6 - Grammar 笔记)