is Match
使用 grammar 声明的每种类型,并且没有明确声明其超类,都将成为 Grammar 的子类。
say Identifier.isa(Grammar); # OUTPUT: «True»my = Identifier.parse('W4anD0eR96');say ~; # OUTPUT: «W4anD0eR96»
更多有关 语法的文档 可用。
方法§
方法 parse§
method parse(, : = 'TOP', Capture() : = \(), Mu : = Mu, *)
解析 $target,如果它不是 Str,则将其强制转换为 Str,使用 $rule 作为起始规则。如果提供了其他 $args,则将它们传递给起始规则。
say RepeatChar.parse('aaaaaa', :rule('start'), :args(\('a')));say RepeatChar.parse('bbbbbb', :rule('start'), :args(\('b')));# OUTPUT:# 「aaaaaa」# 「bbbbbb」
如果提供了名为 actions 的命名参数,则将其用作动作对象,也就是说,对于每个成功的正则表达式匹配,如果存在同名方法,则在动作对象上调用该方法,并将匹配对象作为唯一的定位参数传递。
my = class ;grammar .parse('ab', :);# OUTPUT: «427»
其他命名参数用作匹配选项,因此你可以指定诸如 :pos(4) 之类的内容,以从第五个(基于 0)字符开始解析。所有 匹配副词 都被允许,但并非所有副词都会生效。正则表达式有几种类型的副词,其中一些在编译时应用,例如 :s 和 :i。你无法将它们传递给 .parse,因为正则表达式已经编译过了。但是,你可以传递那些影响运行时行为的副词,例如 :pos 和 :continue。
say RepeatChar.parse('bbbbbb', :rule('start'), :args(\('b')), :pos(4)).Str;# OUTPUT: «bb»
方法 parse 仅在匹配结束时光标到达目标字符串末尾时才成功。如果你想在中间停止,请使用 方法 subparse。
语法中的顶级正则表达式将被允许回溯。
成功时返回 Match,失败时返回 Nil。
方法 subparse§
method subparse(, : = 'TOP', Capture() : = \(), Mu : = Mu, *)
与 方法 parse 完全相同,除了光标不必到达字符串末尾才能成功。也就是说,它不必匹配整个字符串。
请注意,与 方法 parse 不同,subparse 始终 返回 Match,如果语法未能匹配,则将是失败的匹配(因此为假)。
say RepeatChar.subparse('bbbabb', :rule('start'), :args(\('b')));say RepeatChar.parse( 'bbbabb', :rule('start'), :args(\('b')));say RepeatChar.subparse('bbbabb', :rule('start'), :args(\('a')));say RepeatChar.subparse('bbbabb', :rule('start'), :args(\('a')), :pos(3));# OUTPUT:# 「bbb」# Nil# #<failed match># 「a」
方法 parsefile§
method parsefile(Str(Cool) , :, *)
读取文件 $filename 编码为 $enc,并解析它。所有命名参数都传递给 方法 parse。
say Identifiers.parsefile('users.txt', :enc('UTF-8')).Str.trim.subst(/\n/, ',', :g);# users.txt :# TimToady# lizmat# jnthn# moritz# zoffixznet# MasterDuke17# OUTPUT: «TimToady,lizmat,jnthn,moritz,zoffixznet,MasterDuke17»
类型图§
Grammar 的类型关系