语法的替代版本无法按照我的意愿工作
此代码按照我的意愿解析 $string
:
#! /usr/bin/env raku
my $string = q:to/END/;
aaa bbb # this has trailing spaces which I want to keep
kjkjsdf
kjkdsf
END
grammar Markdown {
token TOP { ^ ([ <blank> | <text> ])+ $ }
token blank { [ \h* <.newline> ] }
token text { <indent> <content> }
token indent { \h* }
token newline { \n }
token content { \N*? <trailing>* <.newline> }
token trailing { \h+ }
}
my $match = Markdown.parse($string);
$match.say;
OUTPUT
「aaa bbb
kjkjsdf
kjkdsf
」
0 => 「aaa bbb
」
text => 「aaa bbb
」
indent => 「」
content => 「aaa bbb
」
trailing => 「 」
0 => 「
」
blank => 「
」
0 => 「 kjkjsdf
」
text => 「 kjkjsdf
」
indent => 「 」
content => 「kjkjsdf
」
0 => 「kjkdsf
」
text => 「kjkdsf
」
indent => 「」
content => 「kjkdsf
」
现在,我遇到的唯一问题是我想要
和
所以我尝试了这个语法:
grammar Markdown {
token TOP { ^ ([ <blank> | <text> ])+ $ }
token blank { [ \h* <.newline> ] }
token text { <indent> <content> <trailing>* <.newline> }
token indent { \h* }
token newline { \n }
token content { \N*? }
token trailing { \h+ }
}
但是,它破坏了解析。所以我尝试了这个:
token TOP { ^ ([ <blank> | <text> ])+ $ }
token blank { [ \h* <.newline> ] }
token text { <indent> <content>*? <trailing>* <.newline> }
token indent { \h* }
token newline { \n }
token content { \N }
token trailing { \h+ }
得到:
0 => 「aaa bbb
」
text => 「aaa bbb
」
indent => 「」
content => 「a」
content => 「a」
content => 「a」
content => 「 」
content => 「b」
content => 「b」
content => 「b」
trailing => 「 」
0 => 「
」
blank => 「
」
0 => 「 kjkjsdf
」
text => 「 kjkjsdf
」
indent => 「 」
content => 「k」
content => 「j」
content => 「k」
content => 「j」
content => 「s」
content => 「d」
content => 「f」
0 => 「kjkdsf
」
text => 「kjkdsf
」
indent => 「」
content => 「k」
content => 「j」
content => 「k」
content => 「d」
content => 「s」
content => 「f」
这与我想要的非常接近,但它具有将 $match
对象来很容易地解决这个问题,但我想尝试提高我的语法技能。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
快速而肮脏的
前瞻断言
需要一些重构
quick and dirty
lookahead assertions
a little refactoring
我能够通过否定前瞻断言来完成我想要的事情:
<.non_trailing>
抑制单个字符出现在匹配对象和中。 )+ \S*
位将匹配后面不跟空格和新行的任何字符,并且\S*
位获取否定前瞻留下的字符。输出
I was able to accomplish what I want with a negative lookahead assertion:
The
<.non_trailing>
suppresses the individual characters from appearing in the match object and the. <!before \w \h* \n>)+ \S*
bit will match any character not followed by white space and a new line and the\S*
bit gets the character left over from the negative lookahead.OUTPUT