加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl 6 的 Grammar 学习总结

发布时间:2020-12-15 23:55:37 所属栏目:大数据 来源:网络整理
导读:语法解析的目的是为了转换,让这门语言能够逐步进化成一种语言。 这种语言的内核肯定是 Lisp,但外形却是创作者最喜欢的。 所有过去的东西都可以使用,但有更新的东西。更新的语言。 这些语言都是互通的。用任何一种语言写的代码,都是可以转换成另外的代码

语法解析的目的是为了转换,让这门语言能够逐步进化成一种语言。 这种语言的内核肯定是 Lisp,但外形却是创作者最喜欢的。

所有过去的东西都可以使用,但有更新的东西。更新的语言。 这些语言都是互通的。用任何一种语言写的代码,都是可以转换成另外的代码。

Perl 6 允许下面的 identifier:

person's-name first-name middle-name last-name

但不允许下面的形式:

list->vector string? sort!

Perl 6 定义了很多操作符,但这些操作符不能自定义,只能在源码中定义:

+ - * ^ /

既然有 JSON 数据交换格式,就应当有算法交换格式,就好象是输出产品,也输出技术:

正则表达式是一种描述规则的语言,而传统语言是描述算法的语言。regex 就好象 Prolog,我们把想要的描述出来,计算机会帮我们算出符合条件的序列。

Perl 6 将 regex 作为第一类对象抽象出来并不奇怪,但他将 Grammar 也抽象出来了。

像一个类或模块一样设计 Grammar,那么就要学习 Perl 6 设计类的规则。

如果 regex 以点 dot(.) 开始,那么这个 regex 将不会保存在 Match Object 中,也就是 在 Match 中默认是命名捕获的。

regex foo { <.bar> }

那么在 regex 也尽量使用 bracket 来进行设计。

在 Grammar 中,regex 也是有关键字的:

my $match = YourGrammar.parse($some-string);

只有括号和命名 regex 才会捕获东西,但内置的 <:LC> 会捕获东西吗?

默认,调用 .parse() 这个方法,将首先查找 Grammar 中 TOP 的 regex,用这个 规则来解析字符串。如果没有找到 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 和 rule

token 定义的 regex 永远不会回溯:

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

等价于:

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

rule 定义的规则不但不能回溯,而且缺省是 :sigspace 模式:

regex :ratchet :sigspace { ... }

token,rule 都是从 regex 演化而来:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读